7#if V8_TARGET_ARCH_LOONG64
26 if (cross_compile)
return;
46 const int kNumbers[] = {
80 return kNumbers[
reg.code()];
86 zero_reg, ra, tp,
sp, a0, a1, a2, a3, a4, a5, a6, a7, t0, t1, t2, t3,
87 t4, t5, t6, t7, t8, x_reg, fp, s0, s1, s2, s3, s4, s5, s6, s7, s8};
88 return kRegisters[num];
110 return static_cast<uint32_t
>(
119 : rm_(
no_reg), rmode_(RelocInfo::FULL_EMBEDDED_OBJECT) {
120 value_.immediate =
static_cast<intptr_t
>(
handle.address());
123Operand Operand::EmbeddedNumber(
double value) {
126 Operand
result(0, RelocInfo::FULL_EMBEDDED_OBJECT);
127 result.is_heap_number_request_ =
true;
128 result.value_.heap_number_request = HeapNumberRequest(value);
132MemOperand::MemOperand(Register
base, int32_t
offset)
135MemOperand::MemOperand(Register
base, Register index)
138void Assembler::AllocateAndInstallRequestedHeapNumbers(LocalIsolate* isolate) {
139 DCHECK_IMPLIES(isolate ==
nullptr, heap_number_requests_.empty());
140 for (
auto& request : heap_number_requests_) {
141 Handle<HeapObject> object;
142 object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
143 request.heap_number());
145 EmbeddedObjectIndex index = AddEmbeddedObject(
object);
146 if (IsLu32i_d(instr_at(
pc + 2 * kInstrSize))) {
147 set_target_value_at(
pc,
static_cast<uint64_t
>(index));
149 set_target_compressed_value_at(
pc,
static_cast<uint32_t
>(index));
157Assembler::Assembler(
const AssemblerOptions& options,
158 std::unique_ptr<AssemblerBuffer> buffer)
159 : AssemblerBase(options,
std::move(buffer)),
160 scratch_register_list_({t6, t7, t8}),
161 scratch_fpregister_list_({f31}) {
162 reloc_info_writer.Reposition(buffer_start_ +
buffer_->size(),
pc_);
164 last_trampoline_pool_end_ = 0;
165 no_trampoline_pool_before_ = 0;
166 trampoline_pool_blocked_nesting_ = 0;
169 next_buffer_check_ =
v8_flags.force_long_branches
171 : kMax16BranchOffset - kTrampolineSlotsSize * 16;
172 internal_trampoline_exception_ =
false;
175 trampoline_emitted_ =
v8_flags.force_long_branches;
176 unbound_labels_count_ = 0;
177 block_buffer_growth_ =
false;
180void Assembler::GetCode(Isolate* isolate, CodeDesc* desc) {
181 GetCode(isolate->main_thread_local_isolate(), desc);
183void Assembler::GetCode(LocalIsolate* isolate, CodeDesc* desc,
184 SafepointTableBuilderBase* safepoint_table_builder,
185 int handler_table_offset) {
193 DataAlign(InstructionStream::kMetadataAlignment);
197 int code_comments_size = WriteCodeComments();
201 AllocateAndInstallRequestedHeapNumbers(isolate);
207 static constexpr int kConstantPoolSize = 0;
208 static constexpr int kBuiltinJumpTableInfoSize = 0;
209 const int instruction_size =
pc_offset();
210 const int builtin_jump_table_info_offset =
211 instruction_size - kBuiltinJumpTableInfoSize;
212 const int code_comments_offset =
213 builtin_jump_table_info_offset - code_comments_size;
214 const int constant_pool_offset = code_comments_offset - kConstantPoolSize;
215 const int handler_table_offset2 = (handler_table_offset == kNoHandlerTable)
216 ? constant_pool_offset
217 : handler_table_offset;
218 const int safepoint_table_offset =
219 (safepoint_table_builder == kNoSafepointTable)
220 ? handler_table_offset2
221 : safepoint_table_builder->safepoint_table_offset();
222 const int reloc_info_offset =
223 static_cast<int>(reloc_info_writer.pos() -
buffer_->start());
224 CodeDesc::Initialize(desc,
this, safepoint_table_offset,
225 handler_table_offset2, constant_pool_offset,
226 code_comments_offset, builtin_jump_table_info_offset,
230void Assembler::Align(
int m) {
233 DCHECK(
m >= kInstrSize && base::bits::IsPowerOfTwo(
m));
239void Assembler::CodeTargetAlign() {
246 return Register::from_code((
instr & kRkFieldMask) >> kRkShift);
250 return Register::from_code((
instr & kRjFieldMask) >> kRjShift);
254 return Register::from_code((
instr & kRdFieldMask) >> kRdShift);
257uint32_t Assembler::GetRk(Instr
instr) {
263uint32_t Assembler::GetRj(Instr
instr) {
269uint32_t Assembler::GetRd(Instr
instr) {
275uint32_t Assembler::GetSa2(Instr
instr) {
281uint32_t Assembler::GetSa3(Instr
instr) {
306bool Assembler::IsBranch(Instr
instr) {
307 uint32_t opcode = (
instr >> 26) << 26;
309 bool isBranch = opcode ==
BEQZ || opcode ==
BNEZ || opcode ==
BCZ ||
310 opcode ==
B || opcode ==
BL || opcode ==
BEQ ||
311 opcode ==
BNE || opcode ==
BLT || opcode ==
BGE ||
316bool Assembler::IsB(Instr
instr) {
317 uint32_t opcode = (
instr >> 26) << 26;
319 bool isBranch = opcode ==
B || opcode ==
BL;
323bool Assembler::IsBz(Instr
instr) {
324 uint32_t opcode = (
instr >> 26) << 26;
326 bool isBranch = opcode ==
BEQZ || opcode ==
BNEZ || opcode ==
BCZ;
330bool Assembler::IsEmittedConstant(Instr
instr) {
332 uint32_t label_constant =
instr & ~kImm16Mask;
333 return label_constant == 0;
336bool Assembler::IsJ(Instr
instr) {
337 uint32_t opcode = (
instr >> 26) << 26;
339 return opcode ==
JIRL;
342bool Assembler::IsLu12i_w(Instr
instr) {
343 uint32_t opcode = (
instr >> 25) << 25;
347bool Assembler::IsOri(Instr
instr) {
348 uint32_t opcode = (
instr >> 22) << 22;
349 return opcode ==
ORI;
352bool Assembler::IsLu32i_d(Instr
instr) {
353 uint32_t opcode = (
instr >> 25) << 25;
357bool Assembler::IsLu52i_d(Instr
instr) {
358 uint32_t opcode = (
instr >> 22) << 22;
362bool Assembler::IsMov(Instr
instr, Register rd, Register rj) {
366 return instr == instr1;
369bool Assembler::IsPcAddi(Instr
instr) {
370 uint32_t opcode = (
instr >> 25) << 25;
374bool Assembler::IsNop(Instr
instr,
unsigned int type) {
381 return instr == instr1;
385 Assembler::OffsetSize bits) {
389 }
else if (bits == 21) {
390 uint32_t low16 =
instr << 6;
396 uint32_t low16 =
instr << 6;
406static Assembler::OffsetSize OffsetSizeInBits(Instr
instr) {
407 if (Assembler::IsB(
instr)) {
408 return Assembler::OffsetSize::kOffset26;
409 }
else if (Assembler::IsBz(
instr)) {
410 return Assembler::OffsetSize::kOffset21;
413 return Assembler::OffsetSize::kOffset16;
418 Assembler::OffsetSize bits = OffsetSizeInBits(
instr);
422 if (imm == kEndOfChain) {
433int Assembler::target_at(
int pos,
bool is_internal) {
435 int64_t* p =
reinterpret_cast<int64_t*
>(buffer_start_ +
pos);
436 int64_t address = *p;
437 if (address == kEndOfJumpChain) {
440 int64_t instr_address =
reinterpret_cast<int64_t
>(p);
441 DCHECK(instr_address - address < INT_MAX);
442 int delta =
static_cast<int>(instr_address - address);
450 if ((
instr & ~kImm16Mask) == 0) {
456 return (imm18 +
pos);
464 if (IsBranch(
instr)) {
466 }
else if (IsPcAddi(
instr)) {
470 if (si20 == kEndOfJumpChain) {
474 return pos + (si20 << 2);
480static inline Instr SetBranchOffset(int32_t
pos, int32_t target_pos,
493 }
else if (bits == 21) {
497 int32_t hi5 = (imm >> 16) & 0x1f;
498 return instr | low16 | hi5;
504 int32_t hi10 = (imm >> 16) & 0x3ff;
505 return instr | low16 | hi10;
509void Assembler::target_at_put(
int pos,
int target_pos,
bool is_internal) {
511 uint64_t imm =
reinterpret_cast<uint64_t
>(buffer_start_) + target_pos;
512 *
reinterpret_cast<uint64_t*
>(buffer_start_ +
pos) = imm;
516 if ((
instr & ~kImm16Mask) == 0) {
517 DCHECK(target_pos == kEndOfChain || target_pos >= 0);
521 pos, target_pos + (InstructionStream::kHeaderSize - kHeapObjectTag));
525 if (IsPcAddi(
instr)) {
530 uint32_t siMask = 0xfffff <<
kRjShift;
531 uint32_t si20 = ((imm >> 2) <<
kRjShift) & siMask;
542void Assembler::print(
const Label* L) {
543 if (
L->is_unused()) {
545 }
else if (
L->is_bound()) {
546 PrintF(
"bound label to %d\n",
L->pos());
547 }
else if (
L->is_linked()) {
551 while (l.is_linked()) {
554 if ((
instr & ~kImm16Mask) == 0) {
559 next(&l, is_internal_reference(&l));
562 PrintF(
"label in inconsistent state (pos = %d)\n",
L->pos_);
566void Assembler::bind_to(Label* L,
int pos) {
568 int trampoline_pos = kInvalidSlotPos;
569 bool is_internal =
false;
570 if (
L->is_linked() && !trampoline_emitted_) {
571 unbound_labels_count_--;
572 if (!is_internal_reference(L)) {
573 next_buffer_check_ += kTrampolineSlotsSize;
577 while (
L->is_linked()) {
578 int fixup_pos =
L->pos();
579 int dist =
pos - fixup_pos;
580 is_internal = is_internal_reference(L);
581 next(L, is_internal);
585 target_at_put(fixup_pos,
pos, is_internal);
587 if (IsBranch(
instr)) {
588 int branch_offset = BranchOffset(
instr);
589 if (dist > branch_offset) {
590 if (trampoline_pos == kInvalidSlotPos) {
591 trampoline_pos = get_trampoline_entry(fixup_pos);
592 CHECK_NE(trampoline_pos, kInvalidSlotPos);
594 CHECK((trampoline_pos - fixup_pos) <= branch_offset);
595 target_at_put(fixup_pos, trampoline_pos,
false);
596 fixup_pos = trampoline_pos;
598 target_at_put(fixup_pos,
pos,
false);
602 target_at_put(fixup_pos,
pos,
false);
610 if (
pos > last_bound_pos_) last_bound_pos_ =
pos;
613void Assembler::bind(Label* L) {
618void Assembler::next(Label* L,
bool is_internal) {
620 int link = target_at(
L->pos(), is_internal);
621 if (link == kEndOfChain) {
623 }
else if (link == -4) {
632bool Assembler::is_near_c(Label* L) {
637bool Assembler::is_near(Label* L, OffsetSize bits) {
640 (1 << (bits + 2 - 1)) - 1 - 5 * kInstrSize);
643bool Assembler::is_near_a(Label* L) {
648int Assembler::BranchOffset(Instr
instr) {
649 int bits = OffsetSize::kOffset16;
651 uint32_t opcode = (
instr >> 26) << 26;
655 bits = OffsetSize::kOffset26;
660 bits = OffsetSize::kOffset21;
669 bits = OffsetSize::kOffset16;
675 return (1 << (bits + 2 - 1)) - 1;
682bool Assembler::MustUseReg(RelocInfo::Mode rmode) {
683 return !RelocInfo::IsNoInfo(rmode);
686void Assembler::GenB(Opcode opcode, Register rj, int32_t si21) {
687 BlockTrampolinePoolScope block_trampoline_pool(
this);
688 DCHECK((BEQZ == opcode || BNEZ == opcode) && is_int21(si21) && rj.is_valid());
690 (rj.code() << kRjShift) | ((si21 & 0x1fffff) >> 16);
694void Assembler::GenB(Opcode opcode, CFRegister cj, int32_t si21,
bool isEq) {
695 BlockTrampolinePoolScope block_trampoline_pool(
this);
696 DCHECK(BCZ == opcode && is_int21(si21));
697 DCHECK(cj >= 0 && cj <= 7);
698 int32_t sc = (isEq ? cj : cj + 8);
700 ((si21 & 0x1fffff) >> 16);
704void Assembler::GenB(Opcode opcode, int32_t si26) {
705 BlockTrampolinePoolScope block_trampoline_pool(
this);
706 DCHECK((B == opcode || BL == opcode) && is_int26(si26));
712void Assembler::GenBJ(Opcode opcode, Register rj, Register rd, int32_t si16) {
713 BlockTrampolinePoolScope block_trampoline_pool(
this);
716 (rj.code() << kRjShift) | rd.code();
720void Assembler::GenCmp(Opcode opcode, FPUCondition cond, FPURegister fk,
721 FPURegister fj, CFRegister cd) {
722 DCHECK(opcode == FCMP_COND_S || opcode == FCMP_COND_D);
724 (fj.code() << kFjShift) | cd;
728void Assembler::GenSel(Opcode opcode, CFRegister ca, FPURegister fk,
729 FPURegister fj, FPURegister rd) {
732 (fj.code() << kFjShift) | rd.code();
736void Assembler::GenRegister(Opcode opcode, Register rj, Register rd,
740 instr = opcode | (rj.code() << kRjShift) | rd.code();
744void Assembler::GenRegister(Opcode opcode, FPURegister fj, FPURegister fd) {
745 Instr instr = opcode | (fj.code() << kFjShift) | fd.code();
749void Assembler::GenRegister(Opcode opcode, Register rj, FPURegister fd) {
750 DCHECK((opcode == MOVGR2FR_W) || (opcode == MOVGR2FR_D) ||
751 (opcode == MOVGR2FRH_W));
752 Instr instr = opcode | (rj.code() << kRjShift) | fd.code();
756void Assembler::GenRegister(Opcode opcode, FPURegister fj, Register rd) {
757 DCHECK((opcode == MOVFR2GR_S) || (opcode == MOVFR2GR_D) ||
758 (opcode == MOVFRH2GR_S));
759 Instr instr = opcode | (fj.code() << kFjShift) | rd.code();
763void Assembler::GenRegister(Opcode opcode, Register rj, FPUControlRegister fd) {
764 DCHECK((opcode == MOVGR2FCSR));
765 Instr instr = opcode | (rj.code() << kRjShift) | fd.code();
769void Assembler::GenRegister(Opcode opcode, FPUControlRegister fj, Register rd) {
770 DCHECK((opcode == MOVFCSR2GR));
771 Instr instr = opcode | (fj.code() << kFjShift) | rd.code();
775void Assembler::GenRegister(Opcode opcode, FPURegister fj, CFRegister cd) {
776 DCHECK((opcode == MOVFR2CF));
777 Instr instr = opcode | (fj.code() << kFjShift) | cd;
781void Assembler::GenRegister(Opcode opcode, CFRegister cj, FPURegister fd) {
782 DCHECK((opcode == MOVCF2FR));
787void Assembler::GenRegister(Opcode opcode, Register rj, CFRegister cd) {
788 DCHECK((opcode == MOVGR2CF));
789 Instr instr = opcode | (rj.code() << kRjShift) | cd;
793void Assembler::GenRegister(Opcode opcode, CFRegister cj, Register rd) {
794 DCHECK((opcode == MOVCF2GR));
799void Assembler::GenRegister(Opcode opcode, Register rk, Register rj,
802 opcode | (rk.code() << kRkShift) | (rj.code() << kRjShift) | rd.code();
806void Assembler::GenRegister(Opcode opcode, FPURegister fk, FPURegister fj,
809 opcode | (fk.code() << kFkShift) | (fj.code() << kFjShift) | fd.code();
813void Assembler::GenRegister(Opcode opcode, FPURegister fa, FPURegister fk,
814 FPURegister fj, FPURegister fd) {
815 Instr instr = opcode | (fa.code() << kFaShift) | (fk.code() << kFkShift) |
816 (fj.code() << kFjShift) | fd.code();
820void Assembler::GenRegister(Opcode opcode, Register rk, Register rj,
823 opcode | (rk.code() << kRkShift) | (rj.code() << kRjShift) | fd.code();
827void Assembler::GenImm(Opcode opcode, int32_t bit3, Register rk, Register rj,
830 Instr instr = opcode | (bit3 & 0x7) << kSaShift | (rk.code() << kRkShift) |
831 (rj.code() << kRjShift) | rd.code();
835void Assembler::GenImm(Opcode opcode, int32_t bit6m, int32_t bit6l, Register rj,
837 DCHECK(is_uint6(bit6m) && is_uint6(bit6l));
839 (rj.code() << kRjShift) | rd.code();
843void Assembler::GenImm(Opcode opcode, int32_t bit20, Register rd) {
845 Instr instr = opcode | (bit20 & 0xfffff) << kRjShift | rd.code();
849void Assembler::GenImm(Opcode opcode, int32_t bit15) {
855void Assembler::GenImm(Opcode opcode, int32_t value, Register rj, Register rd,
856 int32_t value_bits) {
857 DCHECK(value_bits == 6 || value_bits == 12 || value_bits == 14 ||
859 uint32_t imm = value & 0x3f;
860 if (value_bits == 12) {
862 }
else if (value_bits == 14) {
863 imm = value & 0x3fff;
864 }
else if (value_bits == 16) {
871void Assembler::GenImm(Opcode opcode, int32_t bit12, Register rj,
875 (rj.code() << kRjShift) | fd.code();
880int32_t Assembler::get_trampoline_entry(int32_t
pos) {
881 int32_t trampoline_entry = kInvalidSlotPos;
882 if (!internal_trampoline_exception_) {
883 if (trampoline_.start() >
pos) {
884 trampoline_entry = trampoline_.take_slot();
887 if (kInvalidSlotPos == trampoline_entry) {
888 internal_trampoline_exception_ =
true;
891 return trampoline_entry;
894uint64_t Assembler::jump_address(Label* L) {
897 target_pos =
L->pos();
899 if (
L->is_linked()) {
900 target_pos =
L->pos();
907 uint64_t imm =
reinterpret_cast<uint64_t
>(buffer_start_) + target_pos;
913uint64_t Assembler::branch_long_offset(Label* L) {
917 target_pos =
L->pos();
919 if (
L->is_linked()) {
920 target_pos =
L->pos();
930 return static_cast<uint64_t
>(
offset);
933int32_t Assembler::branch_offset_helper(Label* L, OffsetSize bits) {
937 target_pos =
L->pos();
939 if (
L->is_linked()) {
940 target_pos =
L->pos();
944 if (!trampoline_emitted_) {
945 unbound_labels_count_++;
946 next_buffer_check_ -= kTrampolineSlotsSize;
959void Assembler::label_at_put(Label* L,
int at_offset) {
962 target_pos =
L->pos();
963 instr_at_put(at_offset, target_pos + (InstructionStream::kHeaderSize -
966 if (
L->is_linked()) {
967 target_pos =
L->pos();
968 int32_t imm18 = target_pos - at_offset;
972 instr_at_put(at_offset, (imm16 & kImm16Mask));
975 instr_at_put(at_offset, 0);
976 if (!trampoline_emitted_) {
977 unbound_labels_count_++;
978 next_buffer_check_ -= kTrampolineSlotsSize;
981 L->link_to(at_offset);
991void Assembler::beq(Register rj, Register rd, int32_t
offset) {
992 GenBJ(BEQ, rj, rd,
offset);
995void Assembler::bne(Register rj, Register rd, int32_t
offset) {
996 GenBJ(BNE, rj, rd,
offset);
999void Assembler::blt(Register rj, Register rd, int32_t
offset) {
1000 GenBJ(BLT, rj, rd,
offset);
1003void Assembler::bge(Register rj, Register rd, int32_t
offset) {
1004 GenBJ(BGE, rj, rd,
offset);
1007void Assembler::bltu(Register rj, Register rd, int32_t
offset) {
1008 GenBJ(BLTU, rj, rd,
offset);
1011void Assembler::bgeu(Register rj, Register rd, int32_t
offset) {
1012 GenBJ(BGEU, rj, rd,
offset);
1015void Assembler::beqz(Register rj, int32_t
offset) { GenB(BEQZ, rj,
offset); }
1016void Assembler::bnez(Register rj, int32_t
offset) { GenB(BNEZ, rj,
offset); }
1018void Assembler::jirl(Register rd, Register rj, int32_t
offset) {
1019 GenBJ(JIRL, rj, rd,
offset);
1022void Assembler::bceqz(CFRegister cj, int32_t si21) {
1023 GenB(BCZ, cj, si21,
true);
1026void Assembler::bcnez(CFRegister cj, int32_t si21) {
1027 GenB(BCZ, cj, si21,
false);
1033void Assembler::add_w(Register rd, Register rj, Register rk) {
1034 GenRegister(ADD_W, rk, rj, rd);
1037void Assembler::add_d(Register rd, Register rj, Register rk) {
1038 GenRegister(ADD_D, rk, rj, rd);
1041void Assembler::sub_w(Register rd, Register rj, Register rk) {
1042 GenRegister(SUB_W, rk, rj, rd);
1045void Assembler::sub_d(Register rd, Register rj, Register rk) {
1046 GenRegister(SUB_D, rk, rj, rd);
1049void Assembler::addi_w(Register rd, Register rj, int32_t si12) {
1050 GenImm(ADDI_W, si12, rj, rd, 12);
1053void Assembler::addi_d(Register rd, Register rj, int32_t si12) {
1054 GenImm(ADDI_D, si12, rj, rd, 12);
1057void Assembler::addu16i_d(Register rd, Register rj, int32_t si16) {
1058 GenImm(ADDU16I_D, si16, rj, rd, 16);
1061void Assembler::alsl_w(Register rd, Register rj, Register rk, int32_t sa2) {
1062 DCHECK(is_uint2(sa2 - 1));
1063 GenImm(ALSL_W, sa2 - 1, rk, rj, rd);
1066void Assembler::alsl_wu(Register rd, Register rj, Register rk, int32_t sa2) {
1067 DCHECK(is_uint2(sa2 - 1));
1068 GenImm(ALSL_WU, sa2 + 3, rk, rj, rd);
1071void Assembler::alsl_d(Register rd, Register rj, Register rk, int32_t sa2) {
1072 DCHECK(is_uint2(sa2 - 1));
1073 GenImm(ALSL_D, sa2 - 1, rk, rj, rd);
1076void Assembler::lu12i_w(Register rd, int32_t si20) {
1077 GenImm(LU12I_W, si20, rd);
1080void Assembler::lu32i_d(Register rd, int32_t si20) {
1081 GenImm(LU32I_D, si20, rd);
1084void Assembler::lu52i_d(Register rd, Register rj, int32_t si12) {
1085 GenImm(LU52I_D, si12, rj, rd, 12);
1088void Assembler::slt(Register rd, Register rj, Register rk) {
1089 GenRegister(SLT, rk, rj, rd);
1092void Assembler::sltu(Register rd, Register rj, Register rk) {
1093 GenRegister(SLTU, rk, rj, rd);
1096void Assembler::slti(Register rd, Register rj, int32_t si12) {
1097 GenImm(SLTI, si12, rj, rd, 12);
1100void Assembler::sltui(Register rd, Register rj, int32_t si12) {
1101 GenImm(SLTUI, si12, rj, rd, 12);
1104void Assembler::pcaddi(Register rd, int32_t si20) { GenImm(PCADDI, si20, rd); }
1106void Assembler::pcaddu12i(Register rd, int32_t si20) {
1107 GenImm(PCADDU12I, si20, rd);
1110void Assembler::pcaddu18i(Register rd, int32_t si20) {
1111 GenImm(PCADDU18I, si20, rd);
1114void Assembler::pcalau12i(Register rd, int32_t si20) {
1115 GenImm(PCALAU12I, si20, rd);
1118void Assembler::and_(Register rd, Register rj, Register rk) {
1119 GenRegister(AND, rk, rj, rd);
1122void Assembler::or_(Register rd, Register rj, Register rk) {
1123 GenRegister(OR, rk, rj, rd);
1126void Assembler::xor_(Register rd, Register rj, Register rk) {
1127 GenRegister(XOR, rk, rj, rd);
1130void Assembler::nor(Register rd, Register rj, Register rk) {
1131 GenRegister(NOR, rk, rj, rd);
1134void Assembler::andn(Register rd, Register rj, Register rk) {
1135 GenRegister(ANDN, rk, rj, rd);
1138void Assembler::orn(Register rd, Register rj, Register rk) {
1139 GenRegister(ORN, rk, rj, rd);
1142void Assembler::andi(Register rd, Register rj, int32_t ui12) {
1143 GenImm(ANDI, ui12, rj, rd, 12);
1146void Assembler::ori(Register rd, Register rj, int32_t ui12) {
1147 GenImm(ORI, ui12, rj, rd, 12);
1150void Assembler::xori(Register rd, Register rj, int32_t ui12) {
1151 GenImm(XORI, ui12, rj, rd, 12);
1154void Assembler::mul_w(Register rd, Register rj, Register rk) {
1155 GenRegister(MUL_W, rk, rj, rd);
1158void Assembler::mulh_w(Register rd, Register rj, Register rk) {
1159 GenRegister(MULH_W, rk, rj, rd);
1162void Assembler::mulh_wu(Register rd, Register rj, Register rk) {
1163 GenRegister(MULH_WU, rk, rj, rd);
1166void Assembler::mul_d(Register rd, Register rj, Register rk) {
1167 GenRegister(MUL_D, rk, rj, rd);
1170void Assembler::mulh_d(Register rd, Register rj, Register rk) {
1171 GenRegister(MULH_D, rk, rj, rd);
1174void Assembler::mulh_du(Register rd, Register rj, Register rk) {
1175 GenRegister(MULH_DU, rk, rj, rd);
1178void Assembler::mulw_d_w(Register rd, Register rj, Register rk) {
1179 GenRegister(MULW_D_W, rk, rj, rd);
1182void Assembler::mulw_d_wu(Register rd, Register rj, Register rk) {
1183 GenRegister(MULW_D_WU, rk, rj, rd);
1186void Assembler::div_w(Register rd, Register rj, Register rk) {
1187 GenRegister(DIV_W, rk, rj, rd);
1190void Assembler::mod_w(Register rd, Register rj, Register rk) {
1191 GenRegister(MOD_W, rk, rj, rd);
1194void Assembler::div_wu(Register rd, Register rj, Register rk) {
1195 GenRegister(DIV_WU, rk, rj, rd);
1198void Assembler::mod_wu(Register rd, Register rj, Register rk) {
1199 GenRegister(MOD_WU, rk, rj, rd);
1202void Assembler::div_d(Register rd, Register rj, Register rk) {
1203 GenRegister(DIV_D, rk, rj, rd);
1206void Assembler::mod_d(Register rd, Register rj, Register rk) {
1207 GenRegister(MOD_D, rk, rj, rd);
1210void Assembler::div_du(Register rd, Register rj, Register rk) {
1211 GenRegister(DIV_DU, rk, rj, rd);
1214void Assembler::mod_du(Register rd, Register rj, Register rk) {
1215 GenRegister(MOD_DU, rk, rj, rd);
1219void Assembler::sll_w(Register rd, Register rj, Register rk) {
1220 GenRegister(SLL_W, rk, rj, rd);
1223void Assembler::srl_w(Register rd, Register rj, Register rk) {
1224 GenRegister(SRL_W, rk, rj, rd);
1227void Assembler::sra_w(Register rd, Register rj, Register rk) {
1228 GenRegister(SRA_W, rk, rj, rd);
1231void Assembler::rotr_w(Register rd, Register rj, Register rk) {
1232 GenRegister(ROTR_W, rk, rj, rd);
1235void Assembler::slli_w(Register rd, Register rj, int32_t ui5) {
1237 GenImm(SLLI_W, ui5 + 0x20, rj, rd, 6);
1240void Assembler::srli_w(Register rd, Register rj, int32_t ui5) {
1242 GenImm(SRLI_W, ui5 + 0x20, rj, rd, 6);
1245void Assembler::srai_w(Register rd, Register rj, int32_t ui5) {
1247 GenImm(SRAI_W, ui5 + 0x20, rj, rd, 6);
1250void Assembler::rotri_w(Register rd, Register rj, int32_t ui5) {
1252 GenImm(ROTRI_W, ui5 + 0x20, rj, rd, 6);
1255void Assembler::sll_d(Register rd, Register rj, Register rk) {
1256 GenRegister(SLL_D, rk, rj, rd);
1259void Assembler::srl_d(Register rd, Register rj, Register rk) {
1260 GenRegister(SRL_D, rk, rj, rd);
1263void Assembler::sra_d(Register rd, Register rj, Register rk) {
1264 GenRegister(SRA_D, rk, rj, rd);
1267void Assembler::rotr_d(Register rd, Register rj, Register rk) {
1268 GenRegister(ROTR_D, rk, rj, rd);
1271void Assembler::slli_d(Register rd, Register rj, int32_t ui6) {
1272 GenImm(SLLI_D, ui6, rj, rd, 6);
1275void Assembler::srli_d(Register rd, Register rj, int32_t ui6) {
1276 GenImm(SRLI_D, ui6, rj, rd, 6);
1279void Assembler::srai_d(Register rd, Register rj, int32_t ui6) {
1280 GenImm(SRAI_D, ui6, rj, rd, 6);
1283void Assembler::rotri_d(Register rd, Register rj, int32_t ui6) {
1284 GenImm(ROTRI_D, ui6, rj, rd, 6);
1288void Assembler::ext_w_b(Register rd, Register rj) {
1289 GenRegister(EXT_W_B, rj, rd);
1292void Assembler::ext_w_h(Register rd, Register rj) {
1293 GenRegister(EXT_W_H, rj, rd);
1296void Assembler::clo_w(Register rd, Register rj) { GenRegister(CLO_W, rj, rd); }
1298void Assembler::clz_w(Register rd, Register rj) { GenRegister(CLZ_W, rj, rd); }
1300void Assembler::cto_w(Register rd, Register rj) { GenRegister(CTO_W, rj, rd); }
1302void Assembler::ctz_w(Register rd, Register rj) { GenRegister(CTZ_W, rj, rd); }
1304void Assembler::clo_d(Register rd, Register rj) { GenRegister(CLO_D, rj, rd); }
1306void Assembler::clz_d(Register rd, Register rj) { GenRegister(CLZ_D, rj, rd); }
1308void Assembler::cto_d(Register rd, Register rj) { GenRegister(CTO_D, rj, rd); }
1310void Assembler::ctz_d(Register rd, Register rj) { GenRegister(CTZ_D, rj, rd); }
1312void Assembler::bytepick_w(Register rd, Register rj, Register rk, int32_t sa2) {
1314 GenImm(BYTEPICK_W, sa2, rk, rj, rd);
1317void Assembler::bytepick_d(Register rd, Register rj, Register rk, int32_t sa3) {
1318 GenImm(BYTEPICK_D, sa3, rk, rj, rd);
1321void Assembler::revb_2h(Register rd, Register rj) {
1322 GenRegister(REVB_2H, rj, rd);
1325void Assembler::revb_4h(Register rd, Register rj) {
1326 GenRegister(REVB_4H, rj, rd);
1329void Assembler::revb_2w(Register rd, Register rj) {
1330 GenRegister(REVB_2W, rj, rd);
1333void Assembler::revb_d(Register rd, Register rj) {
1334 GenRegister(REVB_D, rj, rd);
1337void Assembler::revh_2w(Register rd, Register rj) {
1338 GenRegister(REVH_2W, rj, rd);
1341void Assembler::revh_d(Register rd, Register rj) {
1342 GenRegister(REVH_D, rj, rd);
1345void Assembler::bitrev_4b(Register rd, Register rj) {
1346 GenRegister(BITREV_4B, rj, rd);
1349void Assembler::bitrev_8b(Register rd, Register rj) {
1350 GenRegister(BITREV_8B, rj, rd);
1353void Assembler::bitrev_w(Register rd, Register rj) {
1354 GenRegister(BITREV_W, rj, rd);
1357void Assembler::bitrev_d(Register rd, Register rj) {
1358 GenRegister(BITREV_D, rj, rd);
1361void Assembler::bstrins_w(Register rd, Register rj, int32_t msbw,
1363 DCHECK(is_uint5(msbw) && is_uint5(lsbw));
1364 GenImm(BSTR_W, msbw + 0x20, lsbw, rj, rd);
1367void Assembler::bstrins_d(Register rd, Register rj, int32_t msbd,
1369 GenImm(BSTRINS_D, msbd, lsbd, rj, rd);
1372void Assembler::bstrpick_w(Register rd, Register rj, int32_t msbw,
1374 DCHECK(is_uint5(msbw) && is_uint5(lsbw));
1375 GenImm(BSTR_W, msbw + 0x20, lsbw + 0x20, rj, rd);
1378void Assembler::bstrpick_d(Register rd, Register rj, int32_t msbd,
1380 GenImm(BSTRPICK_D, msbd, lsbd, rj, rd);
1383void Assembler::maskeqz(Register rd, Register rj, Register rk) {
1384 GenRegister(MASKEQZ, rk, rj, rd);
1387void Assembler::masknez(Register rd, Register rj, Register rk) {
1388 GenRegister(MASKNEZ, rk, rj, rd);
1392void Assembler::ld_b(Register rd, Register rj, int32_t si12) {
1393 GenImm(LD_B, si12, rj, rd, 12);
1396void Assembler::ld_h(Register rd, Register rj, int32_t si12) {
1397 GenImm(LD_H, si12, rj, rd, 12);
1400void Assembler::ld_w(Register rd, Register rj, int32_t si12) {
1401 GenImm(LD_W, si12, rj, rd, 12);
1404void Assembler::ld_d(Register rd, Register rj, int32_t si12) {
1405 GenImm(LD_D, si12, rj, rd, 12);
1408void Assembler::ld_bu(Register rd, Register rj, int32_t si12) {
1409 GenImm(LD_BU, si12, rj, rd, 12);
1412void Assembler::ld_hu(Register rd, Register rj, int32_t si12) {
1413 GenImm(LD_HU, si12, rj, rd, 12);
1416void Assembler::ld_wu(Register rd, Register rj, int32_t si12) {
1417 GenImm(LD_WU, si12, rj, rd, 12);
1420void Assembler::st_b(Register rd, Register rj, int32_t si12) {
1421 GenImm(ST_B, si12, rj, rd, 12);
1424void Assembler::st_h(Register rd, Register rj, int32_t si12) {
1425 GenImm(ST_H, si12, rj, rd, 12);
1428void Assembler::st_w(Register rd, Register rj, int32_t si12) {
1429 GenImm(ST_W, si12, rj, rd, 12);
1432void Assembler::st_d(Register rd, Register rj, int32_t si12) {
1433 GenImm(ST_D, si12, rj, rd, 12);
1436void Assembler::ldx_b(Register rd, Register rj, Register rk) {
1437 GenRegister(LDX_B, rk, rj, rd);
1440void Assembler::ldx_h(Register rd, Register rj, Register rk) {
1441 GenRegister(LDX_H, rk, rj, rd);
1444void Assembler::ldx_w(Register rd, Register rj, Register rk) {
1445 GenRegister(LDX_W, rk, rj, rd);
1448void Assembler::ldx_d(Register rd, Register rj, Register rk) {
1449 GenRegister(LDX_D, rk, rj, rd);
1452void Assembler::ldx_bu(Register rd, Register rj, Register rk) {
1453 GenRegister(LDX_BU, rk, rj, rd);
1456void Assembler::ldx_hu(Register rd, Register rj, Register rk) {
1457 GenRegister(LDX_HU, rk, rj, rd);
1460void Assembler::ldx_wu(Register rd, Register rj, Register rk) {
1461 GenRegister(LDX_WU, rk, rj, rd);
1464void Assembler::stx_b(Register rd, Register rj, Register rk) {
1465 GenRegister(STX_B, rk, rj, rd);
1468void Assembler::stx_h(Register rd, Register rj, Register rk) {
1469 GenRegister(STX_H, rk, rj, rd);
1472void Assembler::stx_w(Register rd, Register rj, Register rk) {
1473 GenRegister(STX_W, rk, rj, rd);
1476void Assembler::stx_d(Register rd, Register rj, Register rk) {
1477 GenRegister(STX_D, rk, rj, rd);
1480void Assembler::ldptr_w(Register rd, Register rj, int32_t si14) {
1481 DCHECK(is_int16(si14) && ((si14 & 0x3) == 0));
1482 GenImm(LDPTR_W, si14 >> 2, rj, rd, 14);
1485void Assembler::ldptr_d(Register rd, Register rj, int32_t si14) {
1486 DCHECK(is_int16(si14) && ((si14 & 0x3) == 0));
1487 GenImm(LDPTR_D, si14 >> 2, rj, rd, 14);
1490void Assembler::stptr_w(Register rd, Register rj, int32_t si14) {
1491 DCHECK(is_int16(si14) && ((si14 & 0x3) == 0));
1492 GenImm(STPTR_W, si14 >> 2, rj, rd, 14);
1495void Assembler::stptr_d(Register rd, Register rj, int32_t si14) {
1496 DCHECK(is_int16(si14) && ((si14 & 0x3) == 0));
1497 GenImm(STPTR_D, si14 >> 2, rj, rd, 14);
1500void Assembler::amswap_w(Register rd, Register rk, Register rj) {
1501 GenRegister(AMSWAP_W, rk, rj, rd);
1504void Assembler::amswap_d(Register rd, Register rk, Register rj) {
1505 GenRegister(AMSWAP_D, rk, rj, rd);
1508void Assembler::amadd_w(Register rd, Register rk, Register rj) {
1509 GenRegister(AMADD_W, rk, rj, rd);
1512void Assembler::amadd_d(Register rd, Register rk, Register rj) {
1513 GenRegister(AMADD_D, rk, rj, rd);
1516void Assembler::amand_w(Register rd, Register rk, Register rj) {
1517 GenRegister(AMAND_W, rk, rj, rd);
1520void Assembler::amand_d(Register rd, Register rk, Register rj) {
1521 GenRegister(AMAND_D, rk, rj, rd);
1524void Assembler::amor_w(Register rd, Register rk, Register rj) {
1525 GenRegister(AMOR_W, rk, rj, rd);
1528void Assembler::amor_d(Register rd, Register rk, Register rj) {
1529 GenRegister(AMOR_D, rk, rj, rd);
1532void Assembler::amxor_w(Register rd, Register rk, Register rj) {
1533 GenRegister(AMXOR_W, rk, rj, rd);
1536void Assembler::amxor_d(Register rd, Register rk, Register rj) {
1537 GenRegister(AMXOR_D, rk, rj, rd);
1540void Assembler::ammax_w(Register rd, Register rk, Register rj) {
1541 GenRegister(AMMAX_W, rk, rj, rd);
1544void Assembler::ammax_d(Register rd, Register rk, Register rj) {
1545 GenRegister(AMMAX_D, rk, rj, rd);
1548void Assembler::ammin_w(Register rd, Register rk, Register rj) {
1549 GenRegister(AMMIN_W, rk, rj, rd);
1552void Assembler::ammin_d(Register rd, Register rk, Register rj) {
1553 GenRegister(AMMIN_D, rk, rj, rd);
1556void Assembler::ammax_wu(Register rd, Register rk, Register rj) {
1557 GenRegister(AMMAX_WU, rk, rj, rd);
1560void Assembler::ammax_du(Register rd, Register rk, Register rj) {
1561 GenRegister(AMMAX_DU, rk, rj, rd);
1564void Assembler::ammin_wu(Register rd, Register rk, Register rj) {
1565 GenRegister(AMMIN_WU, rk, rj, rd);
1568void Assembler::ammin_du(Register rd, Register rk, Register rj) {
1569 GenRegister(AMMIN_DU, rk, rj, rd);
1572void Assembler::amswap_db_w(Register rd, Register rk, Register rj) {
1573 GenRegister(AMSWAP_DB_W, rk, rj, rd);
1576void Assembler::amswap_db_d(Register rd, Register rk, Register rj) {
1577 GenRegister(AMSWAP_DB_D, rk, rj, rd);
1580void Assembler::amadd_db_w(Register rd, Register rk, Register rj) {
1581 GenRegister(AMADD_DB_W, rk, rj, rd);
1584void Assembler::amadd_db_d(Register rd, Register rk, Register rj) {
1585 GenRegister(AMADD_DB_D, rk, rj, rd);
1588void Assembler::amand_db_w(Register rd, Register rk, Register rj) {
1589 GenRegister(AMAND_DB_W, rk, rj, rd);
1592void Assembler::amand_db_d(Register rd, Register rk, Register rj) {
1593 GenRegister(AMAND_DB_D, rk, rj, rd);
1596void Assembler::amor_db_w(Register rd, Register rk, Register rj) {
1597 GenRegister(AMOR_DB_W, rk, rj, rd);
1600void Assembler::amor_db_d(Register rd, Register rk, Register rj) {
1601 GenRegister(AMOR_DB_D, rk, rj, rd);
1604void Assembler::amxor_db_w(Register rd, Register rk, Register rj) {
1605 GenRegister(AMXOR_DB_W, rk, rj, rd);
1608void Assembler::amxor_db_d(Register rd, Register rk, Register rj) {
1609 GenRegister(AMXOR_DB_D, rk, rj, rd);
1612void Assembler::ammax_db_w(Register rd, Register rk, Register rj) {
1613 GenRegister(AMMAX_DB_W, rk, rj, rd);
1616void Assembler::ammax_db_d(Register rd, Register rk, Register rj) {
1617 GenRegister(AMMAX_DB_D, rk, rj, rd);
1620void Assembler::ammin_db_w(Register rd, Register rk, Register rj) {
1621 GenRegister(AMMIN_DB_W, rk, rj, rd);
1624void Assembler::ammin_db_d(Register rd, Register rk, Register rj) {
1625 GenRegister(AMMIN_DB_D, rk, rj, rd);
1628void Assembler::ammax_db_wu(Register rd, Register rk, Register rj) {
1629 GenRegister(AMMAX_DB_WU, rk, rj, rd);
1632void Assembler::ammax_db_du(Register rd, Register rk, Register rj) {
1633 GenRegister(AMMAX_DB_DU, rk, rj, rd);
1636void Assembler::ammin_db_wu(Register rd, Register rk, Register rj) {
1637 GenRegister(AMMIN_DB_WU, rk, rj, rd);
1640void Assembler::ammin_db_du(Register rd, Register rk, Register rj) {
1641 GenRegister(AMMIN_DB_DU, rk, rj, rd);
1644void Assembler::ll_w(Register rd, Register rj, int32_t si14) {
1645 DCHECK(is_int16(si14) && ((si14 & 0x3) == 0));
1646 GenImm(LL_W, si14 >> 2, rj, rd, 14);
1649void Assembler::ll_d(Register rd, Register rj, int32_t si14) {
1650 DCHECK(is_int16(si14) && ((si14 & 0x3) == 0));
1651 GenImm(LL_D, si14 >> 2, rj, rd, 14);
1654void Assembler::sc_w(Register rd, Register rj, int32_t si14) {
1655 DCHECK(is_int16(si14) && ((si14 & 0x3) == 0));
1656 GenImm(SC_W, si14 >> 2, rj, rd, 14);
1659void Assembler::sc_d(Register rd, Register rj, int32_t si14) {
1660 DCHECK(is_int16(si14) && ((si14 & 0x3) == 0));
1661 GenImm(SC_D, si14 >> 2, rj, rd, 14);
1664void Assembler::dbar(int32_t hint) { GenImm(DBAR, hint); }
1666void Assembler::ibar(int32_t hint) { GenImm(IBAR, hint); }
1669void Assembler::break_(uint32_t code,
bool break_as_stop) {
1672 (!break_as_stop && (code > kMaxStopCode || code <= kMaxWatchpointCode)));
1673 GenImm(
BREAK, code);
1676void Assembler::stop(uint32_t code) {
1679#if defined(V8_HOST_ARCH_LOONG64)
1686void Assembler::fadd_s(FPURegister fd, FPURegister fj, FPURegister fk) {
1687 GenRegister(FADD_S, fk, fj, fd);
1690void Assembler::fadd_d(FPURegister fd, FPURegister fj, FPURegister fk) {
1691 GenRegister(FADD_D, fk, fj, fd);
1694void Assembler::fsub_s(FPURegister fd, FPURegister fj, FPURegister fk) {
1695 GenRegister(FSUB_S, fk, fj, fd);
1698void Assembler::fsub_d(FPURegister fd, FPURegister fj, FPURegister fk) {
1699 GenRegister(FSUB_D, fk, fj, fd);
1702void Assembler::fmul_s(FPURegister fd, FPURegister fj, FPURegister fk) {
1703 GenRegister(FMUL_S, fk, fj, fd);
1706void Assembler::fmul_d(FPURegister fd, FPURegister fj, FPURegister fk) {
1707 GenRegister(FMUL_D, fk, fj, fd);
1710void Assembler::fdiv_s(FPURegister fd, FPURegister fj, FPURegister fk) {
1711 GenRegister(FDIV_S, fk, fj, fd);
1714void Assembler::fdiv_d(FPURegister fd, FPURegister fj, FPURegister fk) {
1715 GenRegister(FDIV_D, fk, fj, fd);
1718void Assembler::fmadd_s(FPURegister fd, FPURegister fj, FPURegister fk,
1720 GenRegister(FMADD_S, fa, fk, fj, fd);
1723void Assembler::fmadd_d(FPURegister fd, FPURegister fj, FPURegister fk,
1725 GenRegister(FMADD_D, fa, fk, fj, fd);
1728void Assembler::fmsub_s(FPURegister fd, FPURegister fj, FPURegister fk,
1730 GenRegister(FMSUB_S, fa, fk, fj, fd);
1733void Assembler::fmsub_d(FPURegister fd, FPURegister fj, FPURegister fk,
1735 GenRegister(FMSUB_D, fa, fk, fj, fd);
1738void Assembler::fnmadd_s(FPURegister fd, FPURegister fj, FPURegister fk,
1740 GenRegister(FNMADD_S, fa, fk, fj, fd);
1743void Assembler::fnmadd_d(FPURegister fd, FPURegister fj, FPURegister fk,
1745 GenRegister(FNMADD_D, fa, fk, fj, fd);
1748void Assembler::fnmsub_s(FPURegister fd, FPURegister fj, FPURegister fk,
1750 GenRegister(FNMSUB_S, fa, fk, fj, fd);
1753void Assembler::fnmsub_d(FPURegister fd, FPURegister fj, FPURegister fk,
1755 GenRegister(FNMSUB_D, fa, fk, fj, fd);
1758void Assembler::fmax_s(FPURegister fd, FPURegister fj, FPURegister fk) {
1759 GenRegister(FMAX_S, fk, fj, fd);
1762void Assembler::fmax_d(FPURegister fd, FPURegister fj, FPURegister fk) {
1763 GenRegister(FMAX_D, fk, fj, fd);
1766void Assembler::fmin_s(FPURegister fd, FPURegister fj, FPURegister fk) {
1767 GenRegister(FMIN_S, fk, fj, fd);
1770void Assembler::fmin_d(FPURegister fd, FPURegister fj, FPURegister fk) {
1771 GenRegister(FMIN_D, fk, fj, fd);
1774void Assembler::fmaxa_s(FPURegister fd, FPURegister fj, FPURegister fk) {
1775 GenRegister(FMAXA_S, fk, fj, fd);
1778void Assembler::fmaxa_d(FPURegister fd, FPURegister fj, FPURegister fk) {
1779 GenRegister(FMAXA_D, fk, fj, fd);
1782void Assembler::fmina_s(FPURegister fd, FPURegister fj, FPURegister fk) {
1783 GenRegister(FMINA_S, fk, fj, fd);
1786void Assembler::fmina_d(FPURegister fd, FPURegister fj, FPURegister fk) {
1787 GenRegister(FMINA_D, fk, fj, fd);
1790void Assembler::fabs_s(FPURegister fd, FPURegister fj) {
1791 GenRegister(FABS_S, fj, fd);
1794void Assembler::fabs_d(FPURegister fd, FPURegister fj) {
1795 GenRegister(FABS_D, fj, fd);
1798void Assembler::fneg_s(FPURegister fd, FPURegister fj) {
1799 GenRegister(FNEG_S, fj, fd);
1802void Assembler::fneg_d(FPURegister fd, FPURegister fj) {
1803 GenRegister(FNEG_D, fj, fd);
1806void Assembler::fsqrt_s(FPURegister fd, FPURegister fj) {
1807 GenRegister(FSQRT_S, fj, fd);
1810void Assembler::fsqrt_d(FPURegister fd, FPURegister fj) {
1811 GenRegister(FSQRT_D, fj, fd);
1814void Assembler::frecip_s(FPURegister fd, FPURegister fj) {
1815 GenRegister(FRECIP_S, fj, fd);
1818void Assembler::frecip_d(FPURegister fd, FPURegister fj) {
1819 GenRegister(FRECIP_D, fj, fd);
1822void Assembler::frsqrt_s(FPURegister fd, FPURegister fj) {
1823 GenRegister(FRSQRT_S, fj, fd);
1826void Assembler::frsqrt_d(FPURegister fd, FPURegister fj) {
1827 GenRegister(FRSQRT_D, fj, fd);
1830void Assembler::fscaleb_s(FPURegister fd, FPURegister fj, FPURegister fk) {
1831 GenRegister(FSCALEB_S, fk, fj, fd);
1834void Assembler::fscaleb_d(FPURegister fd, FPURegister fj, FPURegister fk) {
1835 GenRegister(FSCALEB_D, fk, fj, fd);
1838void Assembler::flogb_s(FPURegister fd, FPURegister fj) {
1839 GenRegister(FLOGB_S, fj, fd);
1842void Assembler::flogb_d(FPURegister fd, FPURegister fj) {
1843 GenRegister(FLOGB_D, fj, fd);
1846void Assembler::fcopysign_s(FPURegister fd, FPURegister fj, FPURegister fk) {
1847 GenRegister(FCOPYSIGN_S, fk, fj, fd);
1850void Assembler::fcopysign_d(FPURegister fd, FPURegister fj, FPURegister fk) {
1851 GenRegister(FCOPYSIGN_D, fk, fj, fd);
1854void Assembler::fclass_s(FPURegister fd, FPURegister fj) {
1855 GenRegister(FCLASS_S, fj, fd);
1858void Assembler::fclass_d(FPURegister fd, FPURegister fj) {
1859 GenRegister(FCLASS_D, fj, fd);
1862void Assembler::fcmp_cond_s(FPUCondition cc, FPURegister fj, FPURegister fk,
1864 GenCmp(FCMP_COND_S, cc, fk, fj, cd);
1867void Assembler::fcmp_cond_d(FPUCondition cc, FPURegister fj, FPURegister fk,
1869 GenCmp(FCMP_COND_D, cc, fk, fj, cd);
1872void Assembler::fcvt_s_d(FPURegister fd, FPURegister fj) {
1873 GenRegister(FCVT_S_D, fj, fd);
1876void Assembler::fcvt_d_s(FPURegister fd, FPURegister fj) {
1877 GenRegister(FCVT_D_S, fj, fd);
1880void Assembler::ffint_s_w(FPURegister fd, FPURegister fj) {
1881 GenRegister(FFINT_S_W, fj, fd);
1884void Assembler::ffint_s_l(FPURegister fd, FPURegister fj) {
1885 GenRegister(FFINT_S_L, fj, fd);
1888void Assembler::ffint_d_w(FPURegister fd, FPURegister fj) {
1889 GenRegister(FFINT_D_W, fj, fd);
1892void Assembler::ffint_d_l(FPURegister fd, FPURegister fj) {
1893 GenRegister(FFINT_D_L, fj, fd);
1896void Assembler::ftint_w_s(FPURegister fd, FPURegister fj) {
1897 GenRegister(FTINT_W_S, fj, fd);
1900void Assembler::ftint_w_d(FPURegister fd, FPURegister fj) {
1901 GenRegister(FTINT_W_D, fj, fd);
1904void Assembler::ftint_l_s(FPURegister fd, FPURegister fj) {
1905 GenRegister(FTINT_L_S, fj, fd);
1908void Assembler::ftint_l_d(FPURegister fd, FPURegister fj) {
1909 GenRegister(FTINT_L_D, fj, fd);
1912void Assembler::ftintrm_w_s(FPURegister fd, FPURegister fj) {
1913 GenRegister(FTINTRM_W_S, fj, fd);
1916void Assembler::ftintrm_w_d(FPURegister fd, FPURegister fj) {
1917 GenRegister(FTINTRM_W_D, fj, fd);
1920void Assembler::ftintrm_l_s(FPURegister fd, FPURegister fj) {
1921 GenRegister(FTINTRM_L_S, fj, fd);
1924void Assembler::ftintrm_l_d(FPURegister fd, FPURegister fj) {
1925 GenRegister(FTINTRM_L_D, fj, fd);
1928void Assembler::ftintrp_w_s(FPURegister fd, FPURegister fj) {
1929 GenRegister(FTINTRP_W_S, fj, fd);
1932void Assembler::ftintrp_w_d(FPURegister fd, FPURegister fj) {
1933 GenRegister(FTINTRP_W_D, fj, fd);
1936void Assembler::ftintrp_l_s(FPURegister fd, FPURegister fj) {
1937 GenRegister(FTINTRP_L_S, fj, fd);
1940void Assembler::ftintrp_l_d(FPURegister fd, FPURegister fj) {
1941 GenRegister(FTINTRP_L_D, fj, fd);
1944void Assembler::ftintrz_w_s(FPURegister fd, FPURegister fj) {
1945 GenRegister(FTINTRZ_W_S, fj, fd);
1948void Assembler::ftintrz_w_d(FPURegister fd, FPURegister fj) {
1949 GenRegister(FTINTRZ_W_D, fj, fd);
1952void Assembler::ftintrz_l_s(FPURegister fd, FPURegister fj) {
1953 GenRegister(FTINTRZ_L_S, fj, fd);
1956void Assembler::ftintrz_l_d(FPURegister fd, FPURegister fj) {
1957 GenRegister(FTINTRZ_L_D, fj, fd);
1960void Assembler::ftintrne_w_s(FPURegister fd, FPURegister fj) {
1961 GenRegister(FTINTRNE_W_S, fj, fd);
1964void Assembler::ftintrne_w_d(FPURegister fd, FPURegister fj) {
1965 GenRegister(FTINTRNE_W_D, fj, fd);
1968void Assembler::ftintrne_l_s(FPURegister fd, FPURegister fj) {
1969 GenRegister(FTINTRNE_L_S, fj, fd);
1972void Assembler::ftintrne_l_d(FPURegister fd, FPURegister fj) {
1973 GenRegister(FTINTRNE_L_D, fj, fd);
1976void Assembler::frint_s(FPURegister fd, FPURegister fj) {
1977 GenRegister(FRINT_S, fj, fd);
1980void Assembler::frint_d(FPURegister fd, FPURegister fj) {
1981 GenRegister(FRINT_D, fj, fd);
1984void Assembler::fmov_s(FPURegister fd, FPURegister fj) {
1985 GenRegister(FMOV_S, fj, fd);
1988void Assembler::fmov_d(FPURegister fd, FPURegister fj) {
1989 GenRegister(FMOV_D, fj, fd);
1992void Assembler::fsel(CFRegister ca, FPURegister fd, FPURegister fj,
1994 GenSel(FSEL, ca, fk, fj, fd);
1997void Assembler::movgr2fr_w(FPURegister fd, Register rj) {
1998 GenRegister(MOVGR2FR_W, rj, fd);
2001void Assembler::movgr2fr_d(FPURegister fd, Register rj) {
2002 GenRegister(MOVGR2FR_D, rj, fd);
2005void Assembler::movgr2frh_w(FPURegister fd, Register rj) {
2006 GenRegister(MOVGR2FRH_W, rj, fd);
2009void Assembler::movfr2gr_s(Register rd, FPURegister fj) {
2010 GenRegister(MOVFR2GR_S, fj, rd);
2013void Assembler::movfr2gr_d(Register rd, FPURegister fj) {
2014 GenRegister(MOVFR2GR_D, fj, rd);
2017void Assembler::movfrh2gr_s(Register rd, FPURegister fj) {
2018 GenRegister(MOVFRH2GR_S, fj, rd);
2021void Assembler::movgr2fcsr(Register rj, FPUControlRegister fcsr) {
2022 GenRegister(MOVGR2FCSR, rj, fcsr);
2025void Assembler::movfcsr2gr(Register rd, FPUControlRegister fcsr) {
2026 GenRegister(MOVFCSR2GR, fcsr, rd);
2029void Assembler::movfr2cf(CFRegister cd, FPURegister fj) {
2030 GenRegister(MOVFR2CF, fj, cd);
2033void Assembler::movcf2fr(FPURegister fd, CFRegister cj) {
2034 GenRegister(MOVCF2FR, cj, fd);
2037void Assembler::movgr2cf(CFRegister cd, Register rj) {
2038 GenRegister(MOVGR2CF, rj, cd);
2041void Assembler::movcf2gr(Register rd, CFRegister cj) {
2042 GenRegister(MOVCF2GR, cj, rd);
2045void Assembler::fld_s(FPURegister fd, Register rj, int32_t si12) {
2046 GenImm(FLD_S, si12, rj, fd);
2049void Assembler::fld_d(FPURegister fd, Register rj, int32_t si12) {
2050 GenImm(FLD_D, si12, rj, fd);
2053void Assembler::fst_s(FPURegister fd, Register rj, int32_t si12) {
2054 GenImm(FST_S, si12, rj, fd);
2057void Assembler::fst_d(FPURegister fd, Register rj, int32_t si12) {
2058 GenImm(FST_D, si12, rj, fd);
2061void Assembler::fldx_s(FPURegister fd, Register rj, Register rk) {
2062 GenRegister(FLDX_S, rk, rj, fd);
2065void Assembler::fldx_d(FPURegister fd, Register rj, Register rk) {
2066 GenRegister(FLDX_D, rk, rj, fd);
2069void Assembler::fstx_s(FPURegister fd, Register rj, Register rk) {
2070 GenRegister(FSTX_S, rk, rj, fd);
2073void Assembler::fstx_d(FPURegister fd, Register rj, Register rk) {
2074 GenRegister(FSTX_D, rk, rj, fd);
2077void Assembler::AdjustBaseAndOffset(MemOperand* src) {
2079 if ((!src->hasIndexReg() && is_int12(src->offset())) || src->hasIndexReg()) {
2082 UseScratchRegisterScope temps(
this);
2083 Register scratch = temps.Acquire();
2084 if (is_uint12(
static_cast<int32_t>(src->offset()))) {
2085 ori(scratch, zero_reg, src->offset() & kImm12Mask);
2087 lu12i_w(scratch, src->offset() >> 12 & 0xfffff);
2088 if (src->offset() & kImm12Mask) {
2089 ori(scratch, scratch, src->offset() & kImm12Mask);
2092 src->index_ = scratch;
2096void Assembler::RelocateRelativeReference(
2097 RelocInfo::Mode rmode, Address
pc, intptr_t pc_delta,
2098 WritableJitAllocation* jit_allocation) {
2099 DCHECK(RelocInfo::IsRelativeCodeTarget(rmode) ||
2100 RelocInfo::IsNearBuiltinEntry(rmode));
2108 instr_at_put(
pc, new_instr, jit_allocation);
2112void Assembler::GrowBuffer() {
2114 int old_size =
buffer_->size();
2115 int new_size = std::min(2 * old_size, old_size + 1 * MB);
2119 if (new_size > kMaximalBufferSize) {
2120 V8::FatalProcessOutOfMemory(
nullptr,
"Assembler::GrowBuffer");
2124 std::unique_ptr<AssemblerBuffer> new_buffer =
buffer_->Grow(new_size);
2125 DCHECK_EQ(new_size, new_buffer->size());
2126 uint8_t* new_start = new_buffer->start();
2129 intptr_t pc_delta = new_start - buffer_start_;
2130 intptr_t rc_delta = (new_start + new_size) - (buffer_start_ + old_size);
2131 size_t reloc_size = (buffer_start_ + old_size) - reloc_info_writer.pos();
2133 MemMove(reloc_info_writer.pos() + rc_delta, reloc_info_writer.pos(),
2137 buffer_ = std::move(new_buffer);
2138 buffer_start_ = new_start;
2140 pc_for_safepoint_ += pc_delta;
2141 reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta,
2142 reloc_info_writer.last_pc() + pc_delta);
2149 for (
auto pos : internal_reference_positions_) {
2150 Address address =
reinterpret_cast<intptr_t
>(buffer_start_) +
pos;
2151 intptr_t internal_ref = ReadUnalignedValue<intptr_t>(address);
2152 if (internal_ref != kEndOfJumpChain) {
2153 internal_ref += pc_delta;
2154 WriteUnalignedValue<intptr_t>(address, internal_ref);
2159void Assembler::db(uint8_t data) {
2160 if (!is_buffer_growth_blocked()) {
2163 *
reinterpret_cast<uint8_t*
>(
pc_) = data;
2164 pc_ +=
sizeof(uint8_t);
2167void Assembler::dd(uint32_t data) {
2168 if (!is_buffer_growth_blocked()) {
2171 *
reinterpret_cast<uint32_t*
>(
pc_) = data;
2172 pc_ +=
sizeof(uint32_t);
2175void Assembler::dq(uint64_t data) {
2176 if (!is_buffer_growth_blocked()) {
2179 *
reinterpret_cast<uint64_t*
>(
pc_) = data;
2180 pc_ +=
sizeof(uint64_t);
2183void Assembler::dd(Label*
label) {
2184 if (!is_buffer_growth_blocked()) {
2188 if (
label->is_bound()) {
2189 data =
reinterpret_cast<uint64_t
>(buffer_start_ +
label->pos());
2191 data = jump_address(
label);
2192 unbound_labels_count_++;
2193 internal_reference_positions_.insert(
label->pos());
2195 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE);
2199void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
2200 if (!ShouldRecordRelocInfo(rmode))
return;
2202 RelocInfo rinfo(
reinterpret_cast<Address>(
pc_), rmode, data);
2203 DCHECK_GE(buffer_space(), kMaxRelocSize);
2204 reloc_info_writer.Write(&rinfo);
2207void Assembler::BlockTrampolinePoolFor(
int instructions) {
2208 CheckTrampolinePoolQuick(instructions);
2209 BlockTrampolinePoolBefore(
pc_offset() + instructions * kInstrSize);
2212void Assembler::CheckTrampolinePool() {
2218 if ((trampoline_pool_blocked_nesting_ > 0) ||
2219 (
pc_offset() < no_trampoline_pool_before_)) {
2222 if (trampoline_pool_blocked_nesting_ > 0) {
2225 next_buffer_check_ = no_trampoline_pool_before_;
2230 DCHECK(!trampoline_emitted_);
2232 if (unbound_labels_count_ > 0) {
2235 BlockTrampolinePoolScope block_trampoline_pool(
this);
2241 for (
int i = 0;
i < unbound_labels_count_;
i++) {
2248 trampoline_ = Trampoline(pool_start, unbound_labels_count_);
2251 trampoline_emitted_ =
true;
2259 next_buffer_check_ =
2260 pc_offset() + kMax16BranchOffset - kTrampolineSlotsSize * 16;
2265Address Assembler::target_address_at(Address
pc) {
2273 Instr instr1 = instr_at(
pc + 1 * kInstrSize);
2274 Instr instr2 = instr_at(
pc + 2 * kInstrSize);
2278 DCHECK((IsLu12i_w(instr0) && (IsOri(instr1)) && (IsLu32i_d(instr2))));
2281 uint64_t hi20 = ((uint64_t)(instr2 >> 5) & 0xfffff) << 32;
2282 uint64_t mid20 = ((uint64_t)(instr0 >> 5) & 0xfffff) << 12;
2283 uint64_t low12 = ((uint64_t)(instr1 >> 10) & 0xfff);
2284 int64_t addr =
static_cast<int64_t
>(hi20 | mid20 | low12);
2287 addr = (addr << 16) >> 16;
2288 return static_cast<Address>(addr);
2291uint32_t Assembler::target_compressed_address_at(Address
pc) {
2293 Instr instr1 = instr_at(
pc + 1 * kInstrSize);
2297 DCHECK((IsLu12i_w(instr0) && (IsOri(instr1))));
2300 uint32_t hi20 = ((uint32_t)(instr0 >> 5) & 0xfffff) << 12;
2301 uint32_t low12 = ((uint32_t)(instr1 >> 10) & 0xfff);
2302 uint32_t addr =
static_cast<uint32_t
>(hi20 | low12);
2315void Assembler::set_target_value_at(Address
pc, uint64_t target,
2316 WritableJitAllocation* jit_allocation,
2317 ICacheFlushMode icache_flush_mode) {
2326 Instr instr1 = instr_at(
pc + kInstrSize);
2327 Instr instr2 = instr_at(
pc + kInstrSize * 2);
2328 DCHECK((IsLu12i_w(instr0) && IsOri(instr1) && IsLu32i_d(instr2)) ||
2339 instr_at_put(
pc, new_instr, jit_allocation);
2340 if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
2345 uint32_t rd_code = GetRd(
instr);
2354 ORI | (target & 0xfff) << kRkShift | (rd_code << kRjShift) | rd_code;
2357 instr_at_put(
pc, new_instr0, jit_allocation);
2358 instr_at_put(
pc + kInstrSize, new_instr1, jit_allocation);
2359 instr_at_put(
pc + kInstrSize * 2, new_instr2, jit_allocation);
2361 if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
2366void Assembler::set_target_compressed_value_at(
2367 Address
pc, uint32_t target, WritableJitAllocation* jit_allocation,
2368 ICacheFlushMode icache_flush_mode) {
2372 Instr instr1 = instr_at(
pc + kInstrSize);
2373 DCHECK(IsLu12i_w(instr0) && IsOri(instr1));
2377 uint32_t rd_code = GetRd(
instr);
2385 ORI | (target & 0xfff) << kRkShift | (rd_code << kRjShift) | rd_code;
2386 instr_at_put(
pc, new_instr0, jit_allocation);
2387 instr_at_put(
pc + kInstrSize, new_instr1, jit_allocation);
2389 if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static V8_INLINE Address target_address_at(Address pc, Address constant_pool)
static bool supports_wasm_simd_128_
static bool SupportsWasmSimd128()
static unsigned supported_
static void PrintFeatures()
static void PrintTarget()
static void ProbeImpl(bool cross_compile)
V8_INLINE Operand(int32_t immediate, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
static const int kApplyMask
uint32_t wasm_call_tag() const
static constexpr int ModeMask(Mode mode)
base::OwnedVector< uint8_t > buffer_
ZoneVector< RpoNumber > & result
constexpr Register no_reg
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr UnconditionalBranchOp BL
bool DoubleToSmiInteger(double value, int *smi_int_value)
void PrintF(const char *format,...)
void FlushInstructionCache(void *start, size_t size)
int ToNumber(Register reg)
V8_EXPORT_PRIVATE void MemMove(void *dest, const void *src, size_t size)
constexpr bool is_intn(int64_t x, unsigned n)
V8_EXPORT_PRIVATE FlagValues v8_flags
Register ToRegister(int num)
const int kEndOfJumpChain
constexpr uint8_t kInstrSize
constexpr int kNumRegisters
#define DCHECK_LE(v1, v2)
#define DCHECK_IMPLIES(v1, v2)
#define CHECK_NE(lhs, rhs)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
constexpr bool IsAligned(T value, U alignment)