v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
assembler-mips64.h
Go to the documentation of this file.
1// Copyright (c) 1994-2006 Sun Microsystems Inc.
2// All Rights Reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8// - Redistributions of source code must retain the above copyright notice,
9// this list of conditions and the following disclaimer.
10//
11// - Redistribution in binary form must reproduce the above copyright
12// notice, this list of conditions and the following disclaimer in the
13// documentation and/or other materials provided with the distribution.
14//
15// - Neither the name of Sun Microsystems or the names of contributors may
16// be used to endorse or promote products derived from this software without
17// specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31// The original source code covered by the above license above has been
32// modified significantly by Google Inc.
33// Copyright 2012 the V8 project authors. All rights reserved.
34
35#ifndef V8_CODEGEN_MIPS64_ASSEMBLER_MIPS64_H_
36#define V8_CODEGEN_MIPS64_ASSEMBLER_MIPS64_H_
37
38#include <stdio.h>
39
40#include <memory>
41#include <set>
42
45#include "src/codegen/label.h"
50#include "src/objects/smi.h"
51
52namespace v8 {
53namespace internal {
54
55class SafepointTableBuilder;
56
57// -----------------------------------------------------------------------------
58// Machine instruction Operands.
59constexpr int kSmiShift = kSmiTagSize + kSmiShiftSize;
60constexpr uint64_t kSmiShiftMask = (1UL << kSmiShift) - 1;
61// Class Operand represents a shifter operand in data processing instructions.
62class Operand {
63 public:
64 // Immediate.
71 : rm_(no_reg), rmode_(RelocInfo::EXTERNAL_REFERENCE) {
72 value_.immediate = static_cast<int64_t>(f.address());
73 }
75 : Operand(static_cast<intptr_t>(value.ptr())) {}
76
78
79 static Operand EmbeddedNumber(double number); // Smi or HeapNumber.
80
81 // Register.
83
84 // Return true if this is a register operand.
85 V8_INLINE bool is_reg() const;
86
87 inline int64_t immediate() const;
88
89 bool IsImmediate() const { return !rm_.is_valid(); }
90
95
103
104 Register rm() const { return rm_; }
105
106 RelocInfo::Mode rmode() const { return rmode_; }
107
108 private:
110 union Value {
111 Value() {}
112 HeapNumberRequest heap_number_request; // if is_heap_number_request_
113 int64_t immediate; // otherwise
114 } value_; // valid if rm_ == no_reg
115 bool is_heap_number_request_ = false;
117
118 friend class Assembler;
119 friend class MacroAssembler;
120};
121
122// On MIPS we have only one addressing mode with base_reg + offset.
123// Class MemOperand represents a memory operand in load and store instructions.
124class V8_EXPORT_PRIVATE MemOperand : public Operand {
125 public:
126 // Immediate value attached to offset.
127 enum OffsetAddend { offset_minus_one = -1, offset_zero = 0 };
128
129 explicit MemOperand(Register rn, int32_t offset = 0);
130 explicit MemOperand(Register rn, int32_t unit, int32_t multiplier,
131 OffsetAddend offset_addend = offset_zero);
132 int32_t offset() const { return offset_; }
133
134 bool OffsetIsInt16Encodable() const { return is_int16(offset_); }
135
136 private:
137 int32_t offset_;
138
139 friend class Assembler;
140};
141
142class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
143 public:
144 // Create an assembler. Instructions and relocation information are emitted
145 // into a buffer, with the instructions starting from the beginning and the
146 // relocation information starting from the end of the buffer. See CodeDesc
147 // for a detailed comment on the layout (globals.h).
148 //
149 // If the provided buffer is nullptr, the assembler allocates and grows its
150 // own buffer. Otherwise it takes ownership of the provided buffer.
152 std::unique_ptr<AssemblerBuffer> = {});
153 // For compatibility with assemblers that require a zone.
155 std::unique_ptr<AssemblerBuffer> buffer = {})
156 : Assembler(options, std::move(buffer)) {}
157
158 virtual ~Assembler() {}
159
160 // GetCode emits any pending (non-emitted) code and fills the descriptor desc.
161 static constexpr int kNoHandlerTable = 0;
162 static constexpr SafepointTableBuilderBase* kNoSafepointTable = nullptr;
163 void GetCode(LocalIsolate* isolate, CodeDesc* desc,
164 SafepointTableBuilderBase* safepoint_table_builder,
165 int handler_table_offset);
166
167 // Convenience wrapper for allocating with an Isolate.
168 void GetCode(Isolate* isolate, CodeDesc* desc);
169 // Convenience wrapper for code without safepoint or handler tables.
170 void GetCode(LocalIsolate* isolate, CodeDesc* desc) {
171 GetCode(isolate, desc, kNoSafepointTable, kNoHandlerTable);
172 }
173
174 // Unused on this architecture.
176
177 // Mips uses BlockTrampolinePool to prevent generating trampoline inside a
178 // continuous instruction block. For Call instruction, it prevents generating
179 // trampoline between jalr and delay slot instruction. In the destructor of
180 // BlockTrampolinePool, it must check if it needs to generate trampoline
181 // immediately, if it does not do this, the branch range will go beyond the
182 // max branch offset, that means the pc_offset after call CheckTrampolinePool
183 // may have changed. So we use pc_for_safepoint_ here for safepoint record.
185 return static_cast<int>(pc_for_safepoint_ - buffer_start_);
186 }
187
188 // Label operations & relative jumps (PPUM Appendix D).
189 //
190 // Takes a branch opcode (cc) and a label (L) and generates
191 // either a backward branch or a forward branch and links it
192 // to the label fixup chain. Usage:
193 //
194 // Label L; // unbound label
195 // j(cc, &L); // forward branch to unbound label
196 // bind(&L); // bind label to the current pc
197 // j(cc, &L); // backward branch to bound label
198 // bind(&L); // illegal: a label may be bound only once
199 //
200 // Note: The same Label can be used for forward and backward branches
201 // but it may be bound only once.
202 void bind(Label* L); // Binds an unbound label L to current code position.
203
204 enum OffsetSize : int { kOffset26 = 26, kOffset21 = 21, kOffset16 = 16 };
205
206 // Determines if Label is bound and near enough so that branch instruction
207 // can be used to reach it, instead of jump instruction.
208 bool is_near(Label* L);
209 bool is_near(Label* L, OffsetSize bits);
210 bool is_near_branch(Label* L);
211 inline bool is_near_pre_r6(Label* L) {
213 return pc_offset() - L->pos() < kMaxBranchOffset - 4 * kInstrSize;
214 }
215 inline bool is_near_r6(Label* L) {
217 return pc_offset() - L->pos() < kMaxCompactBranchOffset - 4 * kInstrSize;
218 }
219
221
222 // Returns the branch offset to the given label from the current code
223 // position. Links the label to the current position if it is still unbound.
224 // Manages the jump elimination optimization if the second parameter is true.
226 inline int32_t branch_offset(Label* L) {
227 return branch_offset_helper(L, OffsetSize::kOffset16);
228 }
229 inline int32_t branch_offset21(Label* L) {
230 return branch_offset_helper(L, OffsetSize::kOffset21);
231 }
232 inline int32_t branch_offset26(Label* L) {
233 return branch_offset_helper(L, OffsetSize::kOffset26);
234 }
235 inline int32_t shifted_branch_offset(Label* L) {
236 return branch_offset(L) >> 2;
237 }
238 inline int32_t shifted_branch_offset21(Label* L) {
239 return branch_offset21(L) >> 2;
240 }
241 inline int32_t shifted_branch_offset26(Label* L) {
242 return branch_offset26(L) >> 2;
243 }
244 uint64_t jump_address(Label* L);
245 uint64_t jump_offset(Label* L);
247
248 // Puts a labels target address at the given position.
249 // The high 8 bits are set to zero.
250 void label_at_put(Label* L, int at_offset);
251
252 // Read/Modify the code target address in the branch/call instruction at pc.
253 // The isolate argument is unused (and may be nullptr) when skipping flushing.
254 static Address target_address_at(Address pc);
256 Address pc, Address target, WritableJitAllocation* jit_allocation,
257 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED) {
258 set_target_value_at(pc, target, jit_allocation, icache_flush_mode);
259 }
260 // On MIPS there is no Constant Pool so we skip that parameter.
261 V8_INLINE static Address target_address_at(Address pc,
262 Address constant_pool) {
263 return target_address_at(pc);
264 }
266 Address pc, Address constant_pool, Address target,
267 WritableJitAllocation* jit_allocation,
268 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED) {
269 set_target_address_at(pc, target, jit_allocation, icache_flush_mode);
270 }
271
273 Address pc, uint64_t target,
274 WritableJitAllocation* jit_allocation = nullptr,
275 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED);
276
277 static void JumpLabelToJumpRegister(Address pc);
278
279 // Get the size of the special target encoded at 'instruction_payload'.
281 Address instruction_payload);
282
283 // This sets the internal reference at the pc.
285 Address pc, Address target, WritableJitAllocation& jit_allocation,
286 RelocInfo::Mode mode = RelocInfo::INTERNAL_REFERENCE);
287
288 // Read/modify the uint32 constant used at pc.
289 static inline uint32_t uint32_constant_at(Address pc, Address constant_pool);
290 static inline void set_uint32_constant_at(
291 Address pc, Address constant_pool, uint32_t new_constant,
292 WritableJitAllocation* jit_allocation,
293 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED);
294
295 // Difference between address of current opcode and target address offset.
296 static constexpr int kBranchPCOffset = kInstrSize;
297
298 // Difference between address of current opcode and target address offset,
299 // when we are generatinga sequence of instructions for long relative PC
300 // branches
301 static constexpr int kLongBranchPCOffset = 3 * kInstrSize;
302
303 // Adjust ra register in branch delay slot of bal instruction so to skip
304 // instructions not needed after optimization of PIC in
305 // MacroAssembler::BranchAndLink method.
306
307 static constexpr int kOptimizedBranchAndLinkLongReturnOffset = 4 * kInstrSize;
308
309 // Here we are patching the address in the LUI/ORI instruction pair.
310 // These values are used in the serialization process and must be zero for
311 // MIPS platform, as InstructionStream, Embedded Object or External-reference
312 // pointers are split across two consecutive instructions and don't exist
313 // separately in the code, so the serializer should not step forwards in
314 // memory after a target is resolved and written.
315 static constexpr int kSpecialTargetSize = 0;
316
317 // Number of consecutive instructions used to store 32bit/64bit constant.
318 // This constant was used in RelocInfo::target_address_address() function
319 // to tell serializer address of the instruction that follows
320 // LUI/ORI instruction pair.
321 static constexpr int kInstructionsFor32BitConstant = 2;
322 static constexpr int kInstructionsFor64BitConstant = 4;
323
324 // Difference between address of current opcode and value read from pc
325 // register.
326 static constexpr int kPcLoadDelta = 4;
327
328 // Max offset for instructions with 16-bit offset field
329 static constexpr int kMaxBranchOffset = (1 << (18 - 1)) - 1;
330
331 // Max offset for compact branch instructions with 26-bit offset field
332 static constexpr int kMaxCompactBranchOffset = (1 << (28 - 1)) - 1;
333
334 static constexpr int kTrampolineSlotsSize =
336
337 RegList* GetScratchRegisterList() { return &scratch_register_list_; }
338
339 // ---------------------------------------------------------------------------
340 // InstructionStream generation.
341
342 // Insert the smallest number of nop instructions
343 // possible to align the pc offset to a multiple
344 // of m. m must be a power of 2 (>= 4).
345 void Align(int m);
346 // Insert the smallest number of zero bytes possible to align the pc offset
347 // to a mulitple of m. m must be a power of 2 (>= 2).
348 void DataAlign(int m);
349 // Aligns code to something that's optimal for a jump target for the platform.
351 void LoopHeaderAlign() { CodeTargetAlign(); }
352
353 // Different nop operations are used by the code generator to detect certain
354 // states of the generated code.
356 NON_MARKING_NOP = 0,
357 DEBUG_BREAK_NOP,
358 // IC markers.
359 PROPERTY_ACCESS_INLINED,
360 PROPERTY_ACCESS_INLINED_CONTEXT,
361 PROPERTY_ACCESS_INLINED_CONTEXT_DONT_DELETE,
362 // Helper values.
363 LAST_CODE_MARKER,
364 FIRST_IC_MARKER = PROPERTY_ACCESS_INLINED,
365 };
366
367 // Type == 0 is the default non-marking nop. For mips this is a
368 // sll(zero_reg, zero_reg, 0). We use rt_reg == at for non-zero
369 // marking, to avoid conflict with ssnop and ehb instructions.
370 void nop(unsigned int type = 0) {
371 DCHECK_LT(type, 32);
372 Register nop_rt_reg = (type == 0) ? zero_reg : at;
373 sll(zero_reg, nop_rt_reg, type, true);
374 }
375
376 // --------Branch-and-jump-instructions----------
377 // We don't use likely variant of instructions.
378 void b(int16_t offset);
379 inline void b(Label* L) { b(shifted_branch_offset(L)); }
380 void bal(int16_t offset);
381 inline void bal(Label* L) { bal(shifted_branch_offset(L)); }
382 void bc(int32_t offset);
383 inline void bc(Label* L) { bc(shifted_branch_offset26(L)); }
384 void balc(int32_t offset);
385 inline void balc(Label* L) { balc(shifted_branch_offset26(L)); }
386
387 void beq(Register rs, Register rt, int16_t offset);
388 inline void beq(Register rs, Register rt, Label* L) {
389 beq(rs, rt, shifted_branch_offset(L));
390 }
391 void bgez(Register rs, int16_t offset);
392 void bgezc(Register rt, int16_t offset);
393 inline void bgezc(Register rt, Label* L) {
394 bgezc(rt, shifted_branch_offset(L));
395 }
396 void bgeuc(Register rs, Register rt, int16_t offset);
397 inline void bgeuc(Register rs, Register rt, Label* L) {
398 bgeuc(rs, rt, shifted_branch_offset(L));
399 }
400 void bgec(Register rs, Register rt, int16_t offset);
401 inline void bgec(Register rs, Register rt, Label* L) {
402 bgec(rs, rt, shifted_branch_offset(L));
403 }
404 void bgezal(Register rs, int16_t offset);
405 void bgezalc(Register rt, int16_t offset);
406 inline void bgezalc(Register rt, Label* L) {
407 bgezalc(rt, shifted_branch_offset(L));
408 }
409 void bgezall(Register rs, int16_t offset);
410 inline void bgezall(Register rs, Label* L) {
411 bgezall(rs, branch_offset(L) >> 2);
412 }
413 void bgtz(Register rs, int16_t offset);
414 void bgtzc(Register rt, int16_t offset);
415 inline void bgtzc(Register rt, Label* L) {
416 bgtzc(rt, shifted_branch_offset(L));
417 }
418 void blez(Register rs, int16_t offset);
419 void blezc(Register rt, int16_t offset);
420 inline void blezc(Register rt, Label* L) {
421 blezc(rt, shifted_branch_offset(L));
422 }
423 void bltz(Register rs, int16_t offset);
424 void bltzc(Register rt, int16_t offset);
425 inline void bltzc(Register rt, Label* L) {
426 bltzc(rt, shifted_branch_offset(L));
427 }
428 void bltuc(Register rs, Register rt, int16_t offset);
429 inline void bltuc(Register rs, Register rt, Label* L) {
430 bltuc(rs, rt, shifted_branch_offset(L));
431 }
432 void bltc(Register rs, Register rt, int16_t offset);
433 inline void bltc(Register rs, Register rt, Label* L) {
434 bltc(rs, rt, shifted_branch_offset(L));
435 }
436 void bltzal(Register rs, int16_t offset);
437 void nal() { bltzal(zero_reg, 0); }
438 void blezalc(Register rt, int16_t offset);
439 inline void blezalc(Register rt, Label* L) {
440 blezalc(rt, shifted_branch_offset(L));
441 }
442 void bltzalc(Register rt, int16_t offset);
443 inline void bltzalc(Register rt, Label* L) {
444 bltzalc(rt, shifted_branch_offset(L));
445 }
446 void bgtzalc(Register rt, int16_t offset);
447 inline void bgtzalc(Register rt, Label* L) {
448 bgtzalc(rt, shifted_branch_offset(L));
449 }
450 void beqzalc(Register rt, int16_t offset);
451 inline void beqzalc(Register rt, Label* L) {
452 beqzalc(rt, shifted_branch_offset(L));
453 }
454 void beqc(Register rs, Register rt, int16_t offset);
455 inline void beqc(Register rs, Register rt, Label* L) {
456 beqc(rs, rt, shifted_branch_offset(L));
457 }
458 void beqzc(Register rs, int32_t offset);
459 inline void beqzc(Register rs, Label* L) {
460 beqzc(rs, shifted_branch_offset21(L));
461 }
462 void bnezalc(Register rt, int16_t offset);
463 inline void bnezalc(Register rt, Label* L) {
464 bnezalc(rt, shifted_branch_offset(L));
465 }
466 void bnec(Register rs, Register rt, int16_t offset);
467 inline void bnec(Register rs, Register rt, Label* L) {
468 bnec(rs, rt, shifted_branch_offset(L));
469 }
470 void bnezc(Register rt, int32_t offset);
471 inline void bnezc(Register rt, Label* L) {
472 bnezc(rt, shifted_branch_offset21(L));
473 }
474 void bne(Register rs, Register rt, int16_t offset);
475 inline void bne(Register rs, Register rt, Label* L) {
476 bne(rs, rt, shifted_branch_offset(L));
477 }
478 void bovc(Register rs, Register rt, int16_t offset);
479 inline void bovc(Register rs, Register rt, Label* L) {
480 bovc(rs, rt, shifted_branch_offset(L));
481 }
482 void bnvc(Register rs, Register rt, int16_t offset);
483 inline void bnvc(Register rs, Register rt, Label* L) {
484 bnvc(rs, rt, shifted_branch_offset(L));
485 }
486
487 // Never use the int16_t b(l)cond version with a branch offset
488 // instead of using the Label* version.
489
490 void jalr(Register rs, Register rd = ra);
491 void jr(Register target);
492 void jic(Register rt, int16_t offset);
493 void jialc(Register rt, int16_t offset);
494
495 // Following instructions are deprecated and require 256 MB
496 // code alignment. Use PC-relative instructions instead.
497 void j(int64_t target);
498 void jal(int64_t target);
499 void j(Label* target);
500 void jal(Label* target);
501
502 // -------Data-processing-instructions---------
503
504 // Arithmetic.
505 void addu(Register rd, Register rs, Register rt);
506 void subu(Register rd, Register rs, Register rt);
507
508 void div(Register rs, Register rt);
509 void divu(Register rs, Register rt);
510 void ddiv(Register rs, Register rt);
511 void ddivu(Register rs, Register rt);
512 void div(Register rd, Register rs, Register rt);
513 void divu(Register rd, Register rs, Register rt);
514 void ddiv(Register rd, Register rs, Register rt);
515 void ddivu(Register rd, Register rs, Register rt);
516 void mod(Register rd, Register rs, Register rt);
517 void modu(Register rd, Register rs, Register rt);
518 void dmod(Register rd, Register rs, Register rt);
519 void dmodu(Register rd, Register rs, Register rt);
520
521 void mul(Register rd, Register rs, Register rt);
522 void muh(Register rd, Register rs, Register rt);
523 void mulu(Register rd, Register rs, Register rt);
524 void muhu(Register rd, Register rs, Register rt);
525 void mult(Register rs, Register rt);
526 void multu(Register rs, Register rt);
527 void dmul(Register rd, Register rs, Register rt);
528 void dmuh(Register rd, Register rs, Register rt);
529 void dmulu(Register rd, Register rs, Register rt);
530 void dmuhu(Register rd, Register rs, Register rt);
531 void daddu(Register rd, Register rs, Register rt);
532 void dsubu(Register rd, Register rs, Register rt);
533 void dmult(Register rs, Register rt);
535
536 void addiu(Register rd, Register rs, int32_t j);
537 void daddiu(Register rd, Register rs, int32_t j);
538
539 // Logical.
540 void and_(Register rd, Register rs, Register rt);
541 void or_(Register rd, Register rs, Register rt);
542 void xor_(Register rd, Register rs, Register rt);
543 void nor(Register rd, Register rs, Register rt);
544
545 void andi(Register rd, Register rs, int32_t j);
546 void ori(Register rd, Register rs, int32_t j);
547 void xori(Register rd, Register rs, int32_t j);
548 void lui(Register rd, int32_t j);
549 void aui(Register rt, Register rs, int32_t j);
550 void daui(Register rt, Register rs, int32_t j);
551 void dahi(Register rs, int32_t j);
552 void dati(Register rs, int32_t j);
553
554 // Shifts.
555 // Please note: sll(zero_reg, zero_reg, x) instructions are reserved as nop
556 // and may cause problems in normal code. coming_from_nop makes sure this
557 // doesn't happen.
558 void sll(Register rd, Register rt, uint16_t sa, bool coming_from_nop = false);
559 void sllv(Register rd, Register rt, Register rs);
560 void srl(Register rd, Register rt, uint16_t sa);
561 void srlv(Register rd, Register rt, Register rs);
562 void sra(Register rt, Register rd, uint16_t sa);
563 void srav(Register rt, Register rd, Register rs);
564 void rotr(Register rd, Register rt, uint16_t sa);
565 void rotrv(Register rd, Register rt, Register rs);
566 void dsll(Register rd, Register rt, uint16_t sa);
567 void dsllv(Register rd, Register rt, Register rs);
568 void dsrl(Register rd, Register rt, uint16_t sa);
569 void dsrlv(Register rd, Register rt, Register rs);
570 void drotr(Register rd, Register rt, uint16_t sa);
571 void drotr32(Register rd, Register rt, uint16_t sa);
573 void dsra(Register rt, Register rd, uint16_t sa);
574 void dsrav(Register rd, Register rt, Register rs);
575 void dsll32(Register rt, Register rd, uint16_t sa);
576 void dsrl32(Register rt, Register rd, uint16_t sa);
577 void dsra32(Register rt, Register rd, uint16_t sa);
578
579 // ------------Memory-instructions-------------
580
581 void lb(Register rd, const MemOperand& rs);
582 void lbu(Register rd, const MemOperand& rs);
583 void lh(Register rd, const MemOperand& rs);
584 void lhu(Register rd, const MemOperand& rs);
585 void lw(Register rd, const MemOperand& rs);
586 void lwu(Register rd, const MemOperand& rs);
587 void lwl(Register rd, const MemOperand& rs);
588 void lwr(Register rd, const MemOperand& rs);
589 void sb(Register rd, const MemOperand& rs);
590 void sh(Register rd, const MemOperand& rs);
591 void sw(Register rd, const MemOperand& rs);
592 void swl(Register rd, const MemOperand& rs);
593 void swr(Register rd, const MemOperand& rs);
594 void ldl(Register rd, const MemOperand& rs);
595 void ldr(Register rd, const MemOperand& rs);
596 void sdl(Register rd, const MemOperand& rs);
597 void sdr(Register rd, const MemOperand& rs);
598 void ld(Register rd, const MemOperand& rs);
599 void sd(Register rd, const MemOperand& rs);
600
601 // ----------Atomic instructions--------------
602
603 void ll(Register rd, const MemOperand& rs);
604 void sc(Register rd, const MemOperand& rs);
605 void lld(Register rd, const MemOperand& rs);
606 void scd(Register rd, const MemOperand& rs);
607
608 // ---------PC-Relative-instructions-----------
609
610 void addiupc(Register rs, int32_t imm19);
611 void lwpc(Register rs, int32_t offset19);
612 void lwupc(Register rs, int32_t offset19);
613 void ldpc(Register rs, int32_t offset18);
614 void auipc(Register rs, int16_t imm16);
615 void aluipc(Register rs, int16_t imm16);
616
617 // ----------------Prefetch--------------------
618
619 void pref(int32_t hint, const MemOperand& rs);
620
621 // -------------Misc-instructions--------------
622
623 // Break / Trap instructions.
624 void break_(uint32_t code, bool break_as_stop = false);
625 void stop(uint32_t code = kMaxStopCode);
626 void tge(Register rs, Register rt, uint16_t code);
627 void tgeu(Register rs, Register rt, uint16_t code);
628 void tlt(Register rs, Register rt, uint16_t code);
629 void tltu(Register rs, Register rt, uint16_t code);
630 void teq(Register rs, Register rt, uint16_t code);
631 void tne(Register rs, Register rt, uint16_t code);
632
633 // Memory barrier instruction.
634 void sync();
635
636 // Move from HI/LO register.
637 void mfhi(Register rd);
638 void mflo(Register rd);
639
640 // Set on less than.
641 void slt(Register rd, Register rs, Register rt);
642 void sltu(Register rd, Register rs, Register rt);
643 void slti(Register rd, Register rs, int32_t j);
644 void sltiu(Register rd, Register rs, int32_t j);
645
646 // Conditional move.
647 void movz(Register rd, Register rs, Register rt);
648 void movn(Register rd, Register rs, Register rt);
649 void movt(Register rd, Register rs, uint16_t cc = 0);
650 void movf(Register rd, Register rs, uint16_t cc = 0);
651
657 FPURegister ft);
660 FPURegister ft);
665
668 void movt_s(FPURegister fd, FPURegister fs, uint16_t cc = 0);
669 void movt_d(FPURegister fd, FPURegister fs, uint16_t cc = 0);
670 void movf_s(FPURegister fd, FPURegister fs, uint16_t cc = 0);
671 void movf_d(FPURegister fd, FPURegister fs, uint16_t cc = 0);
674 // Bit twiddling.
675 void clz(Register rd, Register rs);
676 void dclz(Register rd, Register rs);
677 void ins_(Register rt, Register rs, uint16_t pos, uint16_t size);
678 void ext_(Register rt, Register rs, uint16_t pos, uint16_t size);
679 void dext_(Register rt, Register rs, uint16_t pos, uint16_t size);
680 void dextm_(Register rt, Register rs, uint16_t pos, uint16_t size);
681 void dextu_(Register rt, Register rs, uint16_t pos, uint16_t size);
682 void dins_(Register rt, Register rs, uint16_t pos, uint16_t size);
683 void dinsm_(Register rt, Register rs, uint16_t pos, uint16_t size);
684 void dinsu_(Register rt, Register rs, uint16_t pos, uint16_t size);
687 void align(Register rd, Register rs, Register rt, uint8_t bp);
688 void dalign(Register rd, Register rs, Register rt, uint8_t bp);
689
690 void wsbh(Register rd, Register rt);
691 void dsbh(Register rd, Register rt);
692 void dshd(Register rd, Register rt);
693 void seh(Register rd, Register rt);
694 void seb(Register rd, Register rt);
695
696 // --------Coprocessor-instructions----------------
697
698 // Load, store, and move.
699 void lwc1(FPURegister fd, const MemOperand& src);
700 void ldc1(FPURegister fd, const MemOperand& src);
701
702 void swc1(FPURegister fs, const MemOperand& dst);
703 void sdc1(FPURegister fs, const MemOperand& dst);
704
708
712
715
716 // Arithmetic.
745
746 // Conversion.
760
771
774
787
791
795
796 // Conditions and branches for MIPSr6.
798 FPURegister ft, FPURegister fs);
801
802 void bc1eqz(int16_t offset, FPURegister ft);
803 inline void bc1eqz(Label* L, FPURegister ft) {
804 bc1eqz(shifted_branch_offset(L), ft);
805 }
806 void bc1nez(int16_t offset, FPURegister ft);
807 inline void bc1nez(Label* L, FPURegister ft) {
808 bc1nez(shifted_branch_offset(L), ft);
809 }
810
811 // Conditions and branches for non MIPSr6.
813 uint16_t cc = 0);
814 void c_s(FPUCondition cond, FPURegister ft, FPURegister fs, uint16_t cc = 0);
815 void c_d(FPUCondition cond, FPURegister ft, FPURegister fs, uint16_t cc = 0);
816
817 void bc1f(int16_t offset, uint16_t cc = 0);
818 inline void bc1f(Label* L, uint16_t cc = 0) {
819 bc1f(shifted_branch_offset(L), cc);
820 }
821 void bc1t(int16_t offset, uint16_t cc = 0);
822 inline void bc1t(Label* L, uint16_t cc = 0) {
823 bc1t(shifted_branch_offset(L), cc);
824 }
825 void fcmp(FPURegister src1, const double src2, FPUCondition cond);
826
827 // MSA instructions
828 void bz_v(MSARegister wt, int16_t offset);
829 inline void bz_v(MSARegister wt, Label* L) {
830 bz_v(wt, shifted_branch_offset(L));
831 }
832 void bz_b(MSARegister wt, int16_t offset);
833 inline void bz_b(MSARegister wt, Label* L) {
834 bz_b(wt, shifted_branch_offset(L));
835 }
836 void bz_h(MSARegister wt, int16_t offset);
837 inline void bz_h(MSARegister wt, Label* L) {
838 bz_h(wt, shifted_branch_offset(L));
839 }
840 void bz_w(MSARegister wt, int16_t offset);
841 inline void bz_w(MSARegister wt, Label* L) {
842 bz_w(wt, shifted_branch_offset(L));
843 }
844 void bz_d(MSARegister wt, int16_t offset);
845 inline void bz_d(MSARegister wt, Label* L) {
846 bz_d(wt, shifted_branch_offset(L));
847 }
848 void bnz_v(MSARegister wt, int16_t offset);
849 inline void bnz_v(MSARegister wt, Label* L) {
850 bnz_v(wt, shifted_branch_offset(L));
851 }
852 void bnz_b(MSARegister wt, int16_t offset);
853 inline void bnz_b(MSARegister wt, Label* L) {
854 bnz_b(wt, shifted_branch_offset(L));
855 }
856 void bnz_h(MSARegister wt, int16_t offset);
857 inline void bnz_h(MSARegister wt, Label* L) {
858 bnz_h(wt, shifted_branch_offset(L));
859 }
860 void bnz_w(MSARegister wt, int16_t offset);
861 inline void bnz_w(MSARegister wt, Label* L) {
862 bnz_w(wt, shifted_branch_offset(L));
863 }
864 void bnz_d(MSARegister wt, int16_t offset);
865 inline void bnz_d(MSARegister wt, Label* L) {
866 bnz_d(wt, shifted_branch_offset(L));
867 }
868
869 void ld_b(MSARegister wd, const MemOperand& rs);
870 void ld_h(MSARegister wd, const MemOperand& rs);
871 void ld_w(MSARegister wd, const MemOperand& rs);
872 void ld_d(MSARegister wd, const MemOperand& rs);
873 void st_b(MSARegister wd, const MemOperand& rs);
874 void st_h(MSARegister wd, const MemOperand& rs);
875 void st_w(MSARegister wd, const MemOperand& rs);
876 void st_d(MSARegister wd, const MemOperand& rs);
877
878 void ldi_b(MSARegister wd, int32_t imm10);
879 void ldi_h(MSARegister wd, int32_t imm10);
880 void ldi_w(MSARegister wd, int32_t imm10);
881 void ldi_d(MSARegister wd, int32_t imm10);
882
883 void addvi_b(MSARegister wd, MSARegister ws, uint32_t imm5);
884 void addvi_h(MSARegister wd, MSARegister ws, uint32_t imm5);
885 void addvi_w(MSARegister wd, MSARegister ws, uint32_t imm5);
886 void addvi_d(MSARegister wd, MSARegister ws, uint32_t imm5);
887 void subvi_b(MSARegister wd, MSARegister ws, uint32_t imm5);
888 void subvi_h(MSARegister wd, MSARegister ws, uint32_t imm5);
889 void subvi_w(MSARegister wd, MSARegister ws, uint32_t imm5);
890 void subvi_d(MSARegister wd, MSARegister ws, uint32_t imm5);
891 void maxi_s_b(MSARegister wd, MSARegister ws, uint32_t imm5);
892 void maxi_s_h(MSARegister wd, MSARegister ws, uint32_t imm5);
893 void maxi_s_w(MSARegister wd, MSARegister ws, uint32_t imm5);
894 void maxi_s_d(MSARegister wd, MSARegister ws, uint32_t imm5);
895 void maxi_u_b(MSARegister wd, MSARegister ws, uint32_t imm5);
896 void maxi_u_h(MSARegister wd, MSARegister ws, uint32_t imm5);
897 void maxi_u_w(MSARegister wd, MSARegister ws, uint32_t imm5);
898 void maxi_u_d(MSARegister wd, MSARegister ws, uint32_t imm5);
899 void mini_s_b(MSARegister wd, MSARegister ws, uint32_t imm5);
900 void mini_s_h(MSARegister wd, MSARegister ws, uint32_t imm5);
901 void mini_s_w(MSARegister wd, MSARegister ws, uint32_t imm5);
902 void mini_s_d(MSARegister wd, MSARegister ws, uint32_t imm5);
903 void mini_u_b(MSARegister wd, MSARegister ws, uint32_t imm5);
904 void mini_u_h(MSARegister wd, MSARegister ws, uint32_t imm5);
905 void mini_u_w(MSARegister wd, MSARegister ws, uint32_t imm5);
906 void mini_u_d(MSARegister wd, MSARegister ws, uint32_t imm5);
907 void ceqi_b(MSARegister wd, MSARegister ws, uint32_t imm5);
908 void ceqi_h(MSARegister wd, MSARegister ws, uint32_t imm5);
909 void ceqi_w(MSARegister wd, MSARegister ws, uint32_t imm5);
910 void ceqi_d(MSARegister wd, MSARegister ws, uint32_t imm5);
911 void clti_s_b(MSARegister wd, MSARegister ws, uint32_t imm5);
912 void clti_s_h(MSARegister wd, MSARegister ws, uint32_t imm5);
913 void clti_s_w(MSARegister wd, MSARegister ws, uint32_t imm5);
914 void clti_s_d(MSARegister wd, MSARegister ws, uint32_t imm5);
915 void clti_u_b(MSARegister wd, MSARegister ws, uint32_t imm5);
916 void clti_u_h(MSARegister wd, MSARegister ws, uint32_t imm5);
917 void clti_u_w(MSARegister wd, MSARegister ws, uint32_t imm5);
918 void clti_u_d(MSARegister wd, MSARegister ws, uint32_t imm5);
919 void clei_s_b(MSARegister wd, MSARegister ws, uint32_t imm5);
920 void clei_s_h(MSARegister wd, MSARegister ws, uint32_t imm5);
921 void clei_s_w(MSARegister wd, MSARegister ws, uint32_t imm5);
922 void clei_s_d(MSARegister wd, MSARegister ws, uint32_t imm5);
923 void clei_u_b(MSARegister wd, MSARegister ws, uint32_t imm5);
924 void clei_u_h(MSARegister wd, MSARegister ws, uint32_t imm5);
925 void clei_u_w(MSARegister wd, MSARegister ws, uint32_t imm5);
926 void clei_u_d(MSARegister wd, MSARegister ws, uint32_t imm5);
927
928 void andi_b(MSARegister wd, MSARegister ws, uint32_t imm8);
929 void ori_b(MSARegister wd, MSARegister ws, uint32_t imm8);
930 void nori_b(MSARegister wd, MSARegister ws, uint32_t imm8);
931 void xori_b(MSARegister wd, MSARegister ws, uint32_t imm8);
932 void bmnzi_b(MSARegister wd, MSARegister ws, uint32_t imm8);
933 void bmzi_b(MSARegister wd, MSARegister ws, uint32_t imm8);
934 void bseli_b(MSARegister wd, MSARegister ws, uint32_t imm8);
935 void shf_b(MSARegister wd, MSARegister ws, uint32_t imm8);
936 void shf_h(MSARegister wd, MSARegister ws, uint32_t imm8);
937 void shf_w(MSARegister wd, MSARegister ws, uint32_t imm8);
938
946
963
996
1257
1340
1341 void sldi_b(MSARegister wd, MSARegister ws, uint32_t n);
1342 void sldi_h(MSARegister wd, MSARegister ws, uint32_t n);
1343 void sldi_w(MSARegister wd, MSARegister ws, uint32_t n);
1344 void sldi_d(MSARegister wd, MSARegister ws, uint32_t n);
1345 void splati_b(MSARegister wd, MSARegister ws, uint32_t n);
1346 void splati_h(MSARegister wd, MSARegister ws, uint32_t n);
1347 void splati_w(MSARegister wd, MSARegister ws, uint32_t n);
1348 void splati_d(MSARegister wd, MSARegister ws, uint32_t n);
1349 void copy_s_b(Register rd, MSARegister ws, uint32_t n);
1350 void copy_s_h(Register rd, MSARegister ws, uint32_t n);
1351 void copy_s_w(Register rd, MSARegister ws, uint32_t n);
1352 void copy_s_d(Register rd, MSARegister ws, uint32_t n);
1353 void copy_u_b(Register rd, MSARegister ws, uint32_t n);
1354 void copy_u_h(Register rd, MSARegister ws, uint32_t n);
1355 void copy_u_w(Register rd, MSARegister ws, uint32_t n);
1356 void insert_b(MSARegister wd, uint32_t n, Register rs);
1357 void insert_h(MSARegister wd, uint32_t n, Register rs);
1358 void insert_w(MSARegister wd, uint32_t n, Register rs);
1359 void insert_d(MSARegister wd, uint32_t n, Register rs);
1360 void insve_b(MSARegister wd, uint32_t n, MSARegister ws);
1361 void insve_h(MSARegister wd, uint32_t n, MSARegister ws);
1362 void insve_w(MSARegister wd, uint32_t n, MSARegister ws);
1363 void insve_d(MSARegister wd, uint32_t n, MSARegister ws);
1367
1368 void slli_b(MSARegister wd, MSARegister ws, uint32_t m);
1369 void slli_h(MSARegister wd, MSARegister ws, uint32_t m);
1370 void slli_w(MSARegister wd, MSARegister ws, uint32_t m);
1371 void slli_d(MSARegister wd, MSARegister ws, uint32_t m);
1372 void srai_b(MSARegister wd, MSARegister ws, uint32_t m);
1373 void srai_h(MSARegister wd, MSARegister ws, uint32_t m);
1374 void srai_w(MSARegister wd, MSARegister ws, uint32_t m);
1375 void srai_d(MSARegister wd, MSARegister ws, uint32_t m);
1376 void srli_b(MSARegister wd, MSARegister ws, uint32_t m);
1377 void srli_h(MSARegister wd, MSARegister ws, uint32_t m);
1378 void srli_w(MSARegister wd, MSARegister ws, uint32_t m);
1379 void srli_d(MSARegister wd, MSARegister ws, uint32_t m);
1380 void bclri_b(MSARegister wd, MSARegister ws, uint32_t m);
1381 void bclri_h(MSARegister wd, MSARegister ws, uint32_t m);
1382 void bclri_w(MSARegister wd, MSARegister ws, uint32_t m);
1383 void bclri_d(MSARegister wd, MSARegister ws, uint32_t m);
1384 void bseti_b(MSARegister wd, MSARegister ws, uint32_t m);
1385 void bseti_h(MSARegister wd, MSARegister ws, uint32_t m);
1386 void bseti_w(MSARegister wd, MSARegister ws, uint32_t m);
1387 void bseti_d(MSARegister wd, MSARegister ws, uint32_t m);
1388 void bnegi_b(MSARegister wd, MSARegister ws, uint32_t m);
1389 void bnegi_h(MSARegister wd, MSARegister ws, uint32_t m);
1390 void bnegi_w(MSARegister wd, MSARegister ws, uint32_t m);
1391 void bnegi_d(MSARegister wd, MSARegister ws, uint32_t m);
1392 void binsli_b(MSARegister wd, MSARegister ws, uint32_t m);
1393 void binsli_h(MSARegister wd, MSARegister ws, uint32_t m);
1394 void binsli_w(MSARegister wd, MSARegister ws, uint32_t m);
1395 void binsli_d(MSARegister wd, MSARegister ws, uint32_t m);
1396 void binsri_b(MSARegister wd, MSARegister ws, uint32_t m);
1397 void binsri_h(MSARegister wd, MSARegister ws, uint32_t m);
1398 void binsri_w(MSARegister wd, MSARegister ws, uint32_t m);
1399 void binsri_d(MSARegister wd, MSARegister ws, uint32_t m);
1400 void sat_s_b(MSARegister wd, MSARegister ws, uint32_t m);
1401 void sat_s_h(MSARegister wd, MSARegister ws, uint32_t m);
1402 void sat_s_w(MSARegister wd, MSARegister ws, uint32_t m);
1403 void sat_s_d(MSARegister wd, MSARegister ws, uint32_t m);
1404 void sat_u_b(MSARegister wd, MSARegister ws, uint32_t m);
1405 void sat_u_h(MSARegister wd, MSARegister ws, uint32_t m);
1406 void sat_u_w(MSARegister wd, MSARegister ws, uint32_t m);
1407 void sat_u_d(MSARegister wd, MSARegister ws, uint32_t m);
1408 void srari_b(MSARegister wd, MSARegister ws, uint32_t m);
1409 void srari_h(MSARegister wd, MSARegister ws, uint32_t m);
1410 void srari_w(MSARegister wd, MSARegister ws, uint32_t m);
1411 void srari_d(MSARegister wd, MSARegister ws, uint32_t m);
1412 void srlri_b(MSARegister wd, MSARegister ws, uint32_t m);
1413 void srlri_h(MSARegister wd, MSARegister ws, uint32_t m);
1414 void srlri_w(MSARegister wd, MSARegister ws, uint32_t m);
1415 void srlri_d(MSARegister wd, MSARegister ws, uint32_t m);
1416
1417 // Check the code size generated from label to here.
1419 return pc_offset() - label->pos();
1420 }
1421
1422 // Check the number of instructions generated from label to here.
1424 return SizeOfCodeGeneratedSince(label) / kInstrSize;
1425 }
1426
1427 // Class for scoping postponing the trampoline pool generation.
1428 class V8_NODISCARD BlockTrampolinePoolScope {
1429 public:
1430 explicit BlockTrampolinePoolScope(Assembler* assem) : assem_(assem) {
1431 assem_->StartBlockTrampolinePool();
1432 }
1433 ~BlockTrampolinePoolScope() { assem_->EndBlockTrampolinePool(); }
1434
1435 private:
1436 Assembler* assem_;
1437
1439 };
1440
1441 // Class for postponing the assembly buffer growth. Typically used for
1442 // sequences of instructions that must be emitted as a unit, before
1443 // buffer growth (and relocation) can occur.
1444 // This blocking scope is not nestable.
1446 public:
1447 explicit BlockGrowBufferScope(Assembler* assem) : assem_(assem) {
1448 assem_->StartBlockGrowBuffer();
1449 }
1450 ~BlockGrowBufferScope() { assem_->EndBlockGrowBuffer(); }
1451
1452 private:
1453 Assembler* assem_;
1454
1456 };
1457
1458 // Record a deoptimization reason that can be used by a log or cpu profiler.
1459 // Use --trace-deopt to enable.
1460 void RecordDeoptReason(DeoptimizeReason reason, uint32_t node_id,
1461 SourcePosition position, int id);
1462
1464 RelocInfo::Mode rmode, Address pc, intptr_t pc_delta,
1465 WritableJitAllocation* jit_allocation = nullptr);
1466
1467 // Writes a single byte or word of data in the code stream. Used for
1468 // inline tables, e.g., jump-tables.
1469 void db(uint8_t data);
1470 void dd(uint32_t data);
1471 void dq(uint64_t data);
1472 void dp(uintptr_t data) { dq(data); }
1474
1475 // Postpone the generation of the trampoline pool for the specified number of
1476 // instructions.
1477 void BlockTrampolinePoolFor(int instructions);
1478
1479 // Check if there is less than kGap bytes available in the buffer.
1480 // If this is the case, we need to grow the buffer before emitting
1481 // an instruction or relocation information.
1482 inline bool overflow() const { return pc_ >= reloc_info_writer.pos() - kGap; }
1483
1484 // Get the number of bytes available in the buffer.
1485 inline intptr_t available_space() const {
1486 return reloc_info_writer.pos() - pc_;
1487 }
1488
1489 // Read/patch instructions.
1490 static Instr instr_at(Address pc) { return *reinterpret_cast<Instr*>(pc); }
1491 static void instr_at_put(Address pc, Instr instr,
1492 WritableJitAllocation* jit_allocation = nullptr) {
1493 Instruction* i = reinterpret_cast<Instruction*>(pc);
1494 i->SetInstructionBits(instr, jit_allocation);
1495 }
1497 return *reinterpret_cast<Instr*>(buffer_start_ + pos);
1498 }
1500 WritableJitAllocation* jit_allocation = nullptr) {
1501 Instruction* i = reinterpret_cast<Instruction*>(buffer_start_ + pos);
1502 i->SetInstructionBits(instr, jit_allocation);
1503 }
1504
1505 // Check if an instruction is a branch of some kind.
1506 static bool IsBranch(Instr instr);
1508 static bool IsBc(Instr instr);
1509 static bool IsNal(Instr instr);
1510 static bool IsBzc(Instr instr);
1511
1512 static bool IsBeq(Instr instr);
1513 static bool IsBne(Instr instr);
1514 static bool IsBeqzc(Instr instr);
1515 static bool IsBnezc(Instr instr);
1516 static bool IsBeqc(Instr instr);
1517 static bool IsBnec(Instr instr);
1518
1519 static bool IsJump(Instr instr);
1520 static bool IsJ(Instr instr);
1521 static bool IsLui(Instr instr);
1522 static bool IsOri(Instr instr);
1523 static bool IsMov(Instr instr, Register rd, Register rs);
1524
1525 static bool IsJal(Instr instr);
1526 static bool IsJr(Instr instr);
1527 static bool IsJalr(Instr instr);
1528
1529 static bool IsNop(Instr instr, unsigned int type);
1530 static bool IsPop(Instr instr);
1531 static bool IsPush(Instr instr);
1536
1540
1541 static uint32_t GetRt(Instr instr);
1542 static uint32_t GetRtField(Instr instr);
1543 static uint32_t GetRs(Instr instr);
1544 static uint32_t GetRsField(Instr instr);
1545 static uint32_t GetRd(Instr instr);
1546 static uint32_t GetRdField(Instr instr);
1547 static uint32_t GetSa(Instr instr);
1548 static uint32_t GetSaField(Instr instr);
1549 static uint32_t GetOpcodeField(Instr instr);
1550 static uint32_t GetFunction(Instr instr);
1551 static uint32_t GetFunctionField(Instr instr);
1552 static uint32_t GetImmediate16(Instr instr);
1553 static uint32_t GetLabelConst(Instr instr);
1554
1555 static int32_t GetBranchOffset(Instr instr);
1556 static bool IsLw(Instr instr);
1557 static int16_t GetLwOffset(Instr instr);
1559
1560 static bool IsSw(Instr instr);
1564
1567
1569
1570 bool IsPrevInstrCompactBranch() { return prev_instr_compact_branch_; }
1572
1573 inline int UnboundLabelsCount() { return unbound_labels_count_; }
1574
1575 bool is_trampoline_emitted() const { return trampoline_emitted_; }
1576
1577 protected:
1578 // Load Scaled Address instructions.
1579 void lsa(Register rd, Register rt, Register rs, uint8_t sa);
1580 void dlsa(Register rd, Register rt, Register rs, uint8_t sa);
1581
1582 // Readable constants for base and offset adjustment helper, these indicate if
1583 // aside from offset, another value like offset + 4 should fit into int16.
1584 enum class OffsetAccessType : bool {
1585 SINGLE_ACCESS = false,
1586 TWO_ACCESSES = true
1587 };
1588
1589 // Helper function for memory load/store using base register and offset.
1591 MemOperand* src,
1592 OffsetAccessType access_type = OffsetAccessType::SINGLE_ACCESS,
1593 int second_access_add_to_offset = 4);
1594
1595 inline static void set_target_internal_reference_encoded_at(
1596 Address pc, Address target, WritableJitAllocation& jit_allocation);
1597
1598 int64_t buffer_space() const { return reloc_info_writer.pos() - pc_; }
1599
1600 // Decode branch instruction at pos and return branch target pos.
1601 int target_at(int pos, bool is_internal);
1602
1603 // Patch branch instruction at pos to branch to given branch target pos.
1604 void target_at_put(int pos, int target_pos, bool is_internal);
1605
1606 // Say if we need to relocate with this mode.
1608
1609 // Record reloc info for current pc_.
1610 void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0);
1611
1612 // Block the emission of the trampoline pool before pc_offset.
1614 if (no_trampoline_pool_before_ < pc_offset)
1615 no_trampoline_pool_before_ = pc_offset;
1616 }
1617
1618 void StartBlockTrampolinePool() { trampoline_pool_blocked_nesting_++; }
1619
1621 trampoline_pool_blocked_nesting_--;
1622 if (trampoline_pool_blocked_nesting_ == 0) {
1623 CheckTrampolinePoolQuick(1);
1624 }
1625 }
1626
1628 return trampoline_pool_blocked_nesting_ > 0;
1629 }
1630
1631 bool has_exception() const { return internal_trampoline_exception_; }
1632
1633 // Temporarily block automatic assembly buffer growth.
1635 DCHECK(!block_buffer_growth_);
1636 block_buffer_growth_ = true;
1637 }
1638
1640 DCHECK(block_buffer_growth_);
1641 block_buffer_growth_ = false;
1642 }
1643
1644 bool is_buffer_growth_blocked() const { return block_buffer_growth_; }
1645
1647 if (IsPrevInstrCompactBranch()) {
1648 nop();
1649 }
1650 }
1651
1652 void CheckTrampolinePoolQuick(int extra_instructions = 0) {
1653 if (pc_offset() >= next_buffer_check_ - extra_instructions * kInstrSize) {
1654 CheckTrampolinePool();
1655 }
1656 }
1657
1658 void set_pc_for_safepoint() { pc_for_safepoint_ = pc_; }
1659
1660 private:
1661 // Avoid overflows for displacements etc.
1662 static const int kMaximalBufferSize = 512 * MB;
1663
1664 // Buffer size and constant pool distance are checked together at regular
1665 // intervals of kBufferCheckInterval emitted bytes.
1666 static constexpr int kBufferCheckInterval = 1 * KB / 2;
1667
1668 // InstructionStream generation.
1669 // The relocation writer's position is at least kGap bytes below the end of
1670 // the generated instructions. This is so that multi-instruction sequences do
1671 // not have to check for overflow. The same is true for writes of large
1672 // relocation info entries.
1673 static constexpr int kGap = 64;
1674 static_assert(AssemblerBase::kMinimalBufferSize >= 2 * kGap);
1675
1676 // Repeated checking whether the trampoline pool should be emitted is rather
1677 // expensive. By default we only check again once a number of instructions
1678 // has been generated.
1679 static constexpr int kCheckConstIntervalInst = 32;
1680 static constexpr int kCheckConstInterval =
1681 kCheckConstIntervalInst * kInstrSize;
1682
1683 int next_buffer_check_; // pc offset of next buffer check.
1684
1685 // Emission of the trampoline pool may be blocked in some code sequences.
1686 int trampoline_pool_blocked_nesting_; // Block emission if this is not zero.
1687 int no_trampoline_pool_before_; // Block emission before this pc offset.
1688
1689 // Keep track of the last emitted pool to guarantee a maximal distance.
1690 int last_trampoline_pool_end_; // pc offset of the end of the last pool.
1691
1692 // Automatic growth of the assembly buffer may be blocked for some sequences.
1693 bool block_buffer_growth_; // Block growth when true.
1694
1695 // Relocation information generation.
1696 // Each relocation is encoded as a variable size value.
1697 static constexpr int kMaxRelocSize = RelocInfoWriter::kMaxSize;
1698 RelocInfoWriter reloc_info_writer;
1699
1700 // The bound position, before this we cannot do instruction elimination.
1701 int last_bound_pos_;
1702
1703 // Readable constants for compact branch handling in emit()
1704 enum class CompactBranchType : bool { NO = false, COMPACT_BRANCH = true };
1705
1706 // InstructionStream emission.
1707 inline void CheckBuffer();
1709 inline void emit(Instr x,
1710 CompactBranchType is_compact_branch = CompactBranchType::NO);
1711 inline void emit(uint64_t x);
1712 inline void CheckForEmitInForbiddenSlot();
1713 template <typename T>
1714 inline void EmitHelper(T x);
1715 inline void EmitHelper(Instr x, CompactBranchType is_compact_branch);
1716
1717 // Instruction generation.
1718 // We have 3 different kind of encoding layout on MIPS.
1719 // However due to many different types of objects encoded in the same fields
1720 // we have quite a few aliases for each mode.
1721 // Using the same structure to refer to Register and FPURegister would spare a
1722 // few aliases, but mixing both does not look clean to me.
1723 // Anyway we could surely implement this differently.
1724
1726 uint16_t sa = 0, SecondaryField func = nullptrSF);
1727
1728 void GenInstrRegister(Opcode opcode, Register rs, Register rt, uint16_t msb,
1729 uint16_t lsb, SecondaryField func);
1730
1732 FPURegister fs, FPURegister fd,
1733 SecondaryField func = nullptrSF);
1734
1736 FPURegister fs, FPURegister fd,
1737 SecondaryField func = nullptrSF);
1738
1740 FPURegister fs, FPURegister fd,
1741 SecondaryField func = nullptrSF);
1742
1744 FPUControlRegister fs, SecondaryField func = nullptrSF);
1745
1747 Opcode opcode, Register rs, Register rt, int32_t j,
1748 CompactBranchType is_compact_branch = CompactBranchType::NO);
1750 Opcode opcode, Register rs, SecondaryField SF, int32_t j,
1751 CompactBranchType is_compact_branch = CompactBranchType::NO);
1753 Opcode opcode, Register r1, FPURegister r2, int32_t j,
1754 CompactBranchType is_compact_branch = CompactBranchType::NO);
1756 int32_t offset9, int bit6, SecondaryField func);
1758 Opcode opcode, Register rs, int32_t offset21,
1759 CompactBranchType is_compact_branch = CompactBranchType::NO);
1760 void GenInstrImmediate(Opcode opcode, Register rs, uint32_t offset21);
1762 Opcode opcode, int32_t offset26,
1763 CompactBranchType is_compact_branch = CompactBranchType::NO);
1764
1765 void GenInstrJump(Opcode opcode, uint32_t address);
1766
1767 // MSA
1768 void GenInstrMsaI8(SecondaryField operation, uint32_t imm8, MSARegister ws,
1769 MSARegister wd);
1770
1771 void GenInstrMsaI5(SecondaryField operation, SecondaryField df, int32_t imm5,
1772 MSARegister ws, MSARegister wd);
1773
1774 void GenInstrMsaBit(SecondaryField operation, SecondaryField df, uint32_t m,
1775 MSARegister ws, MSARegister wd);
1776
1778 int32_t imm10, MSARegister wd);
1779
1780 template <typename RegType>
1781 void GenInstrMsa3R(SecondaryField operation, SecondaryField df, RegType t,
1782 MSARegister ws, MSARegister wd);
1783
1784 template <typename DstType, typename SrcType>
1785 void GenInstrMsaElm(SecondaryField operation, SecondaryField df, uint32_t n,
1786 SrcType src, DstType dst);
1787
1788 void GenInstrMsa3RF(SecondaryField operation, uint32_t df, MSARegister wt,
1789 MSARegister ws, MSARegister wd);
1790
1792 MSARegister wd);
1793
1794 void GenInstrMsaMI10(SecondaryField operation, int32_t s10, Register rs,
1795 MSARegister wd);
1796
1798 MSARegister ws, MSARegister wd);
1799
1801 MSARegister ws, MSARegister wd);
1802
1804 int32_t offset16);
1805
1806 inline bool is_valid_msa_df_m(SecondaryField bit_df, uint32_t m) {
1807 switch (bit_df) {
1808 case BIT_DF_b:
1809 return is_uint3(m);
1810 case BIT_DF_h:
1811 return is_uint4(m);
1812 case BIT_DF_w:
1813 return is_uint5(m);
1814 case BIT_DF_d:
1815 return is_uint6(m);
1816 default:
1817 return false;
1818 }
1819 }
1820
1821 inline bool is_valid_msa_df_n(SecondaryField elm_df, uint32_t n) {
1822 switch (elm_df) {
1823 case ELM_DF_B:
1824 return is_uint4(n);
1825 case ELM_DF_H:
1826 return is_uint3(n);
1827 case ELM_DF_W:
1828 return is_uint2(n);
1829 case ELM_DF_D:
1830 return is_uint1(n);
1831 default:
1832 return false;
1833 }
1834 }
1835
1836 // Labels.
1837 void print(const Label* L);
1838 void bind_to(Label* L, int pos);
1839 void next(Label* L, bool is_internal);
1840
1841 // One trampoline consists of:
1842 // - space for trampoline slots,
1843 // - space for labels.
1844 //
1845 // Space for trampoline slots is equal to slot_count * 2 * kInstrSize.
1846 // Space for trampoline slots precedes space for labels. Each label is of one
1847 // instruction size, so total amount for labels is equal to
1848 // label_count * kInstrSize.
1849 class Trampoline {
1850 public:
1852 start_ = 0;
1853 next_slot_ = 0;
1854 free_slot_count_ = 0;
1855 end_ = 0;
1856 }
1857 Trampoline(int start, int slot_count) {
1858 start_ = start;
1859 next_slot_ = start;
1860 free_slot_count_ = slot_count;
1861 end_ = start + slot_count * kTrampolineSlotsSize;
1862 }
1863 int start() { return start_; }
1864 int end() { return end_; }
1866 int trampoline_slot = kInvalidSlotPos;
1867 if (free_slot_count_ <= 0) {
1868 // We have run out of space on trampolines.
1869 // Make sure we fail in debug mode, so we become aware of each case
1870 // when this happens.
1871 DCHECK(0);
1872 // Internal exception will be caught.
1873 } else {
1874 trampoline_slot = next_slot_;
1875 free_slot_count_--;
1876 next_slot_ += kTrampolineSlotsSize;
1877 }
1878 return trampoline_slot;
1879 }
1880
1881 private:
1882 int start_;
1883 int end_;
1884 int next_slot_;
1885 int free_slot_count_;
1886 };
1887
1888 int32_t get_trampoline_entry(int32_t pos);
1889 int unbound_labels_count_;
1890 // After trampoline is emitted, long branches are used in generated code for
1891 // the forward branches whose target offsets could be beyond reach of branch
1892 // instruction. We use this information to trigger different mode of
1893 // branch instruction generation, where we use jump instructions rather
1894 // than regular branch instructions.
1895 bool trampoline_emitted_;
1896 static constexpr int kInvalidSlotPos = -1;
1897
1898 // Internal reference positions, required for unbounded internal reference
1899 // labels.
1900 std::set<int64_t> internal_reference_positions_;
1902 return internal_reference_positions_.find(L->pos()) !=
1903 internal_reference_positions_.end();
1904 }
1905
1906 void EmittedCompactBranchInstruction() { prev_instr_compact_branch_ = true; }
1907 void ClearCompactBranchState() { prev_instr_compact_branch_ = false; }
1908 bool prev_instr_compact_branch_ = false;
1909
1910 Trampoline trampoline_;
1911 bool internal_trampoline_exception_;
1912
1913 // Keep track of the last Call's position to ensure that safepoint can get the
1914 // correct information even if there is a trampoline immediately after the
1915 // Call.
1916 uint8_t* pc_for_safepoint_;
1917
1918 RegList scratch_register_list_;
1919
1920 private:
1922
1924
1926 friend class RelocInfo;
1927 friend class BlockTrampolinePoolScope;
1928 friend class EnsureSpace;
1929};
1930
1931class EnsureSpace {
1932 public:
1933 explicit inline EnsureSpace(Assembler* assembler);
1934};
1935
1937 public:
1939 : available_(assembler->GetScratchRegisterList()),
1940 old_available_(*available_) {}
1941
1942 ~UseScratchRegisterScope() { *available_ = old_available_; }
1943
1945 return available_->PopFirst();
1946 }
1947
1948 bool hasAvailable() const { return !available_->is_empty(); }
1949
1950 void Include(const RegList& list) { *available_ |= list; }
1951 void Exclude(const RegList& list) { available_->clear(list); }
1952 void Include(const Register& reg1, const Register& reg2 = no_reg) {
1953 RegList list({reg1, reg2});
1954 Include(list);
1955 }
1956 void Exclude(const Register& reg1, const Register& reg2 = no_reg) {
1957 RegList list({reg1, reg2});
1958 Exclude(list);
1959 }
1960
1961 private:
1963 RegList old_available_;
1964};
1965
1966// Helper struct for load lane and store lane to indicate what memory size
1967// to be encoded in the opcode, and the new lane index.
1968class LoadStoreLaneParams {
1969 public:
1971 uint8_t laneidx;
1972
1974
1975 private:
1977 : sz(sz), laneidx(laneidx % lanes) {}
1978};
1979
1980} // namespace internal
1981} // namespace v8
1982
1983#endif // V8_CODEGEN_MIPS64_ASSEMBLER_MIPS64_H_
RegList available_
SourcePosition pos
DISALLOW_IMPLICIT_CONSTRUCTORS(BlockGrowBufferScope)
DISALLOW_IMPLICIT_CONSTRUCTORS(BlockTrampolinePoolScope)
Trampoline(int start, int slot_count)
void pcnt_b(MSARegister wd, MSARegister ws)
void mod_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void bind_to(Label *L, int pos)
void bal(int16_t offset)
void stop(uint32_t code=kMaxStopCode)
void beqc(Register rs, Register rt, int16_t offset)
void bset_b(MSARegister wd, MSARegister ws, MSARegister wt)
void bnegi_w(MSARegister wd, MSARegister ws, uint32_t m)
void AdjustBaseAndOffset(MemOperand *src, OffsetAccessType access_type=OffsetAccessType::SINGLE_ACCESS, int second_access_add_to_offset=4)
void clt_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrMsaBit(SecondaryField operation, SecondaryField df, uint32_t m, MSARegister ws, MSARegister wd)
void dsubu(Register rd, Register rs, Register rt)
static void set_target_value_at(Address pc, uint64_t target, WritableJitAllocation *jit_allocation=nullptr, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
void bltz(Register rs, int16_t offset)
void srli_d(MSARegister wd, MSARegister ws, uint32_t m)
void copy_u_h(Register rd, MSARegister ws, uint32_t n)
void ld(Register rd, const MemOperand &rs)
void dmuhu(Register rd, Register rs, Register rt)
void fcun_w(MSARegister wd, MSARegister ws, MSARegister wt)
void sd(Register rd, const MemOperand &rs)
void addv_b(MSARegister wd, MSARegister ws, MSARegister wt)
void aver_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void aver_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void GetCode(LocalIsolate *isolate, CodeDesc *desc)
void min_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void fill_w(MSARegister wd, Register rs)
void srari_w(MSARegister wd, MSARegister ws, uint32_t m)
void fcult_d(MSARegister wd, MSARegister ws, MSARegister wt)
void st_b(MSARegister wd, const MemOperand &rs)
void seb(Register rd, Register rt)
void dextm_(Register rt, Register rs, uint16_t pos, uint16_t size)
static bool IsBnec(Instr instr)
bool is_near(Label *L, OffsetSize bits)
void clti_u_h(MSARegister wd, MSARegister ws, uint32_t imm5)
void subsuu_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
bool is_buffer_growth_blocked() const
void mul_q_h(MSARegister wd, MSARegister ws, MSARegister wt)
bool is_internal_reference(Label *L)
void GenInstrImmediate(Opcode opcode, Register rs, uint32_t offset21)
void fcne_w(MSARegister wd, MSARegister ws, MSARegister wt)
uint64_t branch_long_offset(Label *L)
void dotp_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void slti(Register rd, Register rs, int32_t j)
void pckod_h(MSARegister wd, MSARegister ws, MSARegister wt)
void class_s(FPURegister fd, FPURegister fs)
void slt(Register rd, Register rs, Register rt)
void lwl(Register rd, const MemOperand &rs)
void jic(Register rt, int16_t offset)
void ilvev_h(MSARegister wd, MSARegister ws, MSARegister wt)
void add_d(FPURegister fd, FPURegister fs, FPURegister ft)
void div_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void clti_s_w(MSARegister wd, MSARegister ws, uint32_t imm5)
void lbu(Register rd, const MemOperand &rs)
void ave_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void dati(Register rs, int32_t j)
void movf(Register rd, Register rs, uint16_t cc=0)
static bool IsJ(Instr instr)
void bclr_b(MSARegister wd, MSARegister ws, MSARegister wt)
void break_(uint32_t code, bool break_as_stop=false)
void aver_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void hadd_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fadd_d(MSARegister wd, MSARegister ws, MSARegister wt)
void ffql_w(MSARegister wd, MSARegister ws)
void ceqi_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void bclri_h(MSARegister wd, MSARegister ws, uint32_t m)
void mfhc1(Register rt, FPURegister fs)
void splat_w(MSARegister wd, MSARegister ws, Register rt)
void bnezalc(Register rt, Label *L)
void bneg_b(MSARegister wd, MSARegister ws, MSARegister wt)
void fadd_w(MSARegister wd, MSARegister ws, MSARegister wt)
void label_at_put(Label *L, int at_offset)
void dmod(Register rd, Register rs, Register rt)
static bool IsPush(Instr instr)
void bgezal(Register rs, int16_t offset)
void cvt_s_w(FPURegister fd, FPURegister fs)
static bool IsJump(Instr instr)
void mulv_d(MSARegister wd, MSARegister ws, MSARegister wt)
void bgezc(Register rt, Label *L)
bool is_valid_msa_df_n(SecondaryField elm_df, uint32_t n)
void movz_s(FPURegister fd, FPURegister fs, Register rt)
void round_l_d(FPURegister fd, FPURegister fs)
void fill_d(MSARegister wd, Register rs)
void bgeuc(Register rs, Register rt, int16_t offset)
void fmax_w(MSARegister wd, MSARegister ws, MSARegister wt)
static uint32_t GetRtField(Instr instr)
void addu(Register rd, Register rs, Register rt)
void binsli_w(MSARegister wd, MSARegister ws, uint32_t m)
void fmin_d(MSARegister wd, MSARegister ws, MSARegister wt)
void dsra(Register rt, Register rd, uint16_t sa)
void GenInstrMsaBranch(SecondaryField operation, MSARegister wt, int32_t offset16)
void ftint_u_d(MSARegister wd, MSARegister ws)
void fexp2_w(MSARegister wd, MSARegister ws, MSARegister wt)
void asub_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void movz_d(FPURegister fd, FPURegister fs, Register rt)
void srli_b(MSARegister wd, MSARegister ws, uint32_t m)
void ftrunc_s_d(MSARegister wd, MSARegister ws)
void fmul_w(MSARegister wd, MSARegister ws, MSARegister wt)
void frint_w(MSARegister wd, MSARegister ws)
void adds_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void ffint_u_w(MSARegister wd, MSARegister ws)
void mina_s(FPURegister fd, FPURegister fs, FPURegister ft)
void mul_q_w(MSARegister wd, MSARegister ws, MSARegister wt)
void madd_q_w(MSARegister wd, MSARegister ws, MSARegister wt)
void fseq_w(MSARegister wd, MSARegister ws, MSARegister wt)
void dpadd_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void srai_b(MSARegister wd, MSARegister ws, uint32_t m)
void min_a_h(MSARegister wd, MSARegister ws, MSARegister wt)
void scd(Register rd, const MemOperand &rs)
void addvi_w(MSARegister wd, MSARegister ws, uint32_t imm5)
void vshf_d(MSARegister wd, MSARegister ws, MSARegister wt)
void hadd_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void max_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void pref(int32_t hint, const MemOperand &rs)
static bool IsLw(Instr instr)
void dmult(Register rs, Register rt)
void bset_w(MSARegister wd, MSARegister ws, MSARegister wt)
void ctc1(Register rt, FPUControlRegister fs)
void binsl_w(MSARegister wd, MSARegister ws, MSARegister wt)
void maddv_h(MSARegister wd, MSARegister ws, MSARegister wt)
void splati_b(MSARegister wd, MSARegister ws, uint32_t n)
void target_at_put(int pos, int target_pos, bool is_internal)
void mod_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void ceil_w_s(FPURegister fd, FPURegister fs)
void subs_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void ld_h(MSARegister wd, const MemOperand &rs)
void beqzalc(Register rt, int16_t offset)
void maxi_s_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void add_a_b(MSARegister wd, MSARegister ws, MSARegister wt)
void ffint_s_w(MSARegister wd, MSARegister ws)
void copy_u_b(Register rd, MSARegister ws, uint32_t n)
void hsub_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void beqc(Register rs, Register rt, Label *L)
void fsne_w(MSARegister wd, MSARegister ws, MSARegister wt)
void movn_d(FPURegister fd, FPURegister fs, Register rt)
void cle_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void ave_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void fcult_w(MSARegister wd, MSARegister ws, MSARegister wt)
static bool IsBzc(Instr instr)
void sra_h(MSARegister wd, MSARegister ws, MSARegister wt)
void jr(Register target)
void and_v(MSARegister wd, MSARegister ws, MSARegister wt)
void asub_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void lwr(Register rd, const MemOperand &rs)
void maddf_s(FPURegister fd, FPURegister fs, FPURegister ft)
void ori_b(MSARegister wd, MSARegister ws, uint32_t imm8)
void bgez(Register rs, int16_t offset)
void srari_d(MSARegister wd, MSARegister ws, uint32_t m)
void pckev_w(MSARegister wd, MSARegister ws, MSARegister wt)
void cmp(FPUCondition cond, SecondaryField fmt, FPURegister fd, FPURegister ft, FPURegister fs)
void fmax_a_d(MSARegister wd, MSARegister ws, MSARegister wt)
void copy_s_h(Register rd, MSARegister ws, uint32_t n)
void ffql_d(MSARegister wd, MSARegister ws)
void bnz_b(MSARegister wt, Label *L)
void subs_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
static uint32_t GetOpcodeField(Instr instr)
void seleqz(SecondaryField fmt, FPURegister fd, FPURegister fs, FPURegister ft)
void div_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void xor_v(MSARegister wd, MSARegister ws, MSARegister wt)
void swc1(FPURegister fs, const MemOperand &dst)
void cvt_l_s(FPURegister fd, FPURegister fs)
void dpadd_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void msubr_q_h(MSARegister wd, MSARegister ws, MSARegister wt)
void lb(Register rd, const MemOperand &rs)
void jalr(Register rs, Register rd=ra)
void binsli_d(MSARegister wd, MSARegister ws, uint32_t m)
void movz(Register rd, Register rs, Register rt)
void fcule_d(MSARegister wd, MSARegister ws, MSARegister wt)
void sltiu(Register rd, Register rs, int32_t j)
void maxa_s(FPURegister fd, FPURegister fs, FPURegister ft)
void ld_d(MSARegister wd, const MemOperand &rs)
void fsub_w(MSARegister wd, MSARegister ws, MSARegister wt)
static bool IsBne(Instr instr)
Assembler(const MaybeAssemblerZone &, const AssemblerOptions &options, std::unique_ptr< AssemblerBuffer > buffer={})
static bool IsPop(Instr instr)
void tltu(Register rs, Register rt, uint16_t code)
void tgeu(Register rs, Register rt, uint16_t code)
void max_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrMsa2RF(SecondaryField operation, SecondaryField df, MSARegister ws, MSARegister wd)
void ldi_b(MSARegister wd, int32_t imm10)
void mini_u_w(MSARegister wd, MSARegister ws, uint32_t imm5)
void bc1f(int16_t offset, uint16_t cc=0)
void asub_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void subs_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void shf_w(MSARegister wd, MSARegister ws, uint32_t imm8)
void jialc(Register rt, int16_t offset)
void bnezalc(Register rt, int16_t offset)
void insve_b(MSARegister wd, uint32_t n, MSARegister ws)
void dbitswap(Register rd, Register rt)
static int deserialization_special_target_size(Address instruction_payload)
void ceq_b(MSARegister wd, MSARegister ws, MSARegister wt)
void clti_s_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void madd_q_h(MSARegister wd, MSARegister ws, MSARegister wt)
void pcnt_h(MSARegister wd, MSARegister ws)
void bc1nez(int16_t offset, FPURegister ft)
void bc1eqz(int16_t offset, FPURegister ft)
static bool IsSwRegFpOffset(Instr instr)
void AllocateAndInstallRequestedHeapNumbers(LocalIsolate *isolate)
void mulu(Register rd, Register rs, Register rt)
void GenInstrJump(Opcode opcode, uint32_t address)
void min_a_b(MSARegister wd, MSARegister ws, MSARegister wt)
void fcmp(FPURegister src1, const double src2, FPUCondition cond)
void bltzalc(Register rt, Label *L)
void sdc1(FPURegister fs, const MemOperand &dst)
void dpsub_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void bltuc(Register rs, Register rt, int16_t offset)
void bnvc(Register rs, Register rt, Label *L)
void binsri_d(MSARegister wd, MSARegister ws, uint32_t m)
void divu(Register rd, Register rs, Register rt)
void mov_d(FPURegister fd, FPURegister fs)
void mflo(Register rd)
void min_d(FPURegister fd, FPURegister fs, FPURegister ft)
void modu(Register rd, Register rs, Register rt)
void rint_d(FPURegister fd, FPURegister fs)
void shf_b(MSARegister wd, MSARegister ws, uint32_t imm8)
void ddivu(Register rs, Register rt)
void lld(Register rd, const MemOperand &rs)
void bnec(Register rs, Register rt, Label *L)
void copy_s_b(Register rd, MSARegister ws, uint32_t n)
void st_w(MSARegister wd, const MemOperand &rs)
void dalign(Register rd, Register rs, Register rt, uint8_t bp)
void sll_w(MSARegister wd, MSARegister ws, MSARegister wt)
static uint32_t GetFunctionField(Instr instr)
void dpsub_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void next(Label *L, bool is_internal)
void maddv_w(MSARegister wd, MSARegister ws, MSARegister wt)
void hadd_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void pckev_b(MSARegister wd, MSARegister ws, MSARegister wt)
void sdr(Register rd, const MemOperand &rs)
void div_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
static void deserialization_set_target_internal_reference_at(Address pc, Address target, WritableJitAllocation &jit_allocation, RelocInfo::Mode mode=RelocInfo::INTERNAL_REFERENCE)
void dlsa(Register rd, Register rt, Register rs, uint8_t sa)
void floor_l_s(FPURegister fd, FPURegister fs)
void maxi_u_h(MSARegister wd, MSARegister ws, uint32_t imm5)
void fsueq_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bnz_h(MSARegister wt, Label *L)
void bc1t(Label *L, uint16_t cc=0)
void maddv_b(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrRegister(Opcode opcode, Register rs, Register rt, Register rd, uint16_t sa=0, SecondaryField func=nullptrSF)
void asub_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void msubf_d(FPURegister fd, FPURegister fs, FPURegister ft)
void dpsub_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void c(FPUCondition cond, SecondaryField fmt, FPURegister ft, FPURegister fs, uint16_t cc=0)
void subsus_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void mulv_w(MSARegister wd, MSARegister ws, MSARegister wt)
static Address target_address_at(Address pc)
void mul_s(FPURegister fd, FPURegister fs, FPURegister ft)
void srlri_h(MSARegister wd, MSARegister ws, uint32_t m)
void fmsub_d(MSARegister wd, MSARegister ws, MSARegister wt)
void subsus_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void ave_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void maddr_q_h(MSARegister wd, MSARegister ws, MSARegister wt)
void srar_b(MSARegister wd, MSARegister ws, MSARegister wt)
void subvi_w(MSARegister wd, MSARegister ws, uint32_t imm5)
bool is_trampoline_pool_blocked() const
void fcaf_d(MSARegister wd, MSARegister ws, MSARegister wt)
void st_d(MSARegister wd, const MemOperand &rs)
void c_s(FPUCondition cond, FPURegister ft, FPURegister fs, uint16_t cc=0)
static uint32_t GetFunction(Instr instr)
static bool IsJalr(Instr instr)
void srl_w(MSARegister wd, MSARegister ws, MSARegister wt)
void auipc(Register rs, int16_t imm16)
void maxi_u_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void nop(unsigned int type=0)
void sat_u_d(MSARegister wd, MSARegister ws, uint32_t m)
void bc1t(int16_t offset, uint16_t cc=0)
void dpsub_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void clt_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void cle_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void cvt_l_d(FPURegister fd, FPURegister fs)
void recip_s(FPURegister fd, FPURegister fs)
void round_w_s(FPURegister fd, FPURegister fs)
void ilvr_h(MSARegister wd, MSARegister ws, MSARegister wt)
int32_t shifted_branch_offset26(Label *L)
void cvt_d_s(FPURegister fd, FPURegister fs)
void cvt_d_w(FPURegister fd, FPURegister fs)
static bool IsBc(Instr instr)
void clt_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void bset_h(MSARegister wd, MSARegister ws, MSARegister wt)
int InstructionsGeneratedSince(Label *label)
static V8_INLINE void set_target_address_at(Address pc, Address target, WritableJitAllocation *jit_allocation, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
void db(uint8_t data)
void abs_d(FPURegister fd, FPURegister fs)
void cvt_w_d(FPURegister fd, FPURegister fs)
void bmz_v(MSARegister wd, MSARegister ws, MSARegister wt)
void ldi_d(MSARegister wd, int32_t imm10)
void addv_w(MSARegister wd, MSARegister ws, MSARegister wt)
void fdiv_d(MSARegister wd, MSARegister ws, MSARegister wt)
void ceqi_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void frsqrt_w(MSARegister wd, MSARegister ws)
void max_a_h(MSARegister wd, MSARegister ws, MSARegister wt)
void binsl_d(MSARegister wd, MSARegister ws, MSARegister wt)
void div(Register rs, Register rt)
void slli_w(MSARegister wd, MSARegister ws, uint32_t m)
int32_t shifted_branch_offset(Label *L)
void balc(int32_t offset)
void div_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
static bool IsOri(Instr instr)
static uint32_t GetSa(Instr instr)
void bclr_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fcueq_w(MSARegister wd, MSARegister ws, MSARegister wt)
void binsr_h(MSARegister wd, MSARegister ws, MSARegister wt)
void fslt_w(MSARegister wd, MSARegister ws, MSARegister wt)
void mod_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void j(Label *target)
void beqzc(Register rs, Label *L)
void insert_b(MSARegister wd, uint32_t n, Register rs)
void GenInstrMsaI5(SecondaryField operation, SecondaryField df, int32_t imm5, MSARegister ws, MSARegister wd)
void mod_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrMsa3RF(SecondaryField operation, uint32_t df, MSARegister wt, MSARegister ws, MSARegister wd)
void GenInstrRegister(Opcode opcode, SecondaryField fmt, Register rt, FPUControlRegister fs, SecondaryField func=nullptrSF)
void bgezall(Register rs, Label *L)
void srlri_b(MSARegister wd, MSARegister ws, uint32_t m)
void div_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void srar_h(MSARegister wd, MSARegister ws, MSARegister wt)
void daui(Register rt, Register rs, int32_t j)
void ldi_h(MSARegister wd, int32_t imm10)
void neg_d(FPURegister fd, FPURegister fs)
void subsuu_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void class_d(FPURegister fd, FPURegister fs)
void fcaf_w(MSARegister wd, MSARegister ws, MSARegister wt)
void subsuu_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fexdo_w(MSARegister wd, MSARegister ws, MSARegister wt)
void blezc(Register rt, int16_t offset)
void rint_s(FPURegister fd, FPURegister fs)
void subvi_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void fsune_w(MSARegister wd, MSARegister ws, MSARegister wt)
void slli_b(MSARegister wd, MSARegister ws, uint32_t m)
void sld_d(MSARegister wd, MSARegister ws, Register rt)
void rint(SecondaryField fmt, FPURegister fd, FPURegister fs)
void asub_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void splat_d(MSARegister wd, MSARegister ws, Register rt)
void GenInstrMsaElm(SecondaryField operation, SecondaryField df, uint32_t n, SrcType src, DstType dst)
void trunc_w_s(FPURegister fd, FPURegister fs)
void bnec(Register rs, Register rt, int16_t offset)
void msubv_w(MSARegister wd, MSARegister ws, MSARegister wt)
void slli_h(MSARegister wd, MSARegister ws, uint32_t m)
void ilvl_b(MSARegister wd, MSARegister ws, MSARegister wt)
void min_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
intptr_t available_space() const
void ceqi_h(MSARegister wd, MSARegister ws, uint32_t imm5)
static uint32_t GetLabelConst(Instr instr)
void bltc(Register rs, Register rt, int16_t offset)
void srari_b(MSARegister wd, MSARegister ws, uint32_t m)
void bnvc(Register rs, Register rt, int16_t offset)
void trunc_l_d(FPURegister fd, FPURegister fs)
void hadd_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void adds_a_b(MSARegister wd, MSARegister ws, MSARegister wt)
void mul(Register rd, Register rs, Register rt)
void ll(Register rd, const MemOperand &rs)
void dotp_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void fill_b(MSARegister wd, Register rs)
void ave_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void subvi_h(MSARegister wd, MSARegister ws, uint32_t imm5)
int32_t branch_offset26(Label *L)
void teq(Register rs, Register rt, uint16_t code)
void bnz_v(MSARegister wt, Label *L)
void clei_s_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void dsrl(Register rd, Register rt, uint16_t sa)
static uint32_t GetRsField(Instr instr)
void lsa(Register rd, Register rt, Register rs, uint8_t sa)
void bclr_w(MSARegister wd, MSARegister ws, MSARegister wt)
void floor_w_s(FPURegister fd, FPURegister fs)
void bclri_w(MSARegister wd, MSARegister ws, uint32_t m)
void bc1eqz(Label *L, FPURegister ft)
void tlt(Register rs, Register rt, uint16_t code)
void fmul_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fmadd_d(MSARegister wd, MSARegister ws, MSARegister wt)
void dmuh(Register rd, Register rs, Register rt)
void subsuu_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
static void set_uint32_constant_at(Address pc, Address constant_pool, uint32_t new_constant, WritableJitAllocation *jit_allocation, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
void insve_d(MSARegister wd, uint32_t n, MSARegister ws)
void bnz_d(MSARegister wt, int16_t offset)
static Instr SetSwOffset(Instr instr, int16_t offset)
void sld_h(MSARegister wd, MSARegister ws, Register rt)
void hadd_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void bne(Register rs, Register rt, int16_t offset)
void binsli_b(MSARegister wd, MSARegister ws, uint32_t m)
void dotp_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void rotr(Register rd, Register rt, uint16_t sa)
void dpadd_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void dmul(Register rd, Register rs, Register rt)
void bz_h(MSARegister wt, int16_t offset)
void mini_u_h(MSARegister wd, MSARegister ws, uint32_t imm5)
void mtc1(Register rt, FPURegister fs)
void ilvod_d(MSARegister wd, MSARegister ws, MSARegister wt)
static bool IsJr(Instr instr)
void clei_s_w(MSARegister wd, MSARegister ws, uint32_t imm5)
void dpadd_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void maddf_d(FPURegister fd, FPURegister fs, FPURegister ft)
void bseli_b(MSARegister wd, MSARegister ws, uint32_t imm8)
void frint_d(MSARegister wd, MSARegister ws)
void sel_s(FPURegister fd, FPURegister fs, FPURegister ft)
void ftrunc_s_w(MSARegister wd, MSARegister ws)
void min_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void min_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void lw(Register rd, const MemOperand &rs)
void pcnt_d(MSARegister wd, MSARegister ws)
void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data=0)
void binsl_h(MSARegister wd, MSARegister ws, MSARegister wt)
void splati_w(MSARegister wd, MSARegister ws, uint32_t n)
void dmodu(Register rd, Register rs, Register rt)
void ilvod_b(MSARegister wd, MSARegister ws, MSARegister wt)
void add_a_w(MSARegister wd, MSARegister ws, MSARegister wt)
void maxi_s_w(MSARegister wd, MSARegister ws, uint32_t imm5)
void jal(int64_t target)
void beqzalc(Register rt, Label *L)
void binsli_h(MSARegister wd, MSARegister ws, uint32_t m)
void floor_l_d(FPURegister fd, FPURegister fs)
void bz_w(MSARegister wt, int16_t offset)
void sat_u_b(MSARegister wd, MSARegister ws, uint32_t m)
void dsrl32(Register rt, Register rd, uint16_t sa)
static bool IsLui(Instr instr)
void bltzc(Register rt, int16_t offset)
void max_a_b(MSARegister wd, MSARegister ws, MSARegister wt)
void b(int16_t offset)
static uint32_t uint32_constant_at(Address pc, Address constant_pool)
void GenInstrRegister(Opcode opcode, FPURegister fr, FPURegister ft, FPURegister fs, FPURegister fd, SecondaryField func=nullptrSF)
void dsra32(Register rt, Register rd, uint16_t sa)
void msub_d(FPURegister fd, FPURegister fr, FPURegister fs, FPURegister ft)
void adds_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void lwupc(Register rs, int32_t offset19)
void nloc_h(MSARegister wd, MSARegister ws)
void bseti_w(MSARegister wd, MSARegister ws, uint32_t m)
void fsle_d(MSARegister wd, MSARegister ws, MSARegister wt)
void hsub_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void addvi_h(MSARegister wd, MSARegister ws, uint32_t imm5)
void clt_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void seleqz_d(FPURegister fd, FPURegister fs, FPURegister ft)
void nor_v(MSARegister wd, MSARegister ws, MSARegister wt)
void fsaf_d(MSARegister wd, MSARegister ws, MSARegister wt)
void ilvr_w(MSARegister wd, MSARegister ws, MSARegister wt)
void adds_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void print(const Label *L)
void fsult_d(MSARegister wd, MSARegister ws, MSARegister wt)
static V8_INLINE void set_target_address_at(Address pc, Address constant_pool, Address target, WritableJitAllocation *jit_allocation, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
void ceil_l_s(FPURegister fd, FPURegister fs)
bool MustUseReg(RelocInfo::Mode rmode)
void madd_s(FPURegister fd, FPURegister fr, FPURegister fs, FPURegister ft)
void insert_d(MSARegister wd, uint32_t n, Register rs)
void mulv_b(MSARegister wd, MSARegister ws, MSARegister wt)
void srlri_d(MSARegister wd, MSARegister ws, uint32_t m)
void ilvl_w(MSARegister wd, MSARegister ws, MSARegister wt)
void fmax_a_w(MSARegister wd, MSARegister ws, MSARegister wt)
static uint32_t GetRdField(Instr instr)
void hsub_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void min_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void dpadd_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void addvi_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void bc(int32_t offset)
void bneg_h(MSARegister wd, MSARegister ws, MSARegister wt)
void bmnzi_b(MSARegister wd, MSARegister ws, uint32_t imm8)
void dotp_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void addiu(Register rd, Register rs, int32_t j)
void fseq_d(MSARegister wd, MSARegister ws, MSARegister wt)
void xori(Register rd, Register rs, int32_t j)
static uint32_t GetRt(Instr instr)
void srai_d(MSARegister wd, MSARegister ws, uint32_t m)
static Register GetRdReg(Instr instr)
void fexupr_d(MSARegister wd, MSARegister ws)
void hadd_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrMsa3R(SecondaryField operation, SecondaryField df, RegType t, MSARegister ws, MSARegister wd)
void sll_h(MSARegister wd, MSARegister ws, MSARegister wt)
static int32_t GetBranchOffset(Instr instr)
void ave_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void rotrv(Register rd, Register rt, Register rs)
void bnegi_h(MSARegister wd, MSARegister ws, uint32_t m)
static bool IsBnezc(Instr instr)
void fexupl_d(MSARegister wd, MSARegister ws)
void selnez_d(FPURegister fd, FPURegister fs, FPURegister ft)
void subsuu_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void mfhi(Register rd)
void subs_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void ceqi_w(MSARegister wd, MSARegister ws, uint32_t imm5)
void fsueq_d(MSARegister wd, MSARegister ws, MSARegister wt)
void trunc_w_d(FPURegister fd, FPURegister fs)
void aver_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bset_d(MSARegister wd, MSARegister ws, MSARegister wt)
void dshd(Register rd, Register rt)
void selnez(SecondaryField fmt, FPURegister fd, FPURegister fs, FPURegister ft)
void frcp_w(MSARegister wd, MSARegister ws)
void clt_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void sltu(Register rd, Register rs, Register rt)
void addiupc(Register rs, int32_t imm19)
void binsri_h(MSARegister wd, MSARegister ws, uint32_t m)
void max_d(FPURegister fd, FPURegister fs, FPURegister ft)
void ori(Register rd, Register rs, int32_t j)
void fsle_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bgec(Register rs, Register rt, Label *L)
static bool IsAddImmediate(Instr instr)
void andi(Register rd, Register rs, int32_t j)
void frcp_d(MSARegister wd, MSARegister ws)
int32_t shifted_branch_offset21(Label *L)
void selnez(Register rs, Register rt, Register rd)
void binsri_b(MSARegister wd, MSARegister ws, uint32_t m)
void dpsub_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void ftq_h(MSARegister wd, MSARegister ws, MSARegister wt)
void fceq_d(MSARegister wd, MSARegister ws, MSARegister wt)
void ldr(Register rd, const MemOperand &rs)
void fclass_w(MSARegister wd, MSARegister ws)
void bseti_h(MSARegister wd, MSARegister ws, uint32_t m)
void clti_s_h(MSARegister wd, MSARegister ws, uint32_t imm5)
void ddiv(Register rd, Register rs, Register rt)
void emit(uint64_t x)
void bgezalc(Register rt, Label *L)
void addv_h(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrImmediate(Opcode opcode, int32_t offset26, CompactBranchType is_compact_branch=CompactBranchType::NO)
void dmultu(Register rs, Register rt)
void sc(Register rd, const MemOperand &rs)
void cle_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void rsqrt_d(FPURegister fd, FPURegister fs)
void bz_d(MSARegister wt, int16_t offset)
void div(Register rd, Register rs, Register rt)
void fcune_w(MSARegister wd, MSARegister ws, MSARegister wt)
void fsqrt_w(MSARegister wd, MSARegister ws)
void sub_s(FPURegister fd, FPURegister fs, FPURegister ft)
void add_s(FPURegister fd, FPURegister fs, FPURegister ft)
void insve_h(MSARegister wd, uint32_t n, MSARegister ws)
void subsus_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fsule_w(MSARegister wd, MSARegister ws, MSARegister wt)
void fexupl_w(MSARegister wd, MSARegister ws)
void ffqr_w(MSARegister wd, MSARegister ws)
void ilvev_w(MSARegister wd, MSARegister ws, MSARegister wt)
void mov_s(FPURegister fd, FPURegister fs)
void fexupr_w(MSARegister wd, MSARegister ws)
void swl(Register rd, const MemOperand &rs)
void trunc_l_s(FPURegister fd, FPURegister fs)
void sb(Register rd, const MemOperand &rs)
void msubv_b(MSARegister wd, MSARegister ws, MSARegister wt)
void ceq_w(MSARegister wd, MSARegister ws, MSARegister wt)
void madd_d(FPURegister fd, FPURegister fr, FPURegister fs, FPURegister ft)
void srlri_w(MSARegister wd, MSARegister ws, uint32_t m)
static bool IsMsaBranch(Instr instr)
void min_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void subsuu_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fcle_w(MSARegister wd, MSARegister ws, MSARegister wt)
void splati_h(MSARegister wd, MSARegister ws, uint32_t n)
void daddiu(Register rd, Register rs, int32_t j)
static uint32_t GetRs(Instr instr)
void ins_(Register rt, Register rs, uint16_t pos, uint16_t size)
void fslt_d(MSARegister wd, MSARegister ws, MSARegister wt)
void cmp_s(FPUCondition cond, FPURegister fd, FPURegister fs, FPURegister ft)
static Register GetRsReg(Instr instr)
void dotp_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void max_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void mulr_q_w(MSARegister wd, MSARegister ws, MSARegister wt)
uint64_t jump_offset(Label *L)
void srlr_h(MSARegister wd, MSARegister ws, MSARegister wt)
void blezalc(Register rt, Label *L)
void pckod_b(MSARegister wd, MSARegister ws, MSARegister wt)
void lui(Register rd, int32_t j)
void max(SecondaryField fmt, FPURegister fd, FPURegister fs, FPURegister ft)
void clti_u_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void hsub_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void subsus_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void clti_u_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void maddr_q_w(MSARegister wd, MSARegister ws, MSARegister wt)
static bool IsBranch(Instr instr)
void aver_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void lh(Register rd, const MemOperand &rs)
void GenInstrMsaMI10(SecondaryField operation, int32_t s10, Register rs, MSARegister wd)
void dext_(Register rt, Register rs, uint16_t pos, uint16_t size)
static bool IsBeqzc(Instr instr)
void bsel_v(MSARegister wd, MSARegister ws, MSARegister wt)
static int RelocateInternalReference(RelocInfo::Mode rmode, Address pc, intptr_t pc_delta, WritableJitAllocation *jit_allocation=nullptr)
void ave_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void addvi_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void srav(Register rt, Register rd, Register rs)
void fmin_a_d(MSARegister wd, MSARegister ws, MSARegister wt)
void bgtzalc(Register rt, Label *L)
void subs_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void srlr_d(MSARegister wd, MSARegister ws, MSARegister wt)
void align(Register rd, Register rs, Register rt, uint8_t bp)
void fsor_d(MSARegister wd, MSARegister ws, MSARegister wt)
void insve_w(MSARegister wd, uint32_t n, MSARegister ws)
void fceq_w(MSARegister wd, MSARegister ws, MSARegister wt)
void ilvod_w(MSARegister wd, MSARegister ws, MSARegister wt)
void subsus_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void dinsu_(Register rt, Register rs, uint16_t pos, uint16_t size)
void bz_b(MSARegister wt, Label *L)
void max_s(FPURegister fd, FPURegister fs, FPURegister ft)
void ilvl_d(MSARegister wd, MSARegister ws, MSARegister wt)
void clt_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void muh(Register rd, Register rs, Register rt)
void dpadd_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void subs_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void BlockTrampolinePoolFor(int instructions)
void sldi_h(MSARegister wd, MSARegister ws, uint32_t n)
void and_(Register rd, Register rs, Register rt)
void addv_d(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrRegister(Opcode opcode, Register rs, Register rt, uint16_t msb, uint16_t lsb, SecondaryField func)
static int16_t GetLwOffset(Instr instr)
void pcnt_w(MSARegister wd, MSARegister ws)
void mulr_q_h(MSARegister wd, MSARegister ws, MSARegister wt)
void max_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void sat_s_d(MSARegister wd, MSARegister ws, uint32_t m)
void dpsub_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrImmediate(Opcode opcode, Register rs, Register rt, int32_t j, CompactBranchType is_compact_branch=CompactBranchType::NO)
void subs_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void sdl(Register rd, const MemOperand &rs)
void srar_w(MSARegister wd, MSARegister ws, MSARegister wt)
void srari_h(MSARegister wd, MSARegister ws, uint32_t m)
void GetCode(Isolate *isolate, CodeDesc *desc)
void binsri_w(MSARegister wd, MSARegister ws, uint32_t m)
void ldc1(FPURegister fd, const MemOperand &src)
void bltzal(Register rs, int16_t offset)
static Instr SetAddImmediateOffset(Instr instr, int16_t offset)
void st_h(MSARegister wd, const MemOperand &rs)
void ceq_d(MSARegister wd, MSARegister ws, MSARegister wt)
void dotp_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void subs_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void srai_h(MSARegister wd, MSARegister ws, uint32_t m)
void msub_q_h(MSARegister wd, MSARegister ws, MSARegister wt)
void ext_(Register rt, Register rs, uint16_t pos, uint16_t size)
void msub_s(FPURegister fd, FPURegister fr, FPURegister fs, FPURegister ft)
void max_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void mult(Register rs, Register rt)
void sldi_w(MSARegister wd, MSARegister ws, uint32_t n)
void ctcmsa(MSAControlRegister cd, Register rs)
void sll_b(MSARegister wd, MSARegister ws, MSARegister wt)
static uint32_t GetSaField(Instr instr)
void binsr_b(MSARegister wd, MSARegister ws, MSARegister wt)
static uint32_t GetRd(Instr instr)
void fmin_w(MSARegister wd, MSARegister ws, MSARegister wt)
void ilvev_b(MSARegister wd, MSARegister ws, MSARegister wt)
void fsqrt_d(MSARegister wd, MSARegister ws)
void dd(Label *label)
void add_a_d(MSARegister wd, MSARegister ws, MSARegister wt)
static Instr SetLwOffset(Instr instr, int16_t offset)
void bnz_w(MSARegister wt, Label *L)
bool is_valid_msa_df_m(SecondaryField bit_df, uint32_t m)
void dotp_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void cfcmsa(Register rd, MSAControlRegister cs)
void dsrlv(Register rd, Register rt, Register rs)
void vshf_w(MSARegister wd, MSARegister ws, MSARegister wt)
void mini_u_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void ave_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fmin_a_w(MSARegister wd, MSARegister ws, MSARegister wt)
void clei_u_w(MSARegister wd, MSARegister ws, uint32_t imm5)
void bc1nez(Label *L, FPURegister ft)
void GenInstrRegister(Opcode opcode, SecondaryField fmt, Register rt, FPURegister fs, FPURegister fd, SecondaryField func=nullptrSF)
void fsor_w(MSARegister wd, MSARegister ws, MSARegister wt)
void fsaf_w(MSARegister wd, MSARegister ws, MSARegister wt)
void aver_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fsune_d(MSARegister wd, MSARegister ws, MSARegister wt)
static void instr_at_put(Address pc, Instr instr, WritableJitAllocation *jit_allocation=nullptr)
void lwu(Register rd, const MemOperand &rs)
void fsne_d(MSARegister wd, MSARegister ws, MSARegister wt)
void clei_u_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void clei_s_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void dinsm_(Register rt, Register rs, uint16_t pos, uint16_t size)
void bgtzc(Register rt, Label *L)
void beqzc(Register rs, int32_t offset)
void mini_s_h(MSARegister wd, MSARegister ws, uint32_t imm5)
void subv_h(MSARegister wd, MSARegister ws, MSARegister wt)
void bz_v(MSARegister wt, int16_t offset)
void sat_s_b(MSARegister wd, MSARegister ws, uint32_t m)
void bovc(Register rs, Register rt, int16_t offset)
void srl(Register rd, Register rt, uint16_t sa)
void cfc1(Register rt, FPUControlRegister fs)
void min_a_w(MSARegister wd, MSARegister ws, MSARegister wt)
void ftint_s_d(MSARegister wd, MSARegister ws)
void srai_w(MSARegister wd, MSARegister ws, uint32_t m)
void mod(Register rd, Register rs, Register rt)
void ffint_u_d(MSARegister wd, MSARegister ws)
void bne(Register rs, Register rt, Label *L)
void msubf_s(FPURegister fd, FPURegister fs, FPURegister ft)
void dq(uint64_t data)
void vshf_b(MSARegister wd, MSARegister ws, MSARegister wt)
void splati_d(MSARegister wd, MSARegister ws, uint32_t n)
void mod_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void adds_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrMsaVec(SecondaryField operation, MSARegister wt, MSARegister ws, MSARegister wd)
void maxi_s_h(MSARegister wd, MSARegister ws, uint32_t imm5)
void fmadd_w(MSARegister wd, MSARegister ws, MSARegister wt)
void hsub_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void asub_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void fcne_d(MSARegister wd, MSARegister ws, MSARegister wt)
void subsuu_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void sll(Register rd, Register rt, uint16_t sa, bool coming_from_nop=false)
int32_t branch_offset_helper(Label *L, OffsetSize bits)
void mod_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fcle_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fcule_w(MSARegister wd, MSARegister ws, MSARegister wt)
void adds_a_w(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrMsaI8(SecondaryField operation, uint32_t imm8, MSARegister ws, MSARegister wd)
void copy_u_w(Register rd, MSARegister ws, uint32_t n)
void recip_d(FPURegister fd, FPURegister fs)
static V8_INLINE Address target_address_at(Address pc, Address constant_pool)
void dsrav(Register rd, Register rt, Register rs)
static Instr instr_at(Address pc)
void clt_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void hsub_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void sra_w(MSARegister wd, MSARegister ws, MSARegister wt)
void cvt_d_l(FPURegister fd, FPURegister fs)
void sel_d(FPURegister fd, FPURegister fs, FPURegister ft)
void bneg_w(MSARegister wd, MSARegister ws, MSARegister wt)
void insert_h(MSARegister wd, uint32_t n, Register rs)
void dotp_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void clei_s_h(MSARegister wd, MSARegister ws, uint32_t imm5)
void mfc1(Register rt, FPURegister fs)
void maxa(SecondaryField fmt, FPURegister fd, FPURegister fs, FPURegister ft)
static bool IsEmittedConstant(Instr instr)
void fmsub_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bz_d(MSARegister wt, Label *L)
void bmnz_v(MSARegister wd, MSARegister ws, MSARegister wt)
void subv_b(MSARegister wd, MSARegister ws, MSARegister wt)
void max_a_w(MSARegister wd, MSARegister ws, MSARegister wt)
void dclz(Register rd, Register rs)
void cvt_s_d(FPURegister fd, FPURegister fs)
void maxi_s_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void ddiv(Register rs, Register rt)
void fsub_d(MSARegister wd, MSARegister ws, MSARegister wt)
void clt_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void movf_s(FPURegister fd, FPURegister fs, uint16_t cc=0)
void round_l_s(FPURegister fd, FPURegister fs)
void bnz_b(MSARegister wt, int16_t offset)
void ave_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void clti_u_w(MSARegister wd, MSARegister ws, uint32_t imm5)
void blez(Register rs, int16_t offset)
void srlv(Register rd, Register rt, Register rs)
void maxi_u_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void movt(Register rd, Register rs, uint16_t cc=0)
void round_w_d(FPURegister fd, FPURegister fs)
void pckod_w(MSARegister wd, MSARegister ws, MSARegister wt)
void movt_d(FPURegister fd, FPURegister fs, uint16_t cc=0)
uint64_t jump_address(Label *L)
void flog2_d(MSARegister wd, MSARegister ws)
void fsun_w(MSARegister wd, MSARegister ws, MSARegister wt)
void min_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bz_v(MSARegister wt, Label *L)
int32_t get_trampoline_entry(int32_t pos)
static bool IsMov(Instr instr, Register rd, Register rs)
void rsqrt_s(FPURegister fd, FPURegister fs)
void GenInstrMsa2R(SecondaryField operation, SecondaryField df, MSARegister ws, MSARegister wd)
void div_d(FPURegister fd, FPURegister fs, FPURegister ft)
void GenInstrImmediate(Opcode opcode, Register r1, FPURegister r2, int32_t j, CompactBranchType is_compact_branch=CompactBranchType::NO)
void bclri_b(MSARegister wd, MSARegister ws, uint32_t m)
void ilvl_h(MSARegister wd, MSARegister ws, MSARegister wt)
void selnez_s(FPURegister fd, FPURegister fs, FPURegister ft)
void sll_d(MSARegister wd, MSARegister ws, MSARegister wt)
static Register GetRtReg(Instr instr)
void xor_(Register rd, Register rs, Register rt)
void fmax_d(MSARegister wd, MSARegister ws, MSARegister wt)
void or_(Register rd, Register rs, Register rt)
void bgezalc(Register rt, int16_t offset)
void cvt_s_l(FPURegister fd, FPURegister fs)
void cle_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void cmp_d(FPUCondition cond, FPURegister fd, FPURegister fs, FPURegister ft)
void GenInstrImmediate(Opcode opcode, Register rs, SecondaryField SF, int32_t j, CompactBranchType is_compact_branch=CompactBranchType::NO)
static bool IsSw(Instr instr)
void GetCode(LocalIsolate *isolate, CodeDesc *desc, SafepointTableBuilderBase *safepoint_table_builder, int handler_table_offset)
void srli_w(MSARegister wd, MSARegister ws, uint32_t m)
void beq(Register rs, Register rt, int16_t offset)
void bltuc(Register rs, Register rt, Label *L)
void neg_s(FPURegister fd, FPURegister fs)
void bnz_d(MSARegister wt, Label *L)
void dextu_(Register rt, Register rs, uint16_t pos, uint16_t size)
void ftrunc_u_w(MSARegister wd, MSARegister ws)
void max_a_d(MSARegister wd, MSARegister ws, MSARegister wt)
void div_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void bnz_v(MSARegister wt, int16_t offset)
void mini_s_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void j(int64_t target)
void mod_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void dpsub_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void sel(SecondaryField fmt, FPURegister fd, FPURegister fs, FPURegister ft)
void sat_s_h(MSARegister wd, MSARegister ws, uint32_t m)
void aver_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void ilvr_b(MSARegister wd, MSARegister ws, MSARegister wt)
void ffint_s_d(MSARegister wd, MSARegister ws)
static bool IsCompactBranchSupported()
void fcune_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fcueq_d(MSARegister wd, MSARegister ws, MSARegister wt)
void bovc(Register rs, Register rt, Label *L)
void ffqr_d(MSARegister wd, MSARegister ws)
void dmtc1(Register rt, FPURegister fs)
static bool IsBeqc(Instr instr)
void div_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void min_s(FPURegister fd, FPURegister fs, FPURegister ft)
void srl_d(MSARegister wd, MSARegister ws, MSARegister wt)
void copy_s_d(Register rd, MSARegister ws, uint32_t n)
void bnezc(Register rt, int32_t offset)
void sld_w(MSARegister wd, MSARegister ws, Register rt)
void aver_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void min_a_d(MSARegister wd, MSARegister ws, MSARegister wt)
void nlzc_h(MSARegister wd, MSARegister ws)
void tne(Register rs, Register rt, uint16_t code)
void dp(uintptr_t data)
void add_a_h(MSARegister wd, MSARegister ws, MSARegister wt)
void lhu(Register rd, const MemOperand &rs)
void mini_u_b(MSARegister wd, MSARegister ws, uint32_t imm5)
void fcun_d(MSARegister wd, MSARegister ws, MSARegister wt)
void min_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void bltzc(Register rt, Label *L)
void bgtz(Register rs, int16_t offset)
void subv_w(MSARegister wd, MSARegister ws, MSARegister wt)
void cle_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void ld_w(MSARegister wd, const MemOperand &rs)
void ldpc(Register rs, int32_t offset18)
void ftrunc_u_d(MSARegister wd, MSARegister ws)
void adds_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bgec(Register rs, Register rt, int16_t offset)
void bltc(Register rs, Register rt, Label *L)
void fsun_d(MSARegister wd, MSARegister ws, MSARegister wt)
void splat_b(MSARegister wd, MSARegister ws, Register rt)
void tge(Register rs, Register rt, uint16_t code)
void sw(Register rd, const MemOperand &rs)
void max_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void maxa_d(FPURegister fd, FPURegister fs, FPURegister ft)
void frsqrt_d(MSARegister wd, MSARegister ws)
void hadd_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void maddv_d(MSARegister wd, MSARegister ws, MSARegister wt)
void nloc_w(MSARegister wd, MSARegister ws)
void ftint_u_w(MSARegister wd, MSARegister ws)
void drotrv(Register rd, Register rt, Register rs)
void insert_w(MSARegister wd, uint32_t n, Register rs)
void srli_h(MSARegister wd, MSARegister ws, uint32_t m)
void blezalc(Register rt, int16_t offset)
void ldl(Register rd, const MemOperand &rs)
void adds_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void muhu(Register rd, Register rs, Register rt)
void GenInstrMsaI10(SecondaryField operation, SecondaryField df, int32_t imm10, MSARegister wd)
void ftq_w(MSARegister wd, MSARegister ws, MSARegister wt)
void maxi_u_w(MSARegister wd, MSARegister ws, uint32_t imm5)
void hsub_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
static bool IsNal(Instr instr)
void mina(SecondaryField fmt, FPURegister fd, FPURegister fs, FPURegister ft)
void ceq_h(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrImmediate(Opcode opcode, Register base, Register rt, int32_t offset9, int bit6, SecondaryField func)
void srar_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fcor_w(MSARegister wd, MSARegister ws, MSARegister wt)
void movn(Register rd, Register rs, Register rt)
static uint32_t GetImmediate16(Instr instr)
void dpadd_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bclr_h(MSARegister wd, MSARegister ws, MSARegister wt)
void mthc1(Register rt, FPURegister fs)
void msubv_h(MSARegister wd, MSARegister ws, MSARegister wt)
void cle_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void adds_a_d(MSARegister wd, MSARegister ws, MSARegister wt)
void c_d(FPUCondition cond, FPURegister ft, FPURegister fs, uint16_t cc=0)
static void JumpLabelToJumpRegister(Address pc)
void nloc_b(MSARegister wd, MSARegister ws)
void cle_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void sld_b(MSARegister wd, MSARegister ws, Register rt)
void sat_s_w(MSARegister wd, MSARegister ws, uint32_t m)
void binsl_b(MSARegister wd, MSARegister ws, MSARegister wt)
void ilvev_d(MSARegister wd, MSARegister ws, MSARegister wt)
void asub_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void sldi_d(MSARegister wd, MSARegister ws, uint32_t n)
void movt_s(FPURegister fd, FPURegister fs, uint16_t cc=0)
void nlzc_d(MSARegister wd, MSARegister ws)
void hsub_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void move_v(MSARegister wd, MSARegister ws)
void cvt_w_s(FPURegister fd, FPURegister fs)
int BranchOffset(Instr instr)
void ilvod_h(MSARegister wd, MSARegister ws, MSARegister wt)
void shf_h(MSARegister wd, MSARegister ws, uint32_t imm8)
void sqrt_d(FPURegister fd, FPURegister fs)
void ceil_l_d(FPURegister fd, FPURegister fs)
int32_t branch_offset(Label *L)
void aui(Register rt, Register rs, int32_t j)
void dsbh(Register rd, Register rt)
void nori_b(MSARegister wd, MSARegister ws, uint32_t imm8)
void dd(uint32_t data)
void sat_u_h(MSARegister wd, MSARegister ws, uint32_t m)
void hadd_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void seleqz_s(FPURegister fd, FPURegister fs, FPURegister ft)
void beq(Register rs, Register rt, Label *L)
void slli_d(MSARegister wd, MSARegister ws, uint32_t m)
void nlzc_b(MSARegister wd, MSARegister ws)
void bnezc(Register rt, Label *L)
void srlr_b(MSARegister wd, MSARegister ws, MSARegister wt)
void seleqz(Register rd, Register rs, Register rt)
void nloc_d(MSARegister wd, MSARegister ws)
void binsr_d(MSARegister wd, MSARegister ws, MSARegister wt)
void bseti_d(MSARegister wd, MSARegister ws, uint32_t m)
void fexp2_d(MSARegister wd, MSARegister ws, MSARegister wt)
static bool IsAndImmediate(Instr instr)
void adds_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void clei_u_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void dahi(Register rs, int32_t j)
void sra_d(MSARegister wd, MSARegister ws, MSARegister wt)
void abs_s(FPURegister fd, FPURegister fs)
void andi_b(MSARegister wd, MSARegister ws, uint32_t imm8)
void bnegi_d(MSARegister wd, MSARegister ws, uint32_t m)
void jal(Label *target)
void dmulu(Register rd, Register rs, Register rt)
void daddu(Register rd, Register rs, Register rt)
void mina_d(FPURegister fd, FPURegister fs, FPURegister ft)
void binsr_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bnegi_b(MSARegister wd, MSARegister ws, uint32_t m)
void lwc1(FPURegister fd, const MemOperand &src)
void fdiv_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bz_b(MSARegister wt, int16_t offset)
void GenInstrImmediate(Opcode opcode, Register rs, int32_t offset21, CompactBranchType is_compact_branch=CompactBranchType::NO)
Assembler(const AssemblerOptions &, std::unique_ptr< AssemblerBuffer >={})
void adds_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bneg_d(MSARegister wd, MSARegister ws, MSARegister wt)
void sh(Register rd, const MemOperand &rs)
void fclass_d(MSARegister wd, MSARegister ws)
void instr_at_put(int pos, Instr instr, WritableJitAllocation *jit_allocation=nullptr)
void srl_h(MSARegister wd, MSARegister ws, MSARegister wt)
void min(SecondaryField fmt, FPURegister fd, FPURegister fs, FPURegister ft)
void multu(Register rs, Register rt)
void clti_s_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void copy_s_w(Register rd, MSARegister ws, uint32_t n)
void lwpc(Register rs, int32_t offset19)
void bitswap(Register rd, Register rt)
void bnz_w(MSARegister wt, int16_t offset)
void subsus_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void mulv_h(MSARegister wd, MSARegister ws, MSARegister wt)
void ldi_w(MSARegister wd, int32_t imm10)
void fsult_w(MSARegister wd, MSARegister ws, MSARegister wt)
void fcor_d(MSARegister wd, MSARegister ws, MSARegister wt)
void adds_a_h(MSARegister wd, MSARegister ws, MSARegister wt)
void bltzalc(Register rt, int16_t offset)
void ddivu(Register rd, Register rs, Register rt)
void fill_h(MSARegister wd, Register rs)
void ilvr_d(MSARegister wd, MSARegister ws, MSARegister wt)
void subsus_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void wsbh(Register rd, Register rt)
void pckev_d(MSARegister wd, MSARegister ws, MSARegister wt)
void sldi_b(MSARegister wd, MSARegister ws, uint32_t n)
void movn_s(FPURegister fd, FPURegister fs, Register rt)
void divu(Register rs, Register rt)
void clz(Register rd, Register rs)
void fsule_d(MSARegister wd, MSARegister ws, MSARegister wt)
void blezc(Register rt, Label *L)
void max_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bnz_h(MSARegister wt, int16_t offset)
void dsllv(Register rd, Register rt, Register rs)
void dins_(Register rt, Register rs, uint16_t pos, uint16_t size)
void max_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void fclt_w(MSARegister wd, MSARegister ws, MSARegister wt)
void mini_s_w(MSARegister wd, MSARegister ws, uint32_t imm5)
void swr(Register rd, const MemOperand &rs)
void dpsub_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void drotr32(Register rd, Register rt, uint16_t sa)
void nor(Register rd, Register rs, Register rt)
static bool IsBeq(Instr instr)
static bool IsLwRegFpNegOffset(Instr instr)
static bool IsLwRegFpOffset(Instr instr)
void sllv(Register rd, Register rt, Register rs)
void msub_q_w(MSARegister wd, MSARegister ws, MSARegister wt)
void CheckTrampolinePoolQuick(int extra_instructions=0)
int SizeOfCodeGeneratedSince(Label *label)
static bool IsSwRegFpNegOffset(Instr instr)
void movf_d(FPURegister fd, FPURegister fs, uint16_t cc=0)
void mod_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void bclri_d(MSARegister wd, MSARegister ws, uint32_t m)
void flog2_w(MSARegister wd, MSARegister ws)
void ftint_s_w(MSARegister wd, MSARegister ws)
void bgtzc(Register rt, int16_t offset)
void srl_b(MSARegister wd, MSARegister ws, MSARegister wt)
void ceil_w_d(FPURegister fd, FPURegister fs)
static bool IsJal(Instr instr)
void bmzi_b(MSARegister wd, MSARegister ws, uint32_t imm8)
void div_s(FPURegister fd, FPURegister fs, FPURegister ft)
void bc1f(Label *L, uint16_t cc=0)
void bz_h(MSARegister wt, Label *L)
void pckev_h(MSARegister wd, MSARegister ws, MSARegister wt)
void dsll(Register rd, Register rt, uint16_t sa)
void aluipc(Register rs, int16_t imm16)
void splat_h(MSARegister wd, MSARegister ws, Register rt)
void nlzc_w(MSARegister wd, MSARegister ws)
int32_t branch_offset21(Label *L)
void fexdo_h(MSARegister wd, MSARegister ws, MSARegister wt)
void subsus_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void RecordDeoptReason(DeoptimizeReason reason, uint32_t node_id, SourcePosition position, int id)
void subsuu_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void BlockTrampolinePoolBefore(int pc_offset)
void bz_w(MSARegister wt, Label *L)
void dsll32(Register rt, Register rd, uint16_t sa)
void mul_d(FPURegister fd, FPURegister fs, FPURegister ft)
void dmfc1(Register rt, FPURegister fs)
static bool IsNop(Instr instr, unsigned int type)
void clei_u_h(MSARegister wd, MSARegister ws, uint32_t imm5)
void bgeuc(Register rs, Register rt, Label *L)
void msubr_q_w(MSARegister wd, MSARegister ws, MSARegister wt)
void sub_d(FPURegister fd, FPURegister fs, FPURegister ft)
void sqrt_s(FPURegister fd, FPURegister fs)
void or_v(MSARegister wd, MSARegister ws, MSARegister wt)
void ld_b(MSARegister wd, const MemOperand &rs)
void srlr_w(MSARegister wd, MSARegister ws, MSARegister wt)
void sra(Register rt, Register rd, uint16_t sa)
void pckod_d(MSARegister wd, MSARegister ws, MSARegister wt)
void floor_w_d(FPURegister fd, FPURegister fs)
void dpadd_s_b(MSARegister wd, MSARegister ws, MSARegister wt)
void subvi_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void bgtzalc(Register rt, int16_t offset)
void sra_b(MSARegister wd, MSARegister ws, MSARegister wt)
void mini_s_d(MSARegister wd, MSARegister ws, uint32_t imm5)
void fclt_d(MSARegister wd, MSARegister ws, MSARegister wt)
void drotr(Register rd, Register rt, uint16_t sa)
void subu(Register rd, Register rs, Register rt)
void asub_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void div_u_b(MSARegister wd, MSARegister ws, MSARegister wt)
void sat_u_w(MSARegister wd, MSARegister ws, uint32_t m)
void subv_d(MSARegister wd, MSARegister ws, MSARegister wt)
int target_at(int pos, bool is_internal)
void bgezc(Register rt, int16_t offset)
void seh(Register rd, Register rt)
void msubv_d(MSARegister wd, MSARegister ws, MSARegister wt)
void vshf_h(MSARegister wd, MSARegister ws, MSARegister wt)
void GenInstrRegister(Opcode opcode, SecondaryField fmt, FPURegister ft, FPURegister fs, FPURegister fd, SecondaryField func=nullptrSF)
void bseti_b(MSARegister wd, MSARegister ws, uint32_t m)
void xori_b(MSARegister wd, MSARegister ws, uint32_t imm8)
void cle_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void bgezall(Register rs, int16_t offset)
EnsureSpace(Assembler *assembler)
V8_EXPORT_PRIVATE Address address() const
LoadStoreLaneParams(MachineRepresentation rep, uint8_t laneidx)
LoadStoreLaneParams(uint8_t laneidx, MSASize sz, int lanes)
MemOperand(Register rn, int32_t offset=0)
V8_INLINE Operand(Tagged< Smi > value)
RelocInfo::Mode rmode() const
V8_INLINE Operand(const ExternalReference &f)
union v8::internal::Operand::Value value_
Operand(Handle< HeapObject > handle)
V8_INLINE Operand(int64_t immediate, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
RelocInfo::Mode rmode()
HeapNumberRequest heap_number_request() const
RelocInfo::Mode rmode_
bool IsHeapNumberRequest() const
V8_INLINE bool is_reg() const
static Operand EmbeddedNumber(double number)
Register rm() const
int32_t immediate() const
V8_INLINE Operand(Register rm)
constexpr bool is_valid() const
void Exclude(const Register &reg1, const Register &reg2=no_reg)
void Include(const Register &reg1, const Register &reg2=no_reg)
Operand const offset_
uint8_t *const start_
Definition assembler.cc:131
@ kMips64r6
static const ArchVariants kArchVariant
const v8::base::TimeTicks end_
Definition sweeper.cc:54
int start
Label label
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in allocation gc speed threshold for starting incremental marking via a task in percent of available threshold for starting incremental marking immediately in percent of available Use a single schedule for determining a marking schedule between JS and C objects schedules the minor GC task with kUserVisible priority max worker number of concurrent for NumberOfWorkerThreads start background threads that allocate memory concurrent_array_buffer_sweeping use parallel threads to clear weak refs in the atomic pause trace progress of the incremental marking trace object counts and memory usage * MB
int32_t offset
Instruction * instr
int pc_offset
int x
int position
Definition liveedit.cc:290
int m
Definition mul-fft.cc:294
STL namespace.
constexpr Register no_reg
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
Definition handles-inl.h:72
constexpr uint8_t kPcLoadDelta
std::variant< Zone *, AccountingAllocator * > MaybeAssemblerZone
Definition assembler.h:262
const int kSmiTagSize
Definition v8-internal.h:87
constexpr uint64_t kSmiShiftMask
constexpr int L
constexpr int kSmiShift
const int kSmiShiftSize
constexpr uint8_t kInstrSize
#define DCHECK_IMPLIES(v1, v2)
Definition logging.h:493
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_LT(v1, v2)
Definition logging.h:489
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
#define V8_EXPORT_PRIVATE
Definition macros.h:460
HeapNumberRequest heap_number_request
#define V8_INLINE
Definition v8config.h:500
#define V8_NODISCARD
Definition v8config.h:693