xref: /aosp_15_r20/art/compiler/utils/riscv64/assembler_riscv64.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_COMPILER_UTILS_RISCV64_ASSEMBLER_RISCV64_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_UTILS_RISCV64_ASSEMBLER_RISCV64_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <cstdint>
21*795d594fSAndroid Build Coastguard Worker #include <string>
22*795d594fSAndroid Build Coastguard Worker #include <utility>
23*795d594fSAndroid Build Coastguard Worker #include <vector>
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker #include "arch/riscv64/instruction_set_features_riscv64.h"
26*795d594fSAndroid Build Coastguard Worker #include "base/arena_containers.h"
27*795d594fSAndroid Build Coastguard Worker #include "base/globals.h"
28*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
29*795d594fSAndroid Build Coastguard Worker #include "base/pointer_size.h"
30*795d594fSAndroid Build Coastguard Worker #include "managed_register_riscv64.h"
31*795d594fSAndroid Build Coastguard Worker #include "utils/assembler.h"
32*795d594fSAndroid Build Coastguard Worker #include "utils/label.h"
33*795d594fSAndroid Build Coastguard Worker 
34*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
35*795d594fSAndroid Build Coastguard Worker namespace riscv64 {
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker class ScratchRegisterScope;
38*795d594fSAndroid Build Coastguard Worker 
39*795d594fSAndroid Build Coastguard Worker static constexpr size_t kRiscv64HalfwordSize = 2;
40*795d594fSAndroid Build Coastguard Worker static constexpr size_t kRiscv64WordSize = 4;
41*795d594fSAndroid Build Coastguard Worker static constexpr size_t kRiscv64DoublewordSize = 8;
42*795d594fSAndroid Build Coastguard Worker static constexpr size_t kRiscv64FloatRegSizeInBytes = 8;
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker // The `Riscv64Extension` enumeration is used for restricting the instructions that the assembler
45*795d594fSAndroid Build Coastguard Worker // can use. Some restrictions are checked only in debug mode (for example load and store
46*795d594fSAndroid Build Coastguard Worker // instructions check `kLoadStore`), other restrictions are checked at run time and affect the
47*795d594fSAndroid Build Coastguard Worker // emitted code (for example, the `SextW()` pseudo-instruction selects between an implementation
48*795d594fSAndroid Build Coastguard Worker // from "Zcb", "Zbb" and a two-instruction sequence from the basic instruction set.
49*795d594fSAndroid Build Coastguard Worker enum class Riscv64Extension : uint32_t {
50*795d594fSAndroid Build Coastguard Worker   kLoadStore,  // Pseudo-extension encompassing all loads and stores. Used to check that
51*795d594fSAndroid Build Coastguard Worker                // we do not have loads and stores in the middle of a LR/SC sequence.
52*795d594fSAndroid Build Coastguard Worker   kZifencei,
53*795d594fSAndroid Build Coastguard Worker   kM,
54*795d594fSAndroid Build Coastguard Worker   kA,
55*795d594fSAndroid Build Coastguard Worker   kZicsr,
56*795d594fSAndroid Build Coastguard Worker   kF,
57*795d594fSAndroid Build Coastguard Worker   kD,
58*795d594fSAndroid Build Coastguard Worker   kZba,
59*795d594fSAndroid Build Coastguard Worker   kZbb,
60*795d594fSAndroid Build Coastguard Worker   kZbs,
61*795d594fSAndroid Build Coastguard Worker   kV,
62*795d594fSAndroid Build Coastguard Worker   kZca,  // "C" extension instructions except floating point loads/stores.
63*795d594fSAndroid Build Coastguard Worker   kZcd,  // "C" extension double loads/stores.
64*795d594fSAndroid Build Coastguard Worker          // Note: RV64 cannot implement Zcf ("C" extension float loads/stores).
65*795d594fSAndroid Build Coastguard Worker   kZcb,  // Simple 16-bit operations not present in the original "C" extension.
66*795d594fSAndroid Build Coastguard Worker 
67*795d594fSAndroid Build Coastguard Worker   kLast = kZcb
68*795d594fSAndroid Build Coastguard Worker };
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker using Riscv64ExtensionMask = uint32_t;
71*795d594fSAndroid Build Coastguard Worker 
Riscv64ExtensionBit(Riscv64Extension ext)72*795d594fSAndroid Build Coastguard Worker constexpr Riscv64ExtensionMask Riscv64ExtensionBit(Riscv64Extension ext) {
73*795d594fSAndroid Build Coastguard Worker   return 1u << enum_cast<>(ext);
74*795d594fSAndroid Build Coastguard Worker }
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker constexpr Riscv64ExtensionMask kRiscv64AllExtensionsMask =
77*795d594fSAndroid Build Coastguard Worker     MaxInt<Riscv64ExtensionMask>(enum_cast<>(Riscv64Extension::kLast) + 1);
78*795d594fSAndroid Build Coastguard Worker 
79*795d594fSAndroid Build Coastguard Worker // Extensions allowed in a LR/SC sequence (between the LR and SC).
80*795d594fSAndroid Build Coastguard Worker constexpr Riscv64ExtensionMask kRiscv64LrScSequenceExtensionsMask =
81*795d594fSAndroid Build Coastguard Worker     Riscv64ExtensionBit(Riscv64Extension::kZca);
82*795d594fSAndroid Build Coastguard Worker 
83*795d594fSAndroid Build Coastguard Worker enum class FPRoundingMode : uint32_t {
84*795d594fSAndroid Build Coastguard Worker   kRNE = 0x0,  // Round to Nearest, ties to Even
85*795d594fSAndroid Build Coastguard Worker   kRTZ = 0x1,  // Round towards Zero
86*795d594fSAndroid Build Coastguard Worker   kRDN = 0x2,  // Round Down (towards −Infinity)
87*795d594fSAndroid Build Coastguard Worker   kRUP = 0x3,  // Round Up (towards +Infinity)
88*795d594fSAndroid Build Coastguard Worker   kRMM = 0x4,  // Round to Nearest, ties to Max Magnitude
89*795d594fSAndroid Build Coastguard Worker   kDYN = 0x7,  // Dynamic rounding mode
90*795d594fSAndroid Build Coastguard Worker   kDefault = kDYN,
91*795d594fSAndroid Build Coastguard Worker   // Some instructions never need to round even though the spec includes the RM field.
92*795d594fSAndroid Build Coastguard Worker   // To simplify testing, emit the RM as 0 by default for these instructions because that's what
93*795d594fSAndroid Build Coastguard Worker   // `clang` does and because the `llvm-objdump` fails to disassemble the other rounding modes.
94*795d594fSAndroid Build Coastguard Worker   kIgnored = 0
95*795d594fSAndroid Build Coastguard Worker };
96*795d594fSAndroid Build Coastguard Worker 
97*795d594fSAndroid Build Coastguard Worker enum class AqRl : uint32_t {
98*795d594fSAndroid Build Coastguard Worker   kNone    = 0x0,
99*795d594fSAndroid Build Coastguard Worker   kRelease = 0x1,
100*795d594fSAndroid Build Coastguard Worker   kAcquire = 0x2,
101*795d594fSAndroid Build Coastguard Worker   kAqRl    = kRelease | kAcquire
102*795d594fSAndroid Build Coastguard Worker };
103*795d594fSAndroid Build Coastguard Worker 
104*795d594fSAndroid Build Coastguard Worker // the type for fence
105*795d594fSAndroid Build Coastguard Worker enum FenceType {
106*795d594fSAndroid Build Coastguard Worker   kFenceNone = 0,
107*795d594fSAndroid Build Coastguard Worker   kFenceWrite = 1,
108*795d594fSAndroid Build Coastguard Worker   kFenceRead = 2,
109*795d594fSAndroid Build Coastguard Worker   kFenceOutput = 4,
110*795d594fSAndroid Build Coastguard Worker   kFenceInput = 8,
111*795d594fSAndroid Build Coastguard Worker   kFenceDefault = 0xf,
112*795d594fSAndroid Build Coastguard Worker };
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker // Used to test the values returned by FClassS/FClassD.
115*795d594fSAndroid Build Coastguard Worker enum FPClassMaskType {
116*795d594fSAndroid Build Coastguard Worker   kNegativeInfinity  = 0x001,
117*795d594fSAndroid Build Coastguard Worker   kNegativeNormal    = 0x002,
118*795d594fSAndroid Build Coastguard Worker   kNegativeSubnormal = 0x004,
119*795d594fSAndroid Build Coastguard Worker   kNegativeZero      = 0x008,
120*795d594fSAndroid Build Coastguard Worker   kPositiveZero      = 0x010,
121*795d594fSAndroid Build Coastguard Worker   kPositiveSubnormal = 0x020,
122*795d594fSAndroid Build Coastguard Worker   kPositiveNormal    = 0x040,
123*795d594fSAndroid Build Coastguard Worker   kPositiveInfinity  = 0x080,
124*795d594fSAndroid Build Coastguard Worker   kSignalingNaN      = 0x100,
125*795d594fSAndroid Build Coastguard Worker   kQuietNaN          = 0x200,
126*795d594fSAndroid Build Coastguard Worker };
127*795d594fSAndroid Build Coastguard Worker 
128*795d594fSAndroid Build Coastguard Worker enum class CSRAddress : uint32_t {
129*795d594fSAndroid Build Coastguard Worker   kVstart = 0x008,     // Vector start position, URW
130*795d594fSAndroid Build Coastguard Worker   kVxsat = 0x009,      // Fixed-Point Saturate Flag, URW
131*795d594fSAndroid Build Coastguard Worker   kVxrm = 0x00A,       // Fixed-Point Rounding Mode, URW
132*795d594fSAndroid Build Coastguard Worker   kReserved1 = 0x00B,  // Reserved for future vector CSRs
133*795d594fSAndroid Build Coastguard Worker   kReserved2 = 0x00C,
134*795d594fSAndroid Build Coastguard Worker   kReserved3 = 0x00D,
135*795d594fSAndroid Build Coastguard Worker   kReserved4 = 0x00E,
136*795d594fSAndroid Build Coastguard Worker   kVcsr = 0x00F,   // Vector control and status register, URW
137*795d594fSAndroid Build Coastguard Worker   kVl = 0xC20,     // Vector length, URO
138*795d594fSAndroid Build Coastguard Worker   kVtype = 0xC21,  // Vector data type register, URO
139*795d594fSAndroid Build Coastguard Worker   kVlenb = 0xC22,  // VLEN/8 (vector register length in bytes), URO
140*795d594fSAndroid Build Coastguard Worker };
141*795d594fSAndroid Build Coastguard Worker 
142*795d594fSAndroid Build Coastguard Worker class Riscv64Label : public Label {
143*795d594fSAndroid Build Coastguard Worker  public:
Riscv64Label()144*795d594fSAndroid Build Coastguard Worker   Riscv64Label() : prev_branch_id_(kNoPrevBranchId) {}
145*795d594fSAndroid Build Coastguard Worker 
Riscv64Label(Riscv64Label && src)146*795d594fSAndroid Build Coastguard Worker   Riscv64Label(Riscv64Label&& src) noexcept
147*795d594fSAndroid Build Coastguard Worker       // NOLINTNEXTLINE - src.prev_branch_id_ is valid after the move
148*795d594fSAndroid Build Coastguard Worker       : Label(std::move(src)), prev_branch_id_(src.prev_branch_id_) {}
149*795d594fSAndroid Build Coastguard Worker 
150*795d594fSAndroid Build Coastguard Worker  private:
151*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t kNoPrevBranchId = std::numeric_limits<uint32_t>::max();
152*795d594fSAndroid Build Coastguard Worker 
153*795d594fSAndroid Build Coastguard Worker   uint32_t prev_branch_id_;  // To get distance from preceding branch, if any.
154*795d594fSAndroid Build Coastguard Worker 
155*795d594fSAndroid Build Coastguard Worker   friend class Riscv64Assembler;
156*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(Riscv64Label);
157*795d594fSAndroid Build Coastguard Worker };
158*795d594fSAndroid Build Coastguard Worker 
159*795d594fSAndroid Build Coastguard Worker // Assembler literal is a value embedded in code, retrieved using a PC-relative load.
160*795d594fSAndroid Build Coastguard Worker class Literal {
161*795d594fSAndroid Build Coastguard Worker  public:
162*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kMaxSize = 8;
163*795d594fSAndroid Build Coastguard Worker 
Literal(uint32_t size,const uint8_t * data)164*795d594fSAndroid Build Coastguard Worker   Literal(uint32_t size, const uint8_t* data) : label_(), size_(size) {
165*795d594fSAndroid Build Coastguard Worker     DCHECK_LE(size, Literal::kMaxSize);
166*795d594fSAndroid Build Coastguard Worker     memcpy(data_, data, size);
167*795d594fSAndroid Build Coastguard Worker   }
168*795d594fSAndroid Build Coastguard Worker 
169*795d594fSAndroid Build Coastguard Worker   template <typename T>
GetValue()170*795d594fSAndroid Build Coastguard Worker   T GetValue() const {
171*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(size_, sizeof(T));
172*795d594fSAndroid Build Coastguard Worker     T value;
173*795d594fSAndroid Build Coastguard Worker     memcpy(&value, data_, sizeof(T));
174*795d594fSAndroid Build Coastguard Worker     return value;
175*795d594fSAndroid Build Coastguard Worker   }
176*795d594fSAndroid Build Coastguard Worker 
GetSize()177*795d594fSAndroid Build Coastguard Worker   uint32_t GetSize() const { return size_; }
178*795d594fSAndroid Build Coastguard Worker 
GetData()179*795d594fSAndroid Build Coastguard Worker   const uint8_t* GetData() const { return data_; }
180*795d594fSAndroid Build Coastguard Worker 
GetLabel()181*795d594fSAndroid Build Coastguard Worker   Riscv64Label* GetLabel() { return &label_; }
182*795d594fSAndroid Build Coastguard Worker 
GetLabel()183*795d594fSAndroid Build Coastguard Worker   const Riscv64Label* GetLabel() const { return &label_; }
184*795d594fSAndroid Build Coastguard Worker 
185*795d594fSAndroid Build Coastguard Worker  private:
186*795d594fSAndroid Build Coastguard Worker   Riscv64Label label_;
187*795d594fSAndroid Build Coastguard Worker   const uint32_t size_;
188*795d594fSAndroid Build Coastguard Worker   uint8_t data_[kMaxSize];
189*795d594fSAndroid Build Coastguard Worker 
190*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(Literal);
191*795d594fSAndroid Build Coastguard Worker };
192*795d594fSAndroid Build Coastguard Worker 
193*795d594fSAndroid Build Coastguard Worker // Jump table: table of labels emitted after the code and before the literals. Similar to literals.
194*795d594fSAndroid Build Coastguard Worker class JumpTable {
195*795d594fSAndroid Build Coastguard Worker  public:
JumpTable(ArenaVector<Riscv64Label * > && labels)196*795d594fSAndroid Build Coastguard Worker   explicit JumpTable(ArenaVector<Riscv64Label*>&& labels) : label_(), labels_(std::move(labels)) {}
197*795d594fSAndroid Build Coastguard Worker 
GetSize()198*795d594fSAndroid Build Coastguard Worker   size_t GetSize() const { return labels_.size() * sizeof(int32_t); }
199*795d594fSAndroid Build Coastguard Worker 
GetData()200*795d594fSAndroid Build Coastguard Worker   const ArenaVector<Riscv64Label*>& GetData() const { return labels_; }
201*795d594fSAndroid Build Coastguard Worker 
GetLabel()202*795d594fSAndroid Build Coastguard Worker   Riscv64Label* GetLabel() { return &label_; }
203*795d594fSAndroid Build Coastguard Worker 
GetLabel()204*795d594fSAndroid Build Coastguard Worker   const Riscv64Label* GetLabel() const { return &label_; }
205*795d594fSAndroid Build Coastguard Worker 
206*795d594fSAndroid Build Coastguard Worker  private:
207*795d594fSAndroid Build Coastguard Worker   Riscv64Label label_;
208*795d594fSAndroid Build Coastguard Worker   ArenaVector<Riscv64Label*> labels_;
209*795d594fSAndroid Build Coastguard Worker 
210*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(JumpTable);
211*795d594fSAndroid Build Coastguard Worker };
212*795d594fSAndroid Build Coastguard Worker 
213*795d594fSAndroid Build Coastguard Worker class Riscv64Assembler final : public Assembler {
214*795d594fSAndroid Build Coastguard Worker  public:
215*795d594fSAndroid Build Coastguard Worker   explicit Riscv64Assembler(ArenaAllocator* allocator,
216*795d594fSAndroid Build Coastguard Worker                             const Riscv64InstructionSetFeatures* instruction_set_features = nullptr)
217*795d594fSAndroid Build Coastguard Worker       : Riscv64Assembler(allocator,
218*795d594fSAndroid Build Coastguard Worker                          instruction_set_features != nullptr
219*795d594fSAndroid Build Coastguard Worker                              ? ConvertExtensions(instruction_set_features)
220*795d594fSAndroid Build Coastguard Worker                              : kRiscv64AllExtensionsMask) {}
221*795d594fSAndroid Build Coastguard Worker 
Riscv64Assembler(ArenaAllocator * allocator,Riscv64ExtensionMask enabled_extensions)222*795d594fSAndroid Build Coastguard Worker   Riscv64Assembler(ArenaAllocator* allocator, Riscv64ExtensionMask enabled_extensions)
223*795d594fSAndroid Build Coastguard Worker       : Assembler(allocator),
224*795d594fSAndroid Build Coastguard Worker         branches_(allocator->Adapter(kArenaAllocAssembler)),
225*795d594fSAndroid Build Coastguard Worker         finalized_(false),
226*795d594fSAndroid Build Coastguard Worker         overwriting_(false),
227*795d594fSAndroid Build Coastguard Worker         overwrite_location_(0),
228*795d594fSAndroid Build Coastguard Worker         literals_(allocator->Adapter(kArenaAllocAssembler)),
229*795d594fSAndroid Build Coastguard Worker         long_literals_(allocator->Adapter(kArenaAllocAssembler)),
230*795d594fSAndroid Build Coastguard Worker         jump_tables_(allocator->Adapter(kArenaAllocAssembler)),
231*795d594fSAndroid Build Coastguard Worker         last_position_adjustment_(0),
232*795d594fSAndroid Build Coastguard Worker         last_old_position_(0),
233*795d594fSAndroid Build Coastguard Worker         last_branch_id_(0),
234*795d594fSAndroid Build Coastguard Worker         enabled_extensions_(enabled_extensions),
235*795d594fSAndroid Build Coastguard Worker         available_scratch_core_registers_((1u << TMP) | (1u << TMP2)),
236*795d594fSAndroid Build Coastguard Worker         available_scratch_fp_registers_(1u << FTMP) {
237*795d594fSAndroid Build Coastguard Worker     cfi().DelayEmittingAdvancePCs();
238*795d594fSAndroid Build Coastguard Worker   }
239*795d594fSAndroid Build Coastguard Worker 
~Riscv64Assembler()240*795d594fSAndroid Build Coastguard Worker   virtual ~Riscv64Assembler() {
241*795d594fSAndroid Build Coastguard Worker     for (auto& branch : branches_) {
242*795d594fSAndroid Build Coastguard Worker       CHECK(branch.IsResolved());
243*795d594fSAndroid Build Coastguard Worker     }
244*795d594fSAndroid Build Coastguard Worker   }
245*795d594fSAndroid Build Coastguard Worker 
CodeSize()246*795d594fSAndroid Build Coastguard Worker   size_t CodeSize() const override { return Assembler::CodeSize(); }
cfi()247*795d594fSAndroid Build Coastguard Worker   DebugFrameOpCodeWriterForAssembler& cfi() { return Assembler::cfi(); }
248*795d594fSAndroid Build Coastguard Worker 
IsExtensionEnabled(Riscv64Extension ext)249*795d594fSAndroid Build Coastguard Worker   bool IsExtensionEnabled(Riscv64Extension ext) const {
250*795d594fSAndroid Build Coastguard Worker     return (enabled_extensions_ & Riscv64ExtensionBit(ext)) != 0u;
251*795d594fSAndroid Build Coastguard Worker   }
252*795d594fSAndroid Build Coastguard Worker 
253*795d594fSAndroid Build Coastguard Worker   // According to "The RISC-V Instruction Set Manual"
254*795d594fSAndroid Build Coastguard Worker 
255*795d594fSAndroid Build Coastguard Worker   // LUI/AUIPC (RV32I, with sign-extension on RV64I), opcode = 0x17, 0x37
256*795d594fSAndroid Build Coastguard Worker   // Note: These take a 20-bit unsigned value to align with the clang assembler for testing,
257*795d594fSAndroid Build Coastguard Worker   // but the value stored in the register shall actually be sign-extended to 64 bits.
258*795d594fSAndroid Build Coastguard Worker   void Lui(XRegister rd, uint32_t imm20);
259*795d594fSAndroid Build Coastguard Worker   void Auipc(XRegister rd, uint32_t imm20);
260*795d594fSAndroid Build Coastguard Worker 
261*795d594fSAndroid Build Coastguard Worker   // Jump instructions (RV32I), opcode = 0x67, 0x6f
262*795d594fSAndroid Build Coastguard Worker   void Jal(XRegister rd, int32_t offset);
263*795d594fSAndroid Build Coastguard Worker   void Jalr(XRegister rd, XRegister rs1, int32_t offset);
264*795d594fSAndroid Build Coastguard Worker 
265*795d594fSAndroid Build Coastguard Worker   // Branch instructions (RV32I), opcode = 0x63, funct3 from 0x0 ~ 0x1 and 0x4 ~ 0x7
266*795d594fSAndroid Build Coastguard Worker   void Beq(XRegister rs1, XRegister rs2, int32_t offset);
267*795d594fSAndroid Build Coastguard Worker   void Bne(XRegister rs1, XRegister rs2, int32_t offset);
268*795d594fSAndroid Build Coastguard Worker   void Blt(XRegister rs1, XRegister rs2, int32_t offset);
269*795d594fSAndroid Build Coastguard Worker   void Bge(XRegister rs1, XRegister rs2, int32_t offset);
270*795d594fSAndroid Build Coastguard Worker   void Bltu(XRegister rs1, XRegister rs2, int32_t offset);
271*795d594fSAndroid Build Coastguard Worker   void Bgeu(XRegister rs1, XRegister rs2, int32_t offset);
272*795d594fSAndroid Build Coastguard Worker 
273*795d594fSAndroid Build Coastguard Worker   // Load instructions (RV32I+RV64I): opcode = 0x03, funct3 from 0x0 ~ 0x6
274*795d594fSAndroid Build Coastguard Worker   void Lb(XRegister rd, XRegister rs1, int32_t offset);
275*795d594fSAndroid Build Coastguard Worker   void Lh(XRegister rd, XRegister rs1, int32_t offset);
276*795d594fSAndroid Build Coastguard Worker   void Lw(XRegister rd, XRegister rs1, int32_t offset);
277*795d594fSAndroid Build Coastguard Worker   void Ld(XRegister rd, XRegister rs1, int32_t offset);
278*795d594fSAndroid Build Coastguard Worker   void Lbu(XRegister rd, XRegister rs1, int32_t offset);
279*795d594fSAndroid Build Coastguard Worker   void Lhu(XRegister rd, XRegister rs1, int32_t offset);
280*795d594fSAndroid Build Coastguard Worker   void Lwu(XRegister rd, XRegister rs1, int32_t offset);
281*795d594fSAndroid Build Coastguard Worker 
282*795d594fSAndroid Build Coastguard Worker   // Store instructions (RV32I+RV64I): opcode = 0x23, funct3 from 0x0 ~ 0x3
283*795d594fSAndroid Build Coastguard Worker   void Sb(XRegister rs2, XRegister rs1, int32_t offset);
284*795d594fSAndroid Build Coastguard Worker   void Sh(XRegister rs2, XRegister rs1, int32_t offset);
285*795d594fSAndroid Build Coastguard Worker   void Sw(XRegister rs2, XRegister rs1, int32_t offset);
286*795d594fSAndroid Build Coastguard Worker   void Sd(XRegister rs2, XRegister rs1, int32_t offset);
287*795d594fSAndroid Build Coastguard Worker 
288*795d594fSAndroid Build Coastguard Worker   // IMM ALU instructions (RV32I): opcode = 0x13, funct3 from 0x0 ~ 0x7
289*795d594fSAndroid Build Coastguard Worker   void Addi(XRegister rd, XRegister rs1, int32_t imm12);
290*795d594fSAndroid Build Coastguard Worker   void Slti(XRegister rd, XRegister rs1, int32_t imm12);
291*795d594fSAndroid Build Coastguard Worker   void Sltiu(XRegister rd, XRegister rs1, int32_t imm12);
292*795d594fSAndroid Build Coastguard Worker   void Xori(XRegister rd, XRegister rs1, int32_t imm12);
293*795d594fSAndroid Build Coastguard Worker   void Ori(XRegister rd, XRegister rs1, int32_t imm12);
294*795d594fSAndroid Build Coastguard Worker   void Andi(XRegister rd, XRegister rs1, int32_t imm12);
295*795d594fSAndroid Build Coastguard Worker   void Slli(XRegister rd, XRegister rs1, int32_t shamt);
296*795d594fSAndroid Build Coastguard Worker   void Srli(XRegister rd, XRegister rs1, int32_t shamt);
297*795d594fSAndroid Build Coastguard Worker   void Srai(XRegister rd, XRegister rs1, int32_t shamt);
298*795d594fSAndroid Build Coastguard Worker 
299*795d594fSAndroid Build Coastguard Worker   // ALU instructions (RV32I): opcode = 0x33, funct3 from 0x0 ~ 0x7
300*795d594fSAndroid Build Coastguard Worker   void Add(XRegister rd, XRegister rs1, XRegister rs2);
301*795d594fSAndroid Build Coastguard Worker   void Sub(XRegister rd, XRegister rs1, XRegister rs2);
302*795d594fSAndroid Build Coastguard Worker   void Slt(XRegister rd, XRegister rs1, XRegister rs2);
303*795d594fSAndroid Build Coastguard Worker   void Sltu(XRegister rd, XRegister rs1, XRegister rs2);
304*795d594fSAndroid Build Coastguard Worker   void Xor(XRegister rd, XRegister rs1, XRegister rs2);
305*795d594fSAndroid Build Coastguard Worker   void Or(XRegister rd, XRegister rs1, XRegister rs2);
306*795d594fSAndroid Build Coastguard Worker   void And(XRegister rd, XRegister rs1, XRegister rs2);
307*795d594fSAndroid Build Coastguard Worker   void Sll(XRegister rd, XRegister rs1, XRegister rs2);
308*795d594fSAndroid Build Coastguard Worker   void Srl(XRegister rd, XRegister rs1, XRegister rs2);
309*795d594fSAndroid Build Coastguard Worker   void Sra(XRegister rd, XRegister rs1, XRegister rs2);
310*795d594fSAndroid Build Coastguard Worker 
311*795d594fSAndroid Build Coastguard Worker   // 32bit Imm ALU instructions (RV64I): opcode = 0x1b, funct3 from 0x0, 0x1, 0x5
312*795d594fSAndroid Build Coastguard Worker   void Addiw(XRegister rd, XRegister rs1, int32_t imm12);
313*795d594fSAndroid Build Coastguard Worker   void Slliw(XRegister rd, XRegister rs1, int32_t shamt);
314*795d594fSAndroid Build Coastguard Worker   void Srliw(XRegister rd, XRegister rs1, int32_t shamt);
315*795d594fSAndroid Build Coastguard Worker   void Sraiw(XRegister rd, XRegister rs1, int32_t shamt);
316*795d594fSAndroid Build Coastguard Worker 
317*795d594fSAndroid Build Coastguard Worker   // 32bit ALU instructions (RV64I): opcode = 0x3b, funct3 from 0x0 ~ 0x7
318*795d594fSAndroid Build Coastguard Worker   void Addw(XRegister rd, XRegister rs1, XRegister rs2);
319*795d594fSAndroid Build Coastguard Worker   void Subw(XRegister rd, XRegister rs1, XRegister rs2);
320*795d594fSAndroid Build Coastguard Worker   void Sllw(XRegister rd, XRegister rs1, XRegister rs2);
321*795d594fSAndroid Build Coastguard Worker   void Srlw(XRegister rd, XRegister rs1, XRegister rs2);
322*795d594fSAndroid Build Coastguard Worker   void Sraw(XRegister rd, XRegister rs1, XRegister rs2);
323*795d594fSAndroid Build Coastguard Worker 
324*795d594fSAndroid Build Coastguard Worker   // Environment call and breakpoint (RV32I), opcode = 0x73
325*795d594fSAndroid Build Coastguard Worker   void Ecall();
326*795d594fSAndroid Build Coastguard Worker   void Ebreak();
327*795d594fSAndroid Build Coastguard Worker 
328*795d594fSAndroid Build Coastguard Worker   // Fence instruction (RV32I): opcode = 0xf, funct3 = 0
329*795d594fSAndroid Build Coastguard Worker   void Fence(uint32_t pred = kFenceDefault, uint32_t succ = kFenceDefault);
330*795d594fSAndroid Build Coastguard Worker   void FenceTso();
331*795d594fSAndroid Build Coastguard Worker 
332*795d594fSAndroid Build Coastguard Worker   // "Zifencei" Standard Extension, opcode = 0xf, funct3 = 1
333*795d594fSAndroid Build Coastguard Worker   void FenceI();
334*795d594fSAndroid Build Coastguard Worker 
335*795d594fSAndroid Build Coastguard Worker   // RV32M Standard Extension: opcode = 0x33, funct3 from 0x0 ~ 0x7
336*795d594fSAndroid Build Coastguard Worker   void Mul(XRegister rd, XRegister rs1, XRegister rs2);
337*795d594fSAndroid Build Coastguard Worker   void Mulh(XRegister rd, XRegister rs1, XRegister rs2);
338*795d594fSAndroid Build Coastguard Worker   void Mulhsu(XRegister rd, XRegister rs1, XRegister rs2);
339*795d594fSAndroid Build Coastguard Worker   void Mulhu(XRegister rd, XRegister rs1, XRegister rs2);
340*795d594fSAndroid Build Coastguard Worker   void Div(XRegister rd, XRegister rs1, XRegister rs2);
341*795d594fSAndroid Build Coastguard Worker   void Divu(XRegister rd, XRegister rs1, XRegister rs2);
342*795d594fSAndroid Build Coastguard Worker   void Rem(XRegister rd, XRegister rs1, XRegister rs2);
343*795d594fSAndroid Build Coastguard Worker   void Remu(XRegister rd, XRegister rs1, XRegister rs2);
344*795d594fSAndroid Build Coastguard Worker 
345*795d594fSAndroid Build Coastguard Worker   // RV64M Standard Extension: opcode = 0x3b, funct3 0x0 and from 0x4 ~ 0x7
346*795d594fSAndroid Build Coastguard Worker   void Mulw(XRegister rd, XRegister rs1, XRegister rs2);
347*795d594fSAndroid Build Coastguard Worker   void Divw(XRegister rd, XRegister rs1, XRegister rs2);
348*795d594fSAndroid Build Coastguard Worker   void Divuw(XRegister rd, XRegister rs1, XRegister rs2);
349*795d594fSAndroid Build Coastguard Worker   void Remw(XRegister rd, XRegister rs1, XRegister rs2);
350*795d594fSAndroid Build Coastguard Worker   void Remuw(XRegister rd, XRegister rs1, XRegister rs2);
351*795d594fSAndroid Build Coastguard Worker 
352*795d594fSAndroid Build Coastguard Worker   // RV32A/RV64A Standard Extension
353*795d594fSAndroid Build Coastguard Worker   void LrW(XRegister rd, XRegister rs1, AqRl aqrl);
354*795d594fSAndroid Build Coastguard Worker   void LrD(XRegister rd, XRegister rs1, AqRl aqrl);
355*795d594fSAndroid Build Coastguard Worker   void ScW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
356*795d594fSAndroid Build Coastguard Worker   void ScD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
357*795d594fSAndroid Build Coastguard Worker   void AmoSwapW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
358*795d594fSAndroid Build Coastguard Worker   void AmoSwapD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
359*795d594fSAndroid Build Coastguard Worker   void AmoAddW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
360*795d594fSAndroid Build Coastguard Worker   void AmoAddD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
361*795d594fSAndroid Build Coastguard Worker   void AmoXorW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
362*795d594fSAndroid Build Coastguard Worker   void AmoXorD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
363*795d594fSAndroid Build Coastguard Worker   void AmoAndW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
364*795d594fSAndroid Build Coastguard Worker   void AmoAndD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
365*795d594fSAndroid Build Coastguard Worker   void AmoOrW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
366*795d594fSAndroid Build Coastguard Worker   void AmoOrD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
367*795d594fSAndroid Build Coastguard Worker   void AmoMinW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
368*795d594fSAndroid Build Coastguard Worker   void AmoMinD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
369*795d594fSAndroid Build Coastguard Worker   void AmoMaxW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
370*795d594fSAndroid Build Coastguard Worker   void AmoMaxD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
371*795d594fSAndroid Build Coastguard Worker   void AmoMinuW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
372*795d594fSAndroid Build Coastguard Worker   void AmoMinuD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
373*795d594fSAndroid Build Coastguard Worker   void AmoMaxuW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
374*795d594fSAndroid Build Coastguard Worker   void AmoMaxuD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl);
375*795d594fSAndroid Build Coastguard Worker 
376*795d594fSAndroid Build Coastguard Worker   // "Zicsr" Standard Extension, opcode = 0x73, funct3 from 0x1 ~ 0x3 and 0x5 ~ 0x7
377*795d594fSAndroid Build Coastguard Worker   void Csrrw(XRegister rd, uint32_t csr, XRegister rs1);
378*795d594fSAndroid Build Coastguard Worker   void Csrrs(XRegister rd, uint32_t csr, XRegister rs1);
379*795d594fSAndroid Build Coastguard Worker   void Csrrc(XRegister rd, uint32_t csr, XRegister rs1);
380*795d594fSAndroid Build Coastguard Worker   void Csrrwi(XRegister rd, uint32_t csr, uint32_t uimm5);
381*795d594fSAndroid Build Coastguard Worker   void Csrrsi(XRegister rd, uint32_t csr, uint32_t uimm5);
382*795d594fSAndroid Build Coastguard Worker   void Csrrci(XRegister rd, uint32_t csr, uint32_t uimm5);
383*795d594fSAndroid Build Coastguard Worker 
384*795d594fSAndroid Build Coastguard Worker   // FP load/store instructions (RV32F+RV32D): opcode = 0x07, 0x27
385*795d594fSAndroid Build Coastguard Worker   void FLw(FRegister rd, XRegister rs1, int32_t offset);
386*795d594fSAndroid Build Coastguard Worker   void FLd(FRegister rd, XRegister rs1, int32_t offset);
387*795d594fSAndroid Build Coastguard Worker   void FSw(FRegister rs2, XRegister rs1, int32_t offset);
388*795d594fSAndroid Build Coastguard Worker   void FSd(FRegister rs2, XRegister rs1, int32_t offset);
389*795d594fSAndroid Build Coastguard Worker 
390*795d594fSAndroid Build Coastguard Worker   // FP FMA instructions (RV32F+RV32D): opcode = 0x43, 0x47, 0x4b, 0x4f
391*795d594fSAndroid Build Coastguard Worker   void FMAddS(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3, FPRoundingMode frm);
392*795d594fSAndroid Build Coastguard Worker   void FMAddD(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3, FPRoundingMode frm);
393*795d594fSAndroid Build Coastguard Worker   void FMSubS(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3, FPRoundingMode frm);
394*795d594fSAndroid Build Coastguard Worker   void FMSubD(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3, FPRoundingMode frm);
395*795d594fSAndroid Build Coastguard Worker   void FNMSubS(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3, FPRoundingMode frm);
396*795d594fSAndroid Build Coastguard Worker   void FNMSubD(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3, FPRoundingMode frm);
397*795d594fSAndroid Build Coastguard Worker   void FNMAddS(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3, FPRoundingMode frm);
398*795d594fSAndroid Build Coastguard Worker   void FNMAddD(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3, FPRoundingMode frm);
399*795d594fSAndroid Build Coastguard Worker 
400*795d594fSAndroid Build Coastguard Worker   // FP FMA instruction helpers passing the default rounding mode.
FMAddS(FRegister rd,FRegister rs1,FRegister rs2,FRegister rs3)401*795d594fSAndroid Build Coastguard Worker   void FMAddS(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3) {
402*795d594fSAndroid Build Coastguard Worker     FMAddS(rd, rs1, rs2, rs3, FPRoundingMode::kDefault);
403*795d594fSAndroid Build Coastguard Worker   }
FMAddD(FRegister rd,FRegister rs1,FRegister rs2,FRegister rs3)404*795d594fSAndroid Build Coastguard Worker   void FMAddD(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3) {
405*795d594fSAndroid Build Coastguard Worker     FMAddD(rd, rs1, rs2, rs3, FPRoundingMode::kDefault);
406*795d594fSAndroid Build Coastguard Worker   }
FMSubS(FRegister rd,FRegister rs1,FRegister rs2,FRegister rs3)407*795d594fSAndroid Build Coastguard Worker   void FMSubS(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3) {
408*795d594fSAndroid Build Coastguard Worker     FMSubS(rd, rs1, rs2, rs3, FPRoundingMode::kDefault);
409*795d594fSAndroid Build Coastguard Worker   }
FMSubD(FRegister rd,FRegister rs1,FRegister rs2,FRegister rs3)410*795d594fSAndroid Build Coastguard Worker   void FMSubD(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3) {
411*795d594fSAndroid Build Coastguard Worker     FMSubD(rd, rs1, rs2, rs3, FPRoundingMode::kDefault);
412*795d594fSAndroid Build Coastguard Worker   }
FNMSubS(FRegister rd,FRegister rs1,FRegister rs2,FRegister rs3)413*795d594fSAndroid Build Coastguard Worker   void FNMSubS(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3) {
414*795d594fSAndroid Build Coastguard Worker     FNMSubS(rd, rs1, rs2, rs3, FPRoundingMode::kDefault);
415*795d594fSAndroid Build Coastguard Worker   }
FNMSubD(FRegister rd,FRegister rs1,FRegister rs2,FRegister rs3)416*795d594fSAndroid Build Coastguard Worker   void FNMSubD(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3) {
417*795d594fSAndroid Build Coastguard Worker     FNMSubD(rd, rs1, rs2, rs3, FPRoundingMode::kDefault);
418*795d594fSAndroid Build Coastguard Worker   }
FNMAddS(FRegister rd,FRegister rs1,FRegister rs2,FRegister rs3)419*795d594fSAndroid Build Coastguard Worker   void FNMAddS(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3) {
420*795d594fSAndroid Build Coastguard Worker     FNMAddS(rd, rs1, rs2, rs3, FPRoundingMode::kDefault);
421*795d594fSAndroid Build Coastguard Worker   }
FNMAddD(FRegister rd,FRegister rs1,FRegister rs2,FRegister rs3)422*795d594fSAndroid Build Coastguard Worker   void FNMAddD(FRegister rd, FRegister rs1, FRegister rs2, FRegister rs3) {
423*795d594fSAndroid Build Coastguard Worker     FNMAddD(rd, rs1, rs2, rs3, FPRoundingMode::kDefault);
424*795d594fSAndroid Build Coastguard Worker   }
425*795d594fSAndroid Build Coastguard Worker 
426*795d594fSAndroid Build Coastguard Worker   // Simple FP instructions (RV32F+RV32D): opcode = 0x53, funct7 = 0b0XXXX0D
427*795d594fSAndroid Build Coastguard Worker   void FAddS(FRegister rd, FRegister rs1, FRegister rs2, FPRoundingMode frm);
428*795d594fSAndroid Build Coastguard Worker   void FAddD(FRegister rd, FRegister rs1, FRegister rs2, FPRoundingMode frm);
429*795d594fSAndroid Build Coastguard Worker   void FSubS(FRegister rd, FRegister rs1, FRegister rs2, FPRoundingMode frm);
430*795d594fSAndroid Build Coastguard Worker   void FSubD(FRegister rd, FRegister rs1, FRegister rs2, FPRoundingMode frm);
431*795d594fSAndroid Build Coastguard Worker   void FMulS(FRegister rd, FRegister rs1, FRegister rs2, FPRoundingMode frm);
432*795d594fSAndroid Build Coastguard Worker   void FMulD(FRegister rd, FRegister rs1, FRegister rs2, FPRoundingMode frm);
433*795d594fSAndroid Build Coastguard Worker   void FDivS(FRegister rd, FRegister rs1, FRegister rs2, FPRoundingMode frm);
434*795d594fSAndroid Build Coastguard Worker   void FDivD(FRegister rd, FRegister rs1, FRegister rs2, FPRoundingMode frm);
435*795d594fSAndroid Build Coastguard Worker   void FSqrtS(FRegister rd, FRegister rs1, FPRoundingMode frm);
436*795d594fSAndroid Build Coastguard Worker   void FSqrtD(FRegister rd, FRegister rs1, FPRoundingMode frm);
437*795d594fSAndroid Build Coastguard Worker   void FSgnjS(FRegister rd, FRegister rs1, FRegister rs2);
438*795d594fSAndroid Build Coastguard Worker   void FSgnjD(FRegister rd, FRegister rs1, FRegister rs2);
439*795d594fSAndroid Build Coastguard Worker   void FSgnjnS(FRegister rd, FRegister rs1, FRegister rs2);
440*795d594fSAndroid Build Coastguard Worker   void FSgnjnD(FRegister rd, FRegister rs1, FRegister rs2);
441*795d594fSAndroid Build Coastguard Worker   void FSgnjxS(FRegister rd, FRegister rs1, FRegister rs2);
442*795d594fSAndroid Build Coastguard Worker   void FSgnjxD(FRegister rd, FRegister rs1, FRegister rs2);
443*795d594fSAndroid Build Coastguard Worker   void FMinS(FRegister rd, FRegister rs1, FRegister rs2);
444*795d594fSAndroid Build Coastguard Worker   void FMinD(FRegister rd, FRegister rs1, FRegister rs2);
445*795d594fSAndroid Build Coastguard Worker   void FMaxS(FRegister rd, FRegister rs1, FRegister rs2);
446*795d594fSAndroid Build Coastguard Worker   void FMaxD(FRegister rd, FRegister rs1, FRegister rs2);
447*795d594fSAndroid Build Coastguard Worker   void FCvtSD(FRegister rd, FRegister rs1, FPRoundingMode frm);
448*795d594fSAndroid Build Coastguard Worker   void FCvtDS(FRegister rd, FRegister rs1, FPRoundingMode frm);
449*795d594fSAndroid Build Coastguard Worker 
450*795d594fSAndroid Build Coastguard Worker   // Simple FP instruction helpers passing the default rounding mode.
FAddS(FRegister rd,FRegister rs1,FRegister rs2)451*795d594fSAndroid Build Coastguard Worker   void FAddS(FRegister rd, FRegister rs1, FRegister rs2) {
452*795d594fSAndroid Build Coastguard Worker     FAddS(rd, rs1, rs2, FPRoundingMode::kDefault);
453*795d594fSAndroid Build Coastguard Worker   }
FAddD(FRegister rd,FRegister rs1,FRegister rs2)454*795d594fSAndroid Build Coastguard Worker   void FAddD(FRegister rd, FRegister rs1, FRegister rs2) {
455*795d594fSAndroid Build Coastguard Worker     FAddD(rd, rs1, rs2, FPRoundingMode::kDefault);
456*795d594fSAndroid Build Coastguard Worker   }
FSubS(FRegister rd,FRegister rs1,FRegister rs2)457*795d594fSAndroid Build Coastguard Worker   void FSubS(FRegister rd, FRegister rs1, FRegister rs2) {
458*795d594fSAndroid Build Coastguard Worker     FSubS(rd, rs1, rs2, FPRoundingMode::kDefault);
459*795d594fSAndroid Build Coastguard Worker   }
FSubD(FRegister rd,FRegister rs1,FRegister rs2)460*795d594fSAndroid Build Coastguard Worker   void FSubD(FRegister rd, FRegister rs1, FRegister rs2) {
461*795d594fSAndroid Build Coastguard Worker     FSubD(rd, rs1, rs2, FPRoundingMode::kDefault);
462*795d594fSAndroid Build Coastguard Worker   }
FMulS(FRegister rd,FRegister rs1,FRegister rs2)463*795d594fSAndroid Build Coastguard Worker   void FMulS(FRegister rd, FRegister rs1, FRegister rs2) {
464*795d594fSAndroid Build Coastguard Worker     FMulS(rd, rs1, rs2, FPRoundingMode::kDefault);
465*795d594fSAndroid Build Coastguard Worker   }
FMulD(FRegister rd,FRegister rs1,FRegister rs2)466*795d594fSAndroid Build Coastguard Worker   void FMulD(FRegister rd, FRegister rs1, FRegister rs2) {
467*795d594fSAndroid Build Coastguard Worker     FMulD(rd, rs1, rs2, FPRoundingMode::kDefault);
468*795d594fSAndroid Build Coastguard Worker   }
FDivS(FRegister rd,FRegister rs1,FRegister rs2)469*795d594fSAndroid Build Coastguard Worker   void FDivS(FRegister rd, FRegister rs1, FRegister rs2) {
470*795d594fSAndroid Build Coastguard Worker     FDivS(rd, rs1, rs2, FPRoundingMode::kDefault);
471*795d594fSAndroid Build Coastguard Worker   }
FDivD(FRegister rd,FRegister rs1,FRegister rs2)472*795d594fSAndroid Build Coastguard Worker   void FDivD(FRegister rd, FRegister rs1, FRegister rs2) {
473*795d594fSAndroid Build Coastguard Worker     FDivD(rd, rs1, rs2, FPRoundingMode::kDefault);
474*795d594fSAndroid Build Coastguard Worker   }
FSqrtS(FRegister rd,FRegister rs1)475*795d594fSAndroid Build Coastguard Worker   void FSqrtS(FRegister rd, FRegister rs1) {
476*795d594fSAndroid Build Coastguard Worker     FSqrtS(rd, rs1, FPRoundingMode::kDefault);
477*795d594fSAndroid Build Coastguard Worker   }
FSqrtD(FRegister rd,FRegister rs1)478*795d594fSAndroid Build Coastguard Worker   void FSqrtD(FRegister rd, FRegister rs1) {
479*795d594fSAndroid Build Coastguard Worker     FSqrtD(rd, rs1, FPRoundingMode::kDefault);
480*795d594fSAndroid Build Coastguard Worker   }
FCvtSD(FRegister rd,FRegister rs1)481*795d594fSAndroid Build Coastguard Worker   void FCvtSD(FRegister rd, FRegister rs1) {
482*795d594fSAndroid Build Coastguard Worker     FCvtSD(rd, rs1, FPRoundingMode::kDefault);
483*795d594fSAndroid Build Coastguard Worker   }
FCvtDS(FRegister rd,FRegister rs1)484*795d594fSAndroid Build Coastguard Worker   void FCvtDS(FRegister rd, FRegister rs1) {
485*795d594fSAndroid Build Coastguard Worker     FCvtDS(rd, rs1, FPRoundingMode::kIgnored);
486*795d594fSAndroid Build Coastguard Worker   }
487*795d594fSAndroid Build Coastguard Worker 
488*795d594fSAndroid Build Coastguard Worker   // FP compare instructions (RV32F+RV32D): opcode = 0x53, funct7 = 0b101000D
489*795d594fSAndroid Build Coastguard Worker   void FEqS(XRegister rd, FRegister rs1, FRegister rs2);
490*795d594fSAndroid Build Coastguard Worker   void FEqD(XRegister rd, FRegister rs1, FRegister rs2);
491*795d594fSAndroid Build Coastguard Worker   void FLtS(XRegister rd, FRegister rs1, FRegister rs2);
492*795d594fSAndroid Build Coastguard Worker   void FLtD(XRegister rd, FRegister rs1, FRegister rs2);
493*795d594fSAndroid Build Coastguard Worker   void FLeS(XRegister rd, FRegister rs1, FRegister rs2);
494*795d594fSAndroid Build Coastguard Worker   void FLeD(XRegister rd, FRegister rs1, FRegister rs2);
495*795d594fSAndroid Build Coastguard Worker 
496*795d594fSAndroid Build Coastguard Worker   // FP conversion instructions (RV32F+RV32D+RV64F+RV64D): opcode = 0x53, funct7 = 0b110X00D
497*795d594fSAndroid Build Coastguard Worker   void FCvtWS(XRegister rd, FRegister rs1, FPRoundingMode frm);
498*795d594fSAndroid Build Coastguard Worker   void FCvtWD(XRegister rd, FRegister rs1, FPRoundingMode frm);
499*795d594fSAndroid Build Coastguard Worker   void FCvtWuS(XRegister rd, FRegister rs1, FPRoundingMode frm);
500*795d594fSAndroid Build Coastguard Worker   void FCvtWuD(XRegister rd, FRegister rs1, FPRoundingMode frm);
501*795d594fSAndroid Build Coastguard Worker   void FCvtLS(XRegister rd, FRegister rs1, FPRoundingMode frm);
502*795d594fSAndroid Build Coastguard Worker   void FCvtLD(XRegister rd, FRegister rs1, FPRoundingMode frm);
503*795d594fSAndroid Build Coastguard Worker   void FCvtLuS(XRegister rd, FRegister rs1, FPRoundingMode frm);
504*795d594fSAndroid Build Coastguard Worker   void FCvtLuD(XRegister rd, FRegister rs1, FPRoundingMode frm);
505*795d594fSAndroid Build Coastguard Worker   void FCvtSW(FRegister rd, XRegister rs1, FPRoundingMode frm);
506*795d594fSAndroid Build Coastguard Worker   void FCvtDW(FRegister rd, XRegister rs1, FPRoundingMode frm);
507*795d594fSAndroid Build Coastguard Worker   void FCvtSWu(FRegister rd, XRegister rs1, FPRoundingMode frm);
508*795d594fSAndroid Build Coastguard Worker   void FCvtDWu(FRegister rd, XRegister rs1, FPRoundingMode frm);
509*795d594fSAndroid Build Coastguard Worker   void FCvtSL(FRegister rd, XRegister rs1, FPRoundingMode frm);
510*795d594fSAndroid Build Coastguard Worker   void FCvtDL(FRegister rd, XRegister rs1, FPRoundingMode frm);
511*795d594fSAndroid Build Coastguard Worker   void FCvtSLu(FRegister rd, XRegister rs1, FPRoundingMode frm);
512*795d594fSAndroid Build Coastguard Worker   void FCvtDLu(FRegister rd, XRegister rs1, FPRoundingMode frm);
513*795d594fSAndroid Build Coastguard Worker 
514*795d594fSAndroid Build Coastguard Worker   // FP conversion instruction helpers passing the default rounding mode.
FCvtWS(XRegister rd,FRegister rs1)515*795d594fSAndroid Build Coastguard Worker   void FCvtWS(XRegister rd, FRegister rs1) { FCvtWS(rd, rs1, FPRoundingMode::kDefault); }
FCvtWD(XRegister rd,FRegister rs1)516*795d594fSAndroid Build Coastguard Worker   void FCvtWD(XRegister rd, FRegister rs1) { FCvtWD(rd, rs1, FPRoundingMode::kDefault); }
FCvtWuS(XRegister rd,FRegister rs1)517*795d594fSAndroid Build Coastguard Worker   void FCvtWuS(XRegister rd, FRegister rs1) { FCvtWuS(rd, rs1, FPRoundingMode::kDefault); }
FCvtWuD(XRegister rd,FRegister rs1)518*795d594fSAndroid Build Coastguard Worker   void FCvtWuD(XRegister rd, FRegister rs1) { FCvtWuD(rd, rs1, FPRoundingMode::kDefault); }
FCvtLS(XRegister rd,FRegister rs1)519*795d594fSAndroid Build Coastguard Worker   void FCvtLS(XRegister rd, FRegister rs1) { FCvtLS(rd, rs1, FPRoundingMode::kDefault); }
FCvtLD(XRegister rd,FRegister rs1)520*795d594fSAndroid Build Coastguard Worker   void FCvtLD(XRegister rd, FRegister rs1) { FCvtLD(rd, rs1, FPRoundingMode::kDefault); }
FCvtLuS(XRegister rd,FRegister rs1)521*795d594fSAndroid Build Coastguard Worker   void FCvtLuS(XRegister rd, FRegister rs1) { FCvtLuS(rd, rs1, FPRoundingMode::kDefault); }
FCvtLuD(XRegister rd,FRegister rs1)522*795d594fSAndroid Build Coastguard Worker   void FCvtLuD(XRegister rd, FRegister rs1) { FCvtLuD(rd, rs1, FPRoundingMode::kDefault); }
FCvtSW(FRegister rd,XRegister rs1)523*795d594fSAndroid Build Coastguard Worker   void FCvtSW(FRegister rd, XRegister rs1) { FCvtSW(rd, rs1, FPRoundingMode::kDefault); }
FCvtDW(FRegister rd,XRegister rs1)524*795d594fSAndroid Build Coastguard Worker   void FCvtDW(FRegister rd, XRegister rs1) { FCvtDW(rd, rs1, FPRoundingMode::kIgnored); }
FCvtSWu(FRegister rd,XRegister rs1)525*795d594fSAndroid Build Coastguard Worker   void FCvtSWu(FRegister rd, XRegister rs1) { FCvtSWu(rd, rs1, FPRoundingMode::kDefault); }
FCvtDWu(FRegister rd,XRegister rs1)526*795d594fSAndroid Build Coastguard Worker   void FCvtDWu(FRegister rd, XRegister rs1) { FCvtDWu(rd, rs1, FPRoundingMode::kIgnored); }
FCvtSL(FRegister rd,XRegister rs1)527*795d594fSAndroid Build Coastguard Worker   void FCvtSL(FRegister rd, XRegister rs1) { FCvtSL(rd, rs1, FPRoundingMode::kDefault); }
FCvtDL(FRegister rd,XRegister rs1)528*795d594fSAndroid Build Coastguard Worker   void FCvtDL(FRegister rd, XRegister rs1) { FCvtDL(rd, rs1, FPRoundingMode::kDefault); }
FCvtSLu(FRegister rd,XRegister rs1)529*795d594fSAndroid Build Coastguard Worker   void FCvtSLu(FRegister rd, XRegister rs1) { FCvtSLu(rd, rs1, FPRoundingMode::kDefault); }
FCvtDLu(FRegister rd,XRegister rs1)530*795d594fSAndroid Build Coastguard Worker   void FCvtDLu(FRegister rd, XRegister rs1) { FCvtDLu(rd, rs1, FPRoundingMode::kDefault); }
531*795d594fSAndroid Build Coastguard Worker 
532*795d594fSAndroid Build Coastguard Worker   // FP move instructions (RV32F+RV32D): opcode = 0x53, funct3 = 0x0, funct7 = 0b111X00D
533*795d594fSAndroid Build Coastguard Worker   void FMvXW(XRegister rd, FRegister rs1);
534*795d594fSAndroid Build Coastguard Worker   void FMvXD(XRegister rd, FRegister rs1);
535*795d594fSAndroid Build Coastguard Worker   void FMvWX(FRegister rd, XRegister rs1);
536*795d594fSAndroid Build Coastguard Worker   void FMvDX(FRegister rd, XRegister rs1);
537*795d594fSAndroid Build Coastguard Worker 
538*795d594fSAndroid Build Coastguard Worker   // FP classify instructions (RV32F+RV32D): opcode = 0x53, funct3 = 0x1, funct7 = 0b111X00D
539*795d594fSAndroid Build Coastguard Worker   void FClassS(XRegister rd, FRegister rs1);
540*795d594fSAndroid Build Coastguard Worker   void FClassD(XRegister rd, FRegister rs1);
541*795d594fSAndroid Build Coastguard Worker 
542*795d594fSAndroid Build Coastguard Worker   // "C" Standard Extension, Compresseed Instructions
543*795d594fSAndroid Build Coastguard Worker   void CLwsp(XRegister rd, int32_t offset);
544*795d594fSAndroid Build Coastguard Worker   void CLdsp(XRegister rd, int32_t offset);
545*795d594fSAndroid Build Coastguard Worker   void CFLdsp(FRegister rd, int32_t offset);
546*795d594fSAndroid Build Coastguard Worker   void CSwsp(XRegister rs2, int32_t offset);
547*795d594fSAndroid Build Coastguard Worker   void CSdsp(XRegister rs2, int32_t offset);
548*795d594fSAndroid Build Coastguard Worker   void CFSdsp(FRegister rs2, int32_t offset);
549*795d594fSAndroid Build Coastguard Worker 
550*795d594fSAndroid Build Coastguard Worker   void CLw(XRegister rd_s, XRegister rs1_s, int32_t offset);
551*795d594fSAndroid Build Coastguard Worker   void CLd(XRegister rd_s, XRegister rs1_s, int32_t offset);
552*795d594fSAndroid Build Coastguard Worker   void CFLd(FRegister rd_s, XRegister rs1_s, int32_t offset);
553*795d594fSAndroid Build Coastguard Worker   void CSw(XRegister rs2_s, XRegister rs1_s, int32_t offset);
554*795d594fSAndroid Build Coastguard Worker   void CSd(XRegister rs2_s, XRegister rs1_s, int32_t offset);
555*795d594fSAndroid Build Coastguard Worker   void CFSd(FRegister rs2_s, XRegister rs1_s, int32_t offset);
556*795d594fSAndroid Build Coastguard Worker 
557*795d594fSAndroid Build Coastguard Worker   void CLi(XRegister rd, int32_t imm);
558*795d594fSAndroid Build Coastguard Worker   void CLui(XRegister rd, uint32_t nzimm6);
559*795d594fSAndroid Build Coastguard Worker   void CAddi(XRegister rd, int32_t nzimm);
560*795d594fSAndroid Build Coastguard Worker   void CAddiw(XRegister rd, int32_t imm);
561*795d594fSAndroid Build Coastguard Worker   void CAddi16Sp(int32_t nzimm);
562*795d594fSAndroid Build Coastguard Worker   void CAddi4Spn(XRegister rd_s, uint32_t nzuimm);
563*795d594fSAndroid Build Coastguard Worker   void CSlli(XRegister rd, int32_t shamt);
564*795d594fSAndroid Build Coastguard Worker   void CSrli(XRegister rd_s, int32_t shamt);
565*795d594fSAndroid Build Coastguard Worker   void CSrai(XRegister rd_s, int32_t shamt);
566*795d594fSAndroid Build Coastguard Worker   void CAndi(XRegister rd_s, int32_t imm);
567*795d594fSAndroid Build Coastguard Worker   void CMv(XRegister rd, XRegister rs2);
568*795d594fSAndroid Build Coastguard Worker   void CAdd(XRegister rd, XRegister rs2);
569*795d594fSAndroid Build Coastguard Worker   void CAnd(XRegister rd_s, XRegister rs2_s);
570*795d594fSAndroid Build Coastguard Worker   void COr(XRegister rd_s, XRegister rs2_s);
571*795d594fSAndroid Build Coastguard Worker   void CXor(XRegister rd_s, XRegister rs2_s);
572*795d594fSAndroid Build Coastguard Worker   void CSub(XRegister rd_s, XRegister rs2_s);
573*795d594fSAndroid Build Coastguard Worker   void CAddw(XRegister rd_s, XRegister rs2_s);
574*795d594fSAndroid Build Coastguard Worker   void CSubw(XRegister rd_s, XRegister rs2_s);
575*795d594fSAndroid Build Coastguard Worker 
576*795d594fSAndroid Build Coastguard Worker   // "Zcb" Standard Extension, part of "C", opcode = 0b00, 0b01, funct3 = 0b100.
577*795d594fSAndroid Build Coastguard Worker   void CLbu(XRegister rd_s, XRegister rs1_s, int32_t offset);
578*795d594fSAndroid Build Coastguard Worker   void CLhu(XRegister rd_s, XRegister rs1_s, int32_t offset);
579*795d594fSAndroid Build Coastguard Worker   void CLh(XRegister rd_s, XRegister rs1_s, int32_t offset);
580*795d594fSAndroid Build Coastguard Worker   void CSb(XRegister rd_s, XRegister rs1_s, int32_t offset);
581*795d594fSAndroid Build Coastguard Worker   void CSh(XRegister rd_s, XRegister rs1_s, int32_t offset);
582*795d594fSAndroid Build Coastguard Worker   void CZextB(XRegister rd_rs1_s);
583*795d594fSAndroid Build Coastguard Worker   void CSextB(XRegister rd_rs1_s);
584*795d594fSAndroid Build Coastguard Worker   void CZextH(XRegister rd_rs1_s);
585*795d594fSAndroid Build Coastguard Worker   void CSextH(XRegister rd_rs1_s);
586*795d594fSAndroid Build Coastguard Worker   void CZextW(XRegister rd_rs1_s);
587*795d594fSAndroid Build Coastguard Worker   void CNot(XRegister rd_rs1_s);
588*795d594fSAndroid Build Coastguard Worker   void CMul(XRegister rd_s, XRegister rs2_s);
589*795d594fSAndroid Build Coastguard Worker   // "Zcb" Standard Extension End; resume "C" Standard Extension.
590*795d594fSAndroid Build Coastguard Worker   // TODO(riscv64): Reorder "Zcb" after remaining "C" instructions.
591*795d594fSAndroid Build Coastguard Worker 
592*795d594fSAndroid Build Coastguard Worker   void CJ(int32_t offset);
593*795d594fSAndroid Build Coastguard Worker   void CJr(XRegister rs1);
594*795d594fSAndroid Build Coastguard Worker   void CJalr(XRegister rs1);
595*795d594fSAndroid Build Coastguard Worker   void CBeqz(XRegister rs1_s, int32_t offset);
596*795d594fSAndroid Build Coastguard Worker   void CBnez(XRegister rs1_s, int32_t offset);
597*795d594fSAndroid Build Coastguard Worker 
598*795d594fSAndroid Build Coastguard Worker   void CEbreak();
599*795d594fSAndroid Build Coastguard Worker   void CNop();
600*795d594fSAndroid Build Coastguard Worker   void CUnimp();
601*795d594fSAndroid Build Coastguard Worker 
602*795d594fSAndroid Build Coastguard Worker   // "Zba" Standard Extension, opcode = 0x1b, 0x33 or 0x3b, funct3 and funct7 varies.
603*795d594fSAndroid Build Coastguard Worker   void AddUw(XRegister rd, XRegister rs1, XRegister rs2);
604*795d594fSAndroid Build Coastguard Worker   void Sh1Add(XRegister rd, XRegister rs1, XRegister rs2);
605*795d594fSAndroid Build Coastguard Worker   void Sh1AddUw(XRegister rd, XRegister rs1, XRegister rs2);
606*795d594fSAndroid Build Coastguard Worker   void Sh2Add(XRegister rd, XRegister rs1, XRegister rs2);
607*795d594fSAndroid Build Coastguard Worker   void Sh2AddUw(XRegister rd, XRegister rs1, XRegister rs2);
608*795d594fSAndroid Build Coastguard Worker   void Sh3Add(XRegister rd, XRegister rs1, XRegister rs2);
609*795d594fSAndroid Build Coastguard Worker   void Sh3AddUw(XRegister rd, XRegister rs1, XRegister rs2);
610*795d594fSAndroid Build Coastguard Worker   void SlliUw(XRegister rd, XRegister rs1, int32_t shamt);
611*795d594fSAndroid Build Coastguard Worker 
612*795d594fSAndroid Build Coastguard Worker   // "Zbb" Standard Extension, opcode = 0x13, 0x1b, 0x33 or 0x3b, funct3 and funct7 varies.
613*795d594fSAndroid Build Coastguard Worker   // Note: 32-bit sext.b, sext.h and zext.h from the Zbb extension are explicitly
614*795d594fSAndroid Build Coastguard Worker   // prefixed with "Zbb" to differentiate them from the utility macros.
615*795d594fSAndroid Build Coastguard Worker   void Andn(XRegister rd, XRegister rs1, XRegister rs2);
616*795d594fSAndroid Build Coastguard Worker   void Orn(XRegister rd, XRegister rs1, XRegister rs2);
617*795d594fSAndroid Build Coastguard Worker   void Xnor(XRegister rd, XRegister rs1, XRegister rs2);
618*795d594fSAndroid Build Coastguard Worker   void Clz(XRegister rd, XRegister rs1);
619*795d594fSAndroid Build Coastguard Worker   void Clzw(XRegister rd, XRegister rs1);
620*795d594fSAndroid Build Coastguard Worker   void Ctz(XRegister rd, XRegister rs1);
621*795d594fSAndroid Build Coastguard Worker   void Ctzw(XRegister rd, XRegister rs1);
622*795d594fSAndroid Build Coastguard Worker   void Cpop(XRegister rd, XRegister rs1);
623*795d594fSAndroid Build Coastguard Worker   void Cpopw(XRegister rd, XRegister rs1);
624*795d594fSAndroid Build Coastguard Worker   void Min(XRegister rd, XRegister rs1, XRegister rs2);
625*795d594fSAndroid Build Coastguard Worker   void Minu(XRegister rd, XRegister rs1, XRegister rs2);
626*795d594fSAndroid Build Coastguard Worker   void Max(XRegister rd, XRegister rs1, XRegister rs2);
627*795d594fSAndroid Build Coastguard Worker   void Maxu(XRegister rd, XRegister rs1, XRegister rs2);
628*795d594fSAndroid Build Coastguard Worker   void Rol(XRegister rd, XRegister rs1, XRegister rs2);
629*795d594fSAndroid Build Coastguard Worker   void Rolw(XRegister rd, XRegister rs1, XRegister rs2);
630*795d594fSAndroid Build Coastguard Worker   void Ror(XRegister rd, XRegister rs1, XRegister rs2);
631*795d594fSAndroid Build Coastguard Worker   void Rorw(XRegister rd, XRegister rs1, XRegister rs2);
632*795d594fSAndroid Build Coastguard Worker   void Rori(XRegister rd, XRegister rs1, int32_t shamt);
633*795d594fSAndroid Build Coastguard Worker   void Roriw(XRegister rd, XRegister rs1, int32_t shamt);
634*795d594fSAndroid Build Coastguard Worker   void OrcB(XRegister rd, XRegister rs1);
635*795d594fSAndroid Build Coastguard Worker   void Rev8(XRegister rd, XRegister rs1);
636*795d594fSAndroid Build Coastguard Worker   void ZbbSextB(XRegister rd, XRegister rs1);
637*795d594fSAndroid Build Coastguard Worker   void ZbbSextH(XRegister rd, XRegister rs1);
638*795d594fSAndroid Build Coastguard Worker   void ZbbZextH(XRegister rd, XRegister rs1);
639*795d594fSAndroid Build Coastguard Worker 
640*795d594fSAndroid Build Coastguard Worker   // "Zbs" Standard Extension, opcode = 0x13, or 0x33, funct3 and funct7 varies.
641*795d594fSAndroid Build Coastguard Worker   void Bclr(XRegister rd, XRegister rs1, XRegister rs2);
642*795d594fSAndroid Build Coastguard Worker   void Bclri(XRegister rd, XRegister rs1, int32_t shamt);
643*795d594fSAndroid Build Coastguard Worker   void Bext(XRegister rd, XRegister rs1, XRegister rs2);
644*795d594fSAndroid Build Coastguard Worker   void Bexti(XRegister rd, XRegister rs1, int32_t shamt);
645*795d594fSAndroid Build Coastguard Worker   void Binv(XRegister rd, XRegister rs1, XRegister rs2);
646*795d594fSAndroid Build Coastguard Worker   void Binvi(XRegister rd, XRegister rs1, int32_t shamt);
647*795d594fSAndroid Build Coastguard Worker   void Bset(XRegister rd, XRegister rs1, XRegister rs2);
648*795d594fSAndroid Build Coastguard Worker   void Bseti(XRegister rd, XRegister rs1, int32_t shamt);
649*795d594fSAndroid Build Coastguard Worker 
650*795d594fSAndroid Build Coastguard Worker   ////////////////////////////// RISC-V Vector Instructions  START ///////////////////////////////
651*795d594fSAndroid Build Coastguard Worker   enum class LengthMultiplier : uint32_t {
652*795d594fSAndroid Build Coastguard Worker     kM1Over8 = 0b101,
653*795d594fSAndroid Build Coastguard Worker     kM1Over4 = 0b110,
654*795d594fSAndroid Build Coastguard Worker     kM1Over2 = 0b111,
655*795d594fSAndroid Build Coastguard Worker     kM1 = 0b000,
656*795d594fSAndroid Build Coastguard Worker     kM2 = 0b001,
657*795d594fSAndroid Build Coastguard Worker     kM4 = 0b010,
658*795d594fSAndroid Build Coastguard Worker     kM8 = 0b011,
659*795d594fSAndroid Build Coastguard Worker 
660*795d594fSAndroid Build Coastguard Worker     kReserved1 = 0b100,
661*795d594fSAndroid Build Coastguard Worker   };
662*795d594fSAndroid Build Coastguard Worker 
663*795d594fSAndroid Build Coastguard Worker   enum class SelectedElementWidth : uint32_t {
664*795d594fSAndroid Build Coastguard Worker     kE8 = 0b000,
665*795d594fSAndroid Build Coastguard Worker     kE16 = 0b001,
666*795d594fSAndroid Build Coastguard Worker     kE32 = 0b010,
667*795d594fSAndroid Build Coastguard Worker     kE64 = 0b011,
668*795d594fSAndroid Build Coastguard Worker 
669*795d594fSAndroid Build Coastguard Worker     kReserved1 = 0b100,
670*795d594fSAndroid Build Coastguard Worker     kReserved2 = 0b101,
671*795d594fSAndroid Build Coastguard Worker     kReserved3 = 0b110,
672*795d594fSAndroid Build Coastguard Worker     kReserved4 = 0b111,
673*795d594fSAndroid Build Coastguard Worker   };
674*795d594fSAndroid Build Coastguard Worker 
675*795d594fSAndroid Build Coastguard Worker   enum class VectorMaskAgnostic : uint32_t {
676*795d594fSAndroid Build Coastguard Worker     kUndisturbed = 0,
677*795d594fSAndroid Build Coastguard Worker     kAgnostic = 1,
678*795d594fSAndroid Build Coastguard Worker   };
679*795d594fSAndroid Build Coastguard Worker 
680*795d594fSAndroid Build Coastguard Worker   enum class VectorTailAgnostic : uint32_t {
681*795d594fSAndroid Build Coastguard Worker     kUndisturbed = 0,
682*795d594fSAndroid Build Coastguard Worker     kAgnostic = 1,
683*795d594fSAndroid Build Coastguard Worker   };
684*795d594fSAndroid Build Coastguard Worker 
685*795d594fSAndroid Build Coastguard Worker   enum class VM : uint32_t {  // Vector mask
686*795d594fSAndroid Build Coastguard Worker     kV0_t = 0b0,
687*795d594fSAndroid Build Coastguard Worker     kUnmasked = 0b1
688*795d594fSAndroid Build Coastguard Worker   };
689*795d594fSAndroid Build Coastguard Worker 
690*795d594fSAndroid Build Coastguard Worker   // Vector Conguration-Setting Instructions, opcode = 0x57, funct3 = 0x3
691*795d594fSAndroid Build Coastguard Worker   void VSetvli(XRegister rd, XRegister rs1, uint32_t vtypei);
692*795d594fSAndroid Build Coastguard Worker   void VSetivli(XRegister rd, uint32_t uimm, uint32_t vtypei);
693*795d594fSAndroid Build Coastguard Worker   void VSetvl(XRegister rd, XRegister rs1, XRegister rs2);
694*795d594fSAndroid Build Coastguard Worker 
VTypeiValue(VectorMaskAgnostic vma,VectorTailAgnostic vta,SelectedElementWidth sew,LengthMultiplier lmul)695*795d594fSAndroid Build Coastguard Worker   static uint32_t VTypeiValue(VectorMaskAgnostic vma,
696*795d594fSAndroid Build Coastguard Worker                               VectorTailAgnostic vta,
697*795d594fSAndroid Build Coastguard Worker                               SelectedElementWidth sew,
698*795d594fSAndroid Build Coastguard Worker                               LengthMultiplier lmul) {
699*795d594fSAndroid Build Coastguard Worker     return static_cast<uint32_t>(vma) << 7 | static_cast<uint32_t>(vta) << 6 |
700*795d594fSAndroid Build Coastguard Worker            static_cast<uint32_t>(sew) << 3 | static_cast<uint32_t>(lmul);
701*795d594fSAndroid Build Coastguard Worker   }
702*795d594fSAndroid Build Coastguard Worker 
703*795d594fSAndroid Build Coastguard Worker   // Vector Unit-Stride Load/Store Instructions
704*795d594fSAndroid Build Coastguard Worker   void VLe8(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
705*795d594fSAndroid Build Coastguard Worker   void VLe16(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
706*795d594fSAndroid Build Coastguard Worker   void VLe32(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
707*795d594fSAndroid Build Coastguard Worker   void VLe64(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
708*795d594fSAndroid Build Coastguard Worker   void VLm(VRegister vd, XRegister rs1);
709*795d594fSAndroid Build Coastguard Worker 
710*795d594fSAndroid Build Coastguard Worker   void VSe8(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
711*795d594fSAndroid Build Coastguard Worker   void VSe16(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
712*795d594fSAndroid Build Coastguard Worker   void VSe32(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
713*795d594fSAndroid Build Coastguard Worker   void VSe64(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
714*795d594fSAndroid Build Coastguard Worker   void VSm(VRegister vs3, XRegister rs1);
715*795d594fSAndroid Build Coastguard Worker 
716*795d594fSAndroid Build Coastguard Worker   // Vector unit-stride fault-only-first Instructions
717*795d594fSAndroid Build Coastguard Worker   void VLe8ff(VRegister vd, XRegister rs1);
718*795d594fSAndroid Build Coastguard Worker   void VLe16ff(VRegister vd, XRegister rs1);
719*795d594fSAndroid Build Coastguard Worker   void VLe32ff(VRegister vd, XRegister rs1);
720*795d594fSAndroid Build Coastguard Worker   void VLe64ff(VRegister vd, XRegister rs1);
721*795d594fSAndroid Build Coastguard Worker 
722*795d594fSAndroid Build Coastguard Worker   // Vector Strided Load/Store Instructions
723*795d594fSAndroid Build Coastguard Worker   void VLse8(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
724*795d594fSAndroid Build Coastguard Worker   void VLse16(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
725*795d594fSAndroid Build Coastguard Worker   void VLse32(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
726*795d594fSAndroid Build Coastguard Worker   void VLse64(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
727*795d594fSAndroid Build Coastguard Worker 
728*795d594fSAndroid Build Coastguard Worker   void VSse8(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
729*795d594fSAndroid Build Coastguard Worker   void VSse16(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
730*795d594fSAndroid Build Coastguard Worker   void VSse32(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
731*795d594fSAndroid Build Coastguard Worker   void VSse64(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
732*795d594fSAndroid Build Coastguard Worker 
733*795d594fSAndroid Build Coastguard Worker   // Vector Indexed Load/Store Instructions
734*795d594fSAndroid Build Coastguard Worker   void VLoxei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
735*795d594fSAndroid Build Coastguard Worker   void VLoxei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
736*795d594fSAndroid Build Coastguard Worker   void VLoxei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
737*795d594fSAndroid Build Coastguard Worker   void VLoxei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
738*795d594fSAndroid Build Coastguard Worker 
739*795d594fSAndroid Build Coastguard Worker   void VLuxei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
740*795d594fSAndroid Build Coastguard Worker   void VLuxei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
741*795d594fSAndroid Build Coastguard Worker   void VLuxei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
742*795d594fSAndroid Build Coastguard Worker   void VLuxei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
743*795d594fSAndroid Build Coastguard Worker 
744*795d594fSAndroid Build Coastguard Worker   void VSoxei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
745*795d594fSAndroid Build Coastguard Worker   void VSoxei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
746*795d594fSAndroid Build Coastguard Worker   void VSoxei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
747*795d594fSAndroid Build Coastguard Worker   void VSoxei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
748*795d594fSAndroid Build Coastguard Worker 
749*795d594fSAndroid Build Coastguard Worker   void VSuxei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
750*795d594fSAndroid Build Coastguard Worker   void VSuxei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
751*795d594fSAndroid Build Coastguard Worker   void VSuxei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
752*795d594fSAndroid Build Coastguard Worker   void VSuxei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
753*795d594fSAndroid Build Coastguard Worker 
754*795d594fSAndroid Build Coastguard Worker   // Vector Segment Load/Store
755*795d594fSAndroid Build Coastguard Worker 
756*795d594fSAndroid Build Coastguard Worker   // Vector Unit-Stride Segment Loads/Stores
757*795d594fSAndroid Build Coastguard Worker 
758*795d594fSAndroid Build Coastguard Worker   void VLseg2e8(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
759*795d594fSAndroid Build Coastguard Worker   void VLseg2e16(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
760*795d594fSAndroid Build Coastguard Worker   void VLseg2e32(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
761*795d594fSAndroid Build Coastguard Worker   void VLseg2e64(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
762*795d594fSAndroid Build Coastguard Worker   void VLseg3e8(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
763*795d594fSAndroid Build Coastguard Worker   void VLseg3e16(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
764*795d594fSAndroid Build Coastguard Worker   void VLseg3e32(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
765*795d594fSAndroid Build Coastguard Worker   void VLseg3e64(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
766*795d594fSAndroid Build Coastguard Worker   void VLseg4e8(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
767*795d594fSAndroid Build Coastguard Worker   void VLseg4e16(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
768*795d594fSAndroid Build Coastguard Worker   void VLseg4e32(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
769*795d594fSAndroid Build Coastguard Worker   void VLseg4e64(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
770*795d594fSAndroid Build Coastguard Worker   void VLseg5e8(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
771*795d594fSAndroid Build Coastguard Worker   void VLseg5e16(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
772*795d594fSAndroid Build Coastguard Worker   void VLseg5e32(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
773*795d594fSAndroid Build Coastguard Worker   void VLseg5e64(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
774*795d594fSAndroid Build Coastguard Worker   void VLseg6e8(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
775*795d594fSAndroid Build Coastguard Worker   void VLseg6e16(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
776*795d594fSAndroid Build Coastguard Worker   void VLseg6e32(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
777*795d594fSAndroid Build Coastguard Worker   void VLseg6e64(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
778*795d594fSAndroid Build Coastguard Worker   void VLseg7e8(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
779*795d594fSAndroid Build Coastguard Worker   void VLseg7e16(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
780*795d594fSAndroid Build Coastguard Worker   void VLseg7e32(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
781*795d594fSAndroid Build Coastguard Worker   void VLseg7e64(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
782*795d594fSAndroid Build Coastguard Worker   void VLseg8e8(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
783*795d594fSAndroid Build Coastguard Worker   void VLseg8e16(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
784*795d594fSAndroid Build Coastguard Worker   void VLseg8e32(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
785*795d594fSAndroid Build Coastguard Worker   void VLseg8e64(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
786*795d594fSAndroid Build Coastguard Worker 
787*795d594fSAndroid Build Coastguard Worker   void VSseg2e8(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
788*795d594fSAndroid Build Coastguard Worker   void VSseg2e16(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
789*795d594fSAndroid Build Coastguard Worker   void VSseg2e32(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
790*795d594fSAndroid Build Coastguard Worker   void VSseg2e64(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
791*795d594fSAndroid Build Coastguard Worker   void VSseg3e8(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
792*795d594fSAndroid Build Coastguard Worker   void VSseg3e16(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
793*795d594fSAndroid Build Coastguard Worker   void VSseg3e32(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
794*795d594fSAndroid Build Coastguard Worker   void VSseg3e64(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
795*795d594fSAndroid Build Coastguard Worker   void VSseg4e8(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
796*795d594fSAndroid Build Coastguard Worker   void VSseg4e16(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
797*795d594fSAndroid Build Coastguard Worker   void VSseg4e32(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
798*795d594fSAndroid Build Coastguard Worker   void VSseg4e64(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
799*795d594fSAndroid Build Coastguard Worker   void VSseg5e8(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
800*795d594fSAndroid Build Coastguard Worker   void VSseg5e16(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
801*795d594fSAndroid Build Coastguard Worker   void VSseg5e32(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
802*795d594fSAndroid Build Coastguard Worker   void VSseg5e64(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
803*795d594fSAndroid Build Coastguard Worker   void VSseg6e8(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
804*795d594fSAndroid Build Coastguard Worker   void VSseg6e16(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
805*795d594fSAndroid Build Coastguard Worker   void VSseg6e32(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
806*795d594fSAndroid Build Coastguard Worker   void VSseg6e64(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
807*795d594fSAndroid Build Coastguard Worker   void VSseg7e8(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
808*795d594fSAndroid Build Coastguard Worker   void VSseg7e16(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
809*795d594fSAndroid Build Coastguard Worker   void VSseg7e32(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
810*795d594fSAndroid Build Coastguard Worker   void VSseg7e64(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
811*795d594fSAndroid Build Coastguard Worker   void VSseg8e8(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
812*795d594fSAndroid Build Coastguard Worker   void VSseg8e16(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
813*795d594fSAndroid Build Coastguard Worker   void VSseg8e32(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
814*795d594fSAndroid Build Coastguard Worker   void VSseg8e64(VRegister vs3, XRegister rs1, VM vm = VM::kUnmasked);
815*795d594fSAndroid Build Coastguard Worker 
816*795d594fSAndroid Build Coastguard Worker   // Vector Unit-Stride Fault-only-First Segment Loads
817*795d594fSAndroid Build Coastguard Worker 
818*795d594fSAndroid Build Coastguard Worker   void VLseg2e8ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
819*795d594fSAndroid Build Coastguard Worker   void VLseg2e16ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
820*795d594fSAndroid Build Coastguard Worker   void VLseg2e32ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
821*795d594fSAndroid Build Coastguard Worker   void VLseg2e64ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
822*795d594fSAndroid Build Coastguard Worker   void VLseg3e8ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
823*795d594fSAndroid Build Coastguard Worker   void VLseg3e16ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
824*795d594fSAndroid Build Coastguard Worker   void VLseg3e32ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
825*795d594fSAndroid Build Coastguard Worker   void VLseg3e64ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
826*795d594fSAndroid Build Coastguard Worker   void VLseg4e8ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
827*795d594fSAndroid Build Coastguard Worker   void VLseg4e16ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
828*795d594fSAndroid Build Coastguard Worker   void VLseg4e32ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
829*795d594fSAndroid Build Coastguard Worker   void VLseg4e64ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
830*795d594fSAndroid Build Coastguard Worker   void VLseg5e8ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
831*795d594fSAndroid Build Coastguard Worker   void VLseg5e16ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
832*795d594fSAndroid Build Coastguard Worker   void VLseg5e32ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
833*795d594fSAndroid Build Coastguard Worker   void VLseg5e64ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
834*795d594fSAndroid Build Coastguard Worker   void VLseg6e8ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
835*795d594fSAndroid Build Coastguard Worker   void VLseg6e16ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
836*795d594fSAndroid Build Coastguard Worker   void VLseg6e32ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
837*795d594fSAndroid Build Coastguard Worker   void VLseg6e64ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
838*795d594fSAndroid Build Coastguard Worker   void VLseg7e8ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
839*795d594fSAndroid Build Coastguard Worker   void VLseg7e16ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
840*795d594fSAndroid Build Coastguard Worker   void VLseg7e32ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
841*795d594fSAndroid Build Coastguard Worker   void VLseg7e64ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
842*795d594fSAndroid Build Coastguard Worker   void VLseg8e8ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
843*795d594fSAndroid Build Coastguard Worker   void VLseg8e16ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
844*795d594fSAndroid Build Coastguard Worker   void VLseg8e32ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
845*795d594fSAndroid Build Coastguard Worker   void VLseg8e64ff(VRegister vd, XRegister rs1, VM vm = VM::kUnmasked);
846*795d594fSAndroid Build Coastguard Worker 
847*795d594fSAndroid Build Coastguard Worker   // Vector Strided Segment Loads/Stores
848*795d594fSAndroid Build Coastguard Worker 
849*795d594fSAndroid Build Coastguard Worker   void VLsseg2e8(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
850*795d594fSAndroid Build Coastguard Worker   void VLsseg2e16(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
851*795d594fSAndroid Build Coastguard Worker   void VLsseg2e32(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
852*795d594fSAndroid Build Coastguard Worker   void VLsseg2e64(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
853*795d594fSAndroid Build Coastguard Worker   void VLsseg3e8(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
854*795d594fSAndroid Build Coastguard Worker   void VLsseg3e16(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
855*795d594fSAndroid Build Coastguard Worker   void VLsseg3e32(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
856*795d594fSAndroid Build Coastguard Worker   void VLsseg3e64(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
857*795d594fSAndroid Build Coastguard Worker   void VLsseg4e8(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
858*795d594fSAndroid Build Coastguard Worker   void VLsseg4e16(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
859*795d594fSAndroid Build Coastguard Worker   void VLsseg4e32(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
860*795d594fSAndroid Build Coastguard Worker   void VLsseg4e64(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
861*795d594fSAndroid Build Coastguard Worker   void VLsseg5e8(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
862*795d594fSAndroid Build Coastguard Worker   void VLsseg5e16(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
863*795d594fSAndroid Build Coastguard Worker   void VLsseg5e32(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
864*795d594fSAndroid Build Coastguard Worker   void VLsseg5e64(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
865*795d594fSAndroid Build Coastguard Worker   void VLsseg6e8(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
866*795d594fSAndroid Build Coastguard Worker   void VLsseg6e16(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
867*795d594fSAndroid Build Coastguard Worker   void VLsseg6e32(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
868*795d594fSAndroid Build Coastguard Worker   void VLsseg6e64(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
869*795d594fSAndroid Build Coastguard Worker   void VLsseg7e8(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
870*795d594fSAndroid Build Coastguard Worker   void VLsseg7e16(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
871*795d594fSAndroid Build Coastguard Worker   void VLsseg7e32(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
872*795d594fSAndroid Build Coastguard Worker   void VLsseg7e64(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
873*795d594fSAndroid Build Coastguard Worker   void VLsseg8e8(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
874*795d594fSAndroid Build Coastguard Worker   void VLsseg8e16(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
875*795d594fSAndroid Build Coastguard Worker   void VLsseg8e32(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
876*795d594fSAndroid Build Coastguard Worker   void VLsseg8e64(VRegister vd, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
877*795d594fSAndroid Build Coastguard Worker 
878*795d594fSAndroid Build Coastguard Worker   void VSsseg2e8(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
879*795d594fSAndroid Build Coastguard Worker   void VSsseg2e16(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
880*795d594fSAndroid Build Coastguard Worker   void VSsseg2e32(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
881*795d594fSAndroid Build Coastguard Worker   void VSsseg2e64(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
882*795d594fSAndroid Build Coastguard Worker   void VSsseg3e8(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
883*795d594fSAndroid Build Coastguard Worker   void VSsseg3e16(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
884*795d594fSAndroid Build Coastguard Worker   void VSsseg3e32(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
885*795d594fSAndroid Build Coastguard Worker   void VSsseg3e64(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
886*795d594fSAndroid Build Coastguard Worker   void VSsseg4e8(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
887*795d594fSAndroid Build Coastguard Worker   void VSsseg4e16(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
888*795d594fSAndroid Build Coastguard Worker   void VSsseg4e32(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
889*795d594fSAndroid Build Coastguard Worker   void VSsseg4e64(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
890*795d594fSAndroid Build Coastguard Worker   void VSsseg5e8(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
891*795d594fSAndroid Build Coastguard Worker   void VSsseg5e16(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
892*795d594fSAndroid Build Coastguard Worker   void VSsseg5e32(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
893*795d594fSAndroid Build Coastguard Worker   void VSsseg5e64(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
894*795d594fSAndroid Build Coastguard Worker   void VSsseg6e8(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
895*795d594fSAndroid Build Coastguard Worker   void VSsseg6e16(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
896*795d594fSAndroid Build Coastguard Worker   void VSsseg6e32(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
897*795d594fSAndroid Build Coastguard Worker   void VSsseg6e64(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
898*795d594fSAndroid Build Coastguard Worker   void VSsseg7e8(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
899*795d594fSAndroid Build Coastguard Worker   void VSsseg7e16(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
900*795d594fSAndroid Build Coastguard Worker   void VSsseg7e32(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
901*795d594fSAndroid Build Coastguard Worker   void VSsseg7e64(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
902*795d594fSAndroid Build Coastguard Worker   void VSsseg8e8(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
903*795d594fSAndroid Build Coastguard Worker   void VSsseg8e16(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
904*795d594fSAndroid Build Coastguard Worker   void VSsseg8e32(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
905*795d594fSAndroid Build Coastguard Worker   void VSsseg8e64(VRegister vs3, XRegister rs1, XRegister rs2, VM vm = VM::kUnmasked);
906*795d594fSAndroid Build Coastguard Worker 
907*795d594fSAndroid Build Coastguard Worker   // Vector Indexed-unordered Segment Loads/Stores
908*795d594fSAndroid Build Coastguard Worker 
909*795d594fSAndroid Build Coastguard Worker   void VLuxseg2ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
910*795d594fSAndroid Build Coastguard Worker   void VLuxseg2ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
911*795d594fSAndroid Build Coastguard Worker   void VLuxseg2ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
912*795d594fSAndroid Build Coastguard Worker   void VLuxseg2ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
913*795d594fSAndroid Build Coastguard Worker   void VLuxseg3ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
914*795d594fSAndroid Build Coastguard Worker   void VLuxseg3ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
915*795d594fSAndroid Build Coastguard Worker   void VLuxseg3ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
916*795d594fSAndroid Build Coastguard Worker   void VLuxseg3ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
917*795d594fSAndroid Build Coastguard Worker   void VLuxseg4ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
918*795d594fSAndroid Build Coastguard Worker   void VLuxseg4ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
919*795d594fSAndroid Build Coastguard Worker   void VLuxseg4ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
920*795d594fSAndroid Build Coastguard Worker   void VLuxseg4ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
921*795d594fSAndroid Build Coastguard Worker   void VLuxseg5ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
922*795d594fSAndroid Build Coastguard Worker   void VLuxseg5ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
923*795d594fSAndroid Build Coastguard Worker   void VLuxseg5ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
924*795d594fSAndroid Build Coastguard Worker   void VLuxseg5ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
925*795d594fSAndroid Build Coastguard Worker   void VLuxseg6ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
926*795d594fSAndroid Build Coastguard Worker   void VLuxseg6ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
927*795d594fSAndroid Build Coastguard Worker   void VLuxseg6ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
928*795d594fSAndroid Build Coastguard Worker   void VLuxseg6ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
929*795d594fSAndroid Build Coastguard Worker   void VLuxseg7ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
930*795d594fSAndroid Build Coastguard Worker   void VLuxseg7ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
931*795d594fSAndroid Build Coastguard Worker   void VLuxseg7ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
932*795d594fSAndroid Build Coastguard Worker   void VLuxseg7ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
933*795d594fSAndroid Build Coastguard Worker   void VLuxseg8ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
934*795d594fSAndroid Build Coastguard Worker   void VLuxseg8ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
935*795d594fSAndroid Build Coastguard Worker   void VLuxseg8ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
936*795d594fSAndroid Build Coastguard Worker   void VLuxseg8ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
937*795d594fSAndroid Build Coastguard Worker 
938*795d594fSAndroid Build Coastguard Worker   void VSuxseg2ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
939*795d594fSAndroid Build Coastguard Worker   void VSuxseg2ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
940*795d594fSAndroid Build Coastguard Worker   void VSuxseg2ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
941*795d594fSAndroid Build Coastguard Worker   void VSuxseg2ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
942*795d594fSAndroid Build Coastguard Worker   void VSuxseg3ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
943*795d594fSAndroid Build Coastguard Worker   void VSuxseg3ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
944*795d594fSAndroid Build Coastguard Worker   void VSuxseg3ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
945*795d594fSAndroid Build Coastguard Worker   void VSuxseg3ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
946*795d594fSAndroid Build Coastguard Worker   void VSuxseg4ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
947*795d594fSAndroid Build Coastguard Worker   void VSuxseg4ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
948*795d594fSAndroid Build Coastguard Worker   void VSuxseg4ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
949*795d594fSAndroid Build Coastguard Worker   void VSuxseg4ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
950*795d594fSAndroid Build Coastguard Worker   void VSuxseg5ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
951*795d594fSAndroid Build Coastguard Worker   void VSuxseg5ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
952*795d594fSAndroid Build Coastguard Worker   void VSuxseg5ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
953*795d594fSAndroid Build Coastguard Worker   void VSuxseg5ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
954*795d594fSAndroid Build Coastguard Worker   void VSuxseg6ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
955*795d594fSAndroid Build Coastguard Worker   void VSuxseg6ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
956*795d594fSAndroid Build Coastguard Worker   void VSuxseg6ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
957*795d594fSAndroid Build Coastguard Worker   void VSuxseg6ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
958*795d594fSAndroid Build Coastguard Worker   void VSuxseg7ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
959*795d594fSAndroid Build Coastguard Worker   void VSuxseg7ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
960*795d594fSAndroid Build Coastguard Worker   void VSuxseg7ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
961*795d594fSAndroid Build Coastguard Worker   void VSuxseg7ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
962*795d594fSAndroid Build Coastguard Worker   void VSuxseg8ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
963*795d594fSAndroid Build Coastguard Worker   void VSuxseg8ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
964*795d594fSAndroid Build Coastguard Worker   void VSuxseg8ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
965*795d594fSAndroid Build Coastguard Worker   void VSuxseg8ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
966*795d594fSAndroid Build Coastguard Worker 
967*795d594fSAndroid Build Coastguard Worker   // Vector Indexed-ordered Segment Loads/Stores
968*795d594fSAndroid Build Coastguard Worker 
969*795d594fSAndroid Build Coastguard Worker   void VLoxseg2ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
970*795d594fSAndroid Build Coastguard Worker   void VLoxseg2ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
971*795d594fSAndroid Build Coastguard Worker   void VLoxseg2ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
972*795d594fSAndroid Build Coastguard Worker   void VLoxseg2ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
973*795d594fSAndroid Build Coastguard Worker   void VLoxseg3ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
974*795d594fSAndroid Build Coastguard Worker   void VLoxseg3ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
975*795d594fSAndroid Build Coastguard Worker   void VLoxseg3ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
976*795d594fSAndroid Build Coastguard Worker   void VLoxseg3ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
977*795d594fSAndroid Build Coastguard Worker   void VLoxseg4ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
978*795d594fSAndroid Build Coastguard Worker   void VLoxseg4ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
979*795d594fSAndroid Build Coastguard Worker   void VLoxseg4ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
980*795d594fSAndroid Build Coastguard Worker   void VLoxseg4ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
981*795d594fSAndroid Build Coastguard Worker   void VLoxseg5ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
982*795d594fSAndroid Build Coastguard Worker   void VLoxseg5ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
983*795d594fSAndroid Build Coastguard Worker   void VLoxseg5ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
984*795d594fSAndroid Build Coastguard Worker   void VLoxseg5ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
985*795d594fSAndroid Build Coastguard Worker   void VLoxseg6ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
986*795d594fSAndroid Build Coastguard Worker   void VLoxseg6ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
987*795d594fSAndroid Build Coastguard Worker   void VLoxseg6ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
988*795d594fSAndroid Build Coastguard Worker   void VLoxseg6ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
989*795d594fSAndroid Build Coastguard Worker   void VLoxseg7ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
990*795d594fSAndroid Build Coastguard Worker   void VLoxseg7ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
991*795d594fSAndroid Build Coastguard Worker   void VLoxseg7ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
992*795d594fSAndroid Build Coastguard Worker   void VLoxseg7ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
993*795d594fSAndroid Build Coastguard Worker   void VLoxseg8ei8(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
994*795d594fSAndroid Build Coastguard Worker   void VLoxseg8ei16(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
995*795d594fSAndroid Build Coastguard Worker   void VLoxseg8ei32(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
996*795d594fSAndroid Build Coastguard Worker   void VLoxseg8ei64(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
997*795d594fSAndroid Build Coastguard Worker 
998*795d594fSAndroid Build Coastguard Worker   void VSoxseg2ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
999*795d594fSAndroid Build Coastguard Worker   void VSoxseg2ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1000*795d594fSAndroid Build Coastguard Worker   void VSoxseg2ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1001*795d594fSAndroid Build Coastguard Worker   void VSoxseg2ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1002*795d594fSAndroid Build Coastguard Worker   void VSoxseg3ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1003*795d594fSAndroid Build Coastguard Worker   void VSoxseg3ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1004*795d594fSAndroid Build Coastguard Worker   void VSoxseg3ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1005*795d594fSAndroid Build Coastguard Worker   void VSoxseg3ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1006*795d594fSAndroid Build Coastguard Worker   void VSoxseg4ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1007*795d594fSAndroid Build Coastguard Worker   void VSoxseg4ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1008*795d594fSAndroid Build Coastguard Worker   void VSoxseg4ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1009*795d594fSAndroid Build Coastguard Worker   void VSoxseg4ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1010*795d594fSAndroid Build Coastguard Worker   void VSoxseg5ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1011*795d594fSAndroid Build Coastguard Worker   void VSoxseg5ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1012*795d594fSAndroid Build Coastguard Worker   void VSoxseg5ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1013*795d594fSAndroid Build Coastguard Worker   void VSoxseg5ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1014*795d594fSAndroid Build Coastguard Worker   void VSoxseg6ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1015*795d594fSAndroid Build Coastguard Worker   void VSoxseg6ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1016*795d594fSAndroid Build Coastguard Worker   void VSoxseg6ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1017*795d594fSAndroid Build Coastguard Worker   void VSoxseg6ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1018*795d594fSAndroid Build Coastguard Worker   void VSoxseg7ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1019*795d594fSAndroid Build Coastguard Worker   void VSoxseg7ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1020*795d594fSAndroid Build Coastguard Worker   void VSoxseg7ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1021*795d594fSAndroid Build Coastguard Worker   void VSoxseg7ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1022*795d594fSAndroid Build Coastguard Worker   void VSoxseg8ei8(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1023*795d594fSAndroid Build Coastguard Worker   void VSoxseg8ei16(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1024*795d594fSAndroid Build Coastguard Worker   void VSoxseg8ei32(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1025*795d594fSAndroid Build Coastguard Worker   void VSoxseg8ei64(VRegister vs3, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1026*795d594fSAndroid Build Coastguard Worker 
1027*795d594fSAndroid Build Coastguard Worker   // Vector Whole Register Load/Store Instructions
1028*795d594fSAndroid Build Coastguard Worker 
1029*795d594fSAndroid Build Coastguard Worker   void VL1re8(VRegister vd, XRegister rs1);
1030*795d594fSAndroid Build Coastguard Worker   void VL1re16(VRegister vd, XRegister rs1);
1031*795d594fSAndroid Build Coastguard Worker   void VL1re32(VRegister vd, XRegister rs1);
1032*795d594fSAndroid Build Coastguard Worker   void VL1re64(VRegister vd, XRegister rs1);
1033*795d594fSAndroid Build Coastguard Worker 
1034*795d594fSAndroid Build Coastguard Worker   void VL2re8(VRegister vd, XRegister rs1);
1035*795d594fSAndroid Build Coastguard Worker   void VL2re16(VRegister vd, XRegister rs1);
1036*795d594fSAndroid Build Coastguard Worker   void VL2re32(VRegister vd, XRegister rs1);
1037*795d594fSAndroid Build Coastguard Worker   void VL2re64(VRegister vd, XRegister rs1);
1038*795d594fSAndroid Build Coastguard Worker 
1039*795d594fSAndroid Build Coastguard Worker   void VL4re8(VRegister vd, XRegister rs1);
1040*795d594fSAndroid Build Coastguard Worker   void VL4re16(VRegister vd, XRegister rs1);
1041*795d594fSAndroid Build Coastguard Worker   void VL4re32(VRegister vd, XRegister rs1);
1042*795d594fSAndroid Build Coastguard Worker   void VL4re64(VRegister vd, XRegister rs1);
1043*795d594fSAndroid Build Coastguard Worker 
1044*795d594fSAndroid Build Coastguard Worker   void VL8re8(VRegister vd, XRegister rs1);
1045*795d594fSAndroid Build Coastguard Worker   void VL8re16(VRegister vd, XRegister rs1);
1046*795d594fSAndroid Build Coastguard Worker   void VL8re32(VRegister vd, XRegister rs1);
1047*795d594fSAndroid Build Coastguard Worker   void VL8re64(VRegister vd, XRegister rs1);
1048*795d594fSAndroid Build Coastguard Worker 
1049*795d594fSAndroid Build Coastguard Worker   void VL1r(VRegister vd, XRegister rs1);  // Pseudoinstruction equal to VL1re8
1050*795d594fSAndroid Build Coastguard Worker   void VL2r(VRegister vd, XRegister rs1);  // Pseudoinstruction equal to VL2re8
1051*795d594fSAndroid Build Coastguard Worker   void VL4r(VRegister vd, XRegister rs1);  // Pseudoinstruction equal to VL4re8
1052*795d594fSAndroid Build Coastguard Worker   void VL8r(VRegister vd, XRegister rs1);  // Pseudoinstruction equal to VL8re8
1053*795d594fSAndroid Build Coastguard Worker 
1054*795d594fSAndroid Build Coastguard Worker   void VS1r(VRegister vs3, XRegister rs1);  // Store {vs3} to address in a1
1055*795d594fSAndroid Build Coastguard Worker   void VS2r(VRegister vs3, XRegister rs1);  // Store {vs3}-{vs3 + 1} to address in a1
1056*795d594fSAndroid Build Coastguard Worker   void VS4r(VRegister vs3, XRegister rs1);  // Store {vs3}-{vs3 + 3} to address in a1
1057*795d594fSAndroid Build Coastguard Worker   void VS8r(VRegister vs3, XRegister rs1);  // Store {vs3}-{vs3 + 7} to address in a1
1058*795d594fSAndroid Build Coastguard Worker 
1059*795d594fSAndroid Build Coastguard Worker   // Vector Arithmetic Instruction
1060*795d594fSAndroid Build Coastguard Worker 
1061*795d594fSAndroid Build Coastguard Worker   // Vector vadd instructions, funct6 = 0b000000
1062*795d594fSAndroid Build Coastguard Worker   void VAdd_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1063*795d594fSAndroid Build Coastguard Worker   void VAdd_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1064*795d594fSAndroid Build Coastguard Worker   void VAdd_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1065*795d594fSAndroid Build Coastguard Worker 
1066*795d594fSAndroid Build Coastguard Worker   // Vector vsub instructions, funct6 = 0b000010
1067*795d594fSAndroid Build Coastguard Worker   void VSub_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1068*795d594fSAndroid Build Coastguard Worker   void VSub_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1069*795d594fSAndroid Build Coastguard Worker 
1070*795d594fSAndroid Build Coastguard Worker   // Vector vrsub instructions, funct6 = 0b000011
1071*795d594fSAndroid Build Coastguard Worker   void VRsub_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1072*795d594fSAndroid Build Coastguard Worker   void VRsub_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1073*795d594fSAndroid Build Coastguard Worker 
1074*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VRsub_vi
1075*795d594fSAndroid Build Coastguard Worker   void VNeg_v(VRegister vd, VRegister vs2);
1076*795d594fSAndroid Build Coastguard Worker 
1077*795d594fSAndroid Build Coastguard Worker   // Vector vminu instructions, funct6 = 0b000100
1078*795d594fSAndroid Build Coastguard Worker   void VMinu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1079*795d594fSAndroid Build Coastguard Worker   void VMinu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1080*795d594fSAndroid Build Coastguard Worker 
1081*795d594fSAndroid Build Coastguard Worker   // Vector vmin instructions, funct6 = 0b000101
1082*795d594fSAndroid Build Coastguard Worker   void VMin_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1083*795d594fSAndroid Build Coastguard Worker   void VMin_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1084*795d594fSAndroid Build Coastguard Worker 
1085*795d594fSAndroid Build Coastguard Worker   // Vector vmaxu instructions, funct6 = 0b000110
1086*795d594fSAndroid Build Coastguard Worker   void VMaxu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1087*795d594fSAndroid Build Coastguard Worker   void VMaxu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1088*795d594fSAndroid Build Coastguard Worker 
1089*795d594fSAndroid Build Coastguard Worker   // Vector vmax instructions, funct6 = 0b000111
1090*795d594fSAndroid Build Coastguard Worker   void VMax_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1091*795d594fSAndroid Build Coastguard Worker   void VMax_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1092*795d594fSAndroid Build Coastguard Worker 
1093*795d594fSAndroid Build Coastguard Worker   // Vector vand instructions, funct6 = 0b001001
1094*795d594fSAndroid Build Coastguard Worker   void VAnd_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1095*795d594fSAndroid Build Coastguard Worker   void VAnd_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1096*795d594fSAndroid Build Coastguard Worker   void VAnd_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1097*795d594fSAndroid Build Coastguard Worker 
1098*795d594fSAndroid Build Coastguard Worker   // Vector vor instructions, funct6 = 0b001010
1099*795d594fSAndroid Build Coastguard Worker   void VOr_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1100*795d594fSAndroid Build Coastguard Worker   void VOr_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1101*795d594fSAndroid Build Coastguard Worker   void VOr_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1102*795d594fSAndroid Build Coastguard Worker 
1103*795d594fSAndroid Build Coastguard Worker   // Vector vxor instructions, funct6 = 0b001011
1104*795d594fSAndroid Build Coastguard Worker   void VXor_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1105*795d594fSAndroid Build Coastguard Worker   void VXor_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1106*795d594fSAndroid Build Coastguard Worker   void VXor_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1107*795d594fSAndroid Build Coastguard Worker 
1108*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VXor_vi
1109*795d594fSAndroid Build Coastguard Worker   void VNot_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1110*795d594fSAndroid Build Coastguard Worker 
1111*795d594fSAndroid Build Coastguard Worker   // Vector vrgather instructions, funct6 = 0b001100
1112*795d594fSAndroid Build Coastguard Worker   void VRgather_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1113*795d594fSAndroid Build Coastguard Worker   void VRgather_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1114*795d594fSAndroid Build Coastguard Worker   void VRgather_vi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1115*795d594fSAndroid Build Coastguard Worker 
1116*795d594fSAndroid Build Coastguard Worker   // Vector vslideup instructions, funct6 = 0b001110
1117*795d594fSAndroid Build Coastguard Worker   void VSlideup_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1118*795d594fSAndroid Build Coastguard Worker   void VSlideup_vi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1119*795d594fSAndroid Build Coastguard Worker 
1120*795d594fSAndroid Build Coastguard Worker   // Vector vrgatherei16 instructions, funct6 = 0b001110
1121*795d594fSAndroid Build Coastguard Worker   void VRgatherei16_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1122*795d594fSAndroid Build Coastguard Worker 
1123*795d594fSAndroid Build Coastguard Worker   // Vector vslidedown instructions, funct6 = 0b001111
1124*795d594fSAndroid Build Coastguard Worker   void VSlidedown_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1125*795d594fSAndroid Build Coastguard Worker   void VSlidedown_vi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1126*795d594fSAndroid Build Coastguard Worker 
1127*795d594fSAndroid Build Coastguard Worker   // Vector vadc instructions, funct6 = 0b010000
1128*795d594fSAndroid Build Coastguard Worker   void VAdc_vvm(VRegister vd, VRegister vs2, VRegister vs1);
1129*795d594fSAndroid Build Coastguard Worker   void VAdc_vxm(VRegister vd, VRegister vs2, XRegister rs1);
1130*795d594fSAndroid Build Coastguard Worker   void VAdc_vim(VRegister vd, VRegister vs2, int32_t imm5);
1131*795d594fSAndroid Build Coastguard Worker 
1132*795d594fSAndroid Build Coastguard Worker   // Vector vmadc instructions, funct6 = 0b010001
1133*795d594fSAndroid Build Coastguard Worker   void VMadc_vvm(VRegister vd, VRegister vs2, VRegister vs1);
1134*795d594fSAndroid Build Coastguard Worker   void VMadc_vxm(VRegister vd, VRegister vs2, XRegister rs1);
1135*795d594fSAndroid Build Coastguard Worker   void VMadc_vim(VRegister vd, VRegister vs2, int32_t imm5);
1136*795d594fSAndroid Build Coastguard Worker 
1137*795d594fSAndroid Build Coastguard Worker   // Vector vmadc instructions, funct6 = 0b010001
1138*795d594fSAndroid Build Coastguard Worker   void VMadc_vv(VRegister vd, VRegister vs2, VRegister vs1);
1139*795d594fSAndroid Build Coastguard Worker   void VMadc_vx(VRegister vd, VRegister vs2, XRegister rs1);
1140*795d594fSAndroid Build Coastguard Worker   void VMadc_vi(VRegister vd, VRegister vs2, int32_t imm5);
1141*795d594fSAndroid Build Coastguard Worker 
1142*795d594fSAndroid Build Coastguard Worker   // Vector vsbc instructions, funct6 = 0b010010
1143*795d594fSAndroid Build Coastguard Worker   void VSbc_vvm(VRegister vd, VRegister vs2, VRegister vs1);
1144*795d594fSAndroid Build Coastguard Worker   void VSbc_vxm(VRegister vd, VRegister vs2, XRegister rs1);
1145*795d594fSAndroid Build Coastguard Worker 
1146*795d594fSAndroid Build Coastguard Worker   // Vector vmsbc instructions, funct6 = 0b010011
1147*795d594fSAndroid Build Coastguard Worker   void VMsbc_vvm(VRegister vd, VRegister vs2, VRegister vs1);
1148*795d594fSAndroid Build Coastguard Worker   void VMsbc_vxm(VRegister vd, VRegister vs2, XRegister rs1);
1149*795d594fSAndroid Build Coastguard Worker   void VMsbc_vv(VRegister vd, VRegister vs2, VRegister vs1);
1150*795d594fSAndroid Build Coastguard Worker   void VMsbc_vx(VRegister vd, VRegister vs2, XRegister rs1);
1151*795d594fSAndroid Build Coastguard Worker 
1152*795d594fSAndroid Build Coastguard Worker   // Vector vmerge instructions, funct6 = 0b010111, vm = 0
1153*795d594fSAndroid Build Coastguard Worker   void VMerge_vvm(VRegister vd, VRegister vs2, VRegister vs1);
1154*795d594fSAndroid Build Coastguard Worker   void VMerge_vxm(VRegister vd, VRegister vs2, XRegister rs1);
1155*795d594fSAndroid Build Coastguard Worker   void VMerge_vim(VRegister vd, VRegister vs2, int32_t imm5);
1156*795d594fSAndroid Build Coastguard Worker 
1157*795d594fSAndroid Build Coastguard Worker   // Vector vmv instructions, funct6 = 0b010111, vm = 1, vs2 = v0
1158*795d594fSAndroid Build Coastguard Worker   void VMv_vv(VRegister vd, VRegister vs1);
1159*795d594fSAndroid Build Coastguard Worker   void VMv_vx(VRegister vd, XRegister rs1);
1160*795d594fSAndroid Build Coastguard Worker   void VMv_vi(VRegister vd, int32_t imm5);
1161*795d594fSAndroid Build Coastguard Worker 
1162*795d594fSAndroid Build Coastguard Worker   // Vector vmseq instructions, funct6 = 0b011000
1163*795d594fSAndroid Build Coastguard Worker   void VMseq_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1164*795d594fSAndroid Build Coastguard Worker   void VMseq_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1165*795d594fSAndroid Build Coastguard Worker   void VMseq_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1166*795d594fSAndroid Build Coastguard Worker 
1167*795d594fSAndroid Build Coastguard Worker   // Vector vmsne instructions, funct6 = 0b011001
1168*795d594fSAndroid Build Coastguard Worker   void VMsne_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1169*795d594fSAndroid Build Coastguard Worker   void VMsne_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1170*795d594fSAndroid Build Coastguard Worker   void VMsne_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1171*795d594fSAndroid Build Coastguard Worker 
1172*795d594fSAndroid Build Coastguard Worker   // Vector vmsltu instructions, funct6 = 0b011010
1173*795d594fSAndroid Build Coastguard Worker   void VMsltu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1174*795d594fSAndroid Build Coastguard Worker   void VMsltu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1175*795d594fSAndroid Build Coastguard Worker 
1176*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VMsltu_vv
1177*795d594fSAndroid Build Coastguard Worker   void VMsgtu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1178*795d594fSAndroid Build Coastguard Worker 
1179*795d594fSAndroid Build Coastguard Worker   // Vector vmslt instructions, funct6 = 0b011011
1180*795d594fSAndroid Build Coastguard Worker   void VMslt_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1181*795d594fSAndroid Build Coastguard Worker   void VMslt_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1182*795d594fSAndroid Build Coastguard Worker 
1183*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VMslt_vv
1184*795d594fSAndroid Build Coastguard Worker   void VMsgt_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1185*795d594fSAndroid Build Coastguard Worker 
1186*795d594fSAndroid Build Coastguard Worker   // Vector vmsleu instructions, funct6 = 0b011100
1187*795d594fSAndroid Build Coastguard Worker   void VMsleu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1188*795d594fSAndroid Build Coastguard Worker   void VMsleu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1189*795d594fSAndroid Build Coastguard Worker   void VMsleu_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1190*795d594fSAndroid Build Coastguard Worker 
1191*795d594fSAndroid Build Coastguard Worker   // Pseudo-instructions over VMsleu_*
1192*795d594fSAndroid Build Coastguard Worker   void VMsgeu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1193*795d594fSAndroid Build Coastguard Worker   void VMsltu_vi(VRegister vd, VRegister vs2, int32_t aimm5, VM vm = VM::kUnmasked);
1194*795d594fSAndroid Build Coastguard Worker 
1195*795d594fSAndroid Build Coastguard Worker   // Vector vmsle instructions, funct6 = 0b011101
1196*795d594fSAndroid Build Coastguard Worker   void VMsle_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1197*795d594fSAndroid Build Coastguard Worker   void VMsle_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1198*795d594fSAndroid Build Coastguard Worker   void VMsle_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1199*795d594fSAndroid Build Coastguard Worker 
1200*795d594fSAndroid Build Coastguard Worker   // Pseudo-instructions over VMsle_*
1201*795d594fSAndroid Build Coastguard Worker   void VMsge_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1202*795d594fSAndroid Build Coastguard Worker   void VMslt_vi(VRegister vd, VRegister vs2, int32_t aimm5, VM vm = VM::kUnmasked);
1203*795d594fSAndroid Build Coastguard Worker 
1204*795d594fSAndroid Build Coastguard Worker   // Vector vmsgtu instructions, funct6 = 0b011110
1205*795d594fSAndroid Build Coastguard Worker   void VMsgtu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1206*795d594fSAndroid Build Coastguard Worker   void VMsgtu_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1207*795d594fSAndroid Build Coastguard Worker 
1208*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VMsgtu_vi
1209*795d594fSAndroid Build Coastguard Worker   void VMsgeu_vi(VRegister vd, VRegister vs2, int32_t aimm5, VM vm = VM::kUnmasked);
1210*795d594fSAndroid Build Coastguard Worker 
1211*795d594fSAndroid Build Coastguard Worker   // Vector vmsgt instructions, funct6 = 0b011111
1212*795d594fSAndroid Build Coastguard Worker   void VMsgt_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1213*795d594fSAndroid Build Coastguard Worker   void VMsgt_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1214*795d594fSAndroid Build Coastguard Worker 
1215*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VMsgt_vi
1216*795d594fSAndroid Build Coastguard Worker   void VMsge_vi(VRegister vd, VRegister vs2, int32_t aimm5, VM vm = VM::kUnmasked);
1217*795d594fSAndroid Build Coastguard Worker 
1218*795d594fSAndroid Build Coastguard Worker   // Vector vsaddu instructions, funct6 = 0b100000
1219*795d594fSAndroid Build Coastguard Worker   void VSaddu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1220*795d594fSAndroid Build Coastguard Worker   void VSaddu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1221*795d594fSAndroid Build Coastguard Worker   void VSaddu_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1222*795d594fSAndroid Build Coastguard Worker 
1223*795d594fSAndroid Build Coastguard Worker   // Vector vsadd instructions, funct6 = 0b100001
1224*795d594fSAndroid Build Coastguard Worker   void VSadd_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1225*795d594fSAndroid Build Coastguard Worker   void VSadd_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1226*795d594fSAndroid Build Coastguard Worker   void VSadd_vi(VRegister vd, VRegister vs2, int32_t imm5, VM vm = VM::kUnmasked);
1227*795d594fSAndroid Build Coastguard Worker 
1228*795d594fSAndroid Build Coastguard Worker   // Vector vssubu instructions, funct6 = 0b100010
1229*795d594fSAndroid Build Coastguard Worker   void VSsubu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1230*795d594fSAndroid Build Coastguard Worker   void VSsubu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1231*795d594fSAndroid Build Coastguard Worker 
1232*795d594fSAndroid Build Coastguard Worker   // Vector vssub instructions, funct6 = 0b100011
1233*795d594fSAndroid Build Coastguard Worker   void VSsub_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1234*795d594fSAndroid Build Coastguard Worker   void VSsub_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1235*795d594fSAndroid Build Coastguard Worker 
1236*795d594fSAndroid Build Coastguard Worker   // Vector vsll instructions, funct6 = 0b100101
1237*795d594fSAndroid Build Coastguard Worker   void VSll_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1238*795d594fSAndroid Build Coastguard Worker   void VSll_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1239*795d594fSAndroid Build Coastguard Worker   void VSll_vi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1240*795d594fSAndroid Build Coastguard Worker 
1241*795d594fSAndroid Build Coastguard Worker   // Vector vsmul instructions, funct6 = 0b100111
1242*795d594fSAndroid Build Coastguard Worker   void VSmul_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1243*795d594fSAndroid Build Coastguard Worker   void VSmul_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1244*795d594fSAndroid Build Coastguard Worker 
1245*795d594fSAndroid Build Coastguard Worker   // Vector vmv<nr>r.v instructions, funct6 = 0b100111
1246*795d594fSAndroid Build Coastguard Worker   void Vmv1r_v(VRegister vd, VRegister vs2);
1247*795d594fSAndroid Build Coastguard Worker   void Vmv2r_v(VRegister vd, VRegister vs2);
1248*795d594fSAndroid Build Coastguard Worker   void Vmv4r_v(VRegister vd, VRegister vs2);
1249*795d594fSAndroid Build Coastguard Worker   void Vmv8r_v(VRegister vd, VRegister vs2);
1250*795d594fSAndroid Build Coastguard Worker 
1251*795d594fSAndroid Build Coastguard Worker   // Vector vsrl instructions, funct6 = 0b101000
1252*795d594fSAndroid Build Coastguard Worker   void VSrl_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1253*795d594fSAndroid Build Coastguard Worker   void VSrl_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1254*795d594fSAndroid Build Coastguard Worker   void VSrl_vi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1255*795d594fSAndroid Build Coastguard Worker 
1256*795d594fSAndroid Build Coastguard Worker   // Vector vsra instructions, funct6 = 0b101001
1257*795d594fSAndroid Build Coastguard Worker   void VSra_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1258*795d594fSAndroid Build Coastguard Worker   void VSra_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1259*795d594fSAndroid Build Coastguard Worker   void VSra_vi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1260*795d594fSAndroid Build Coastguard Worker 
1261*795d594fSAndroid Build Coastguard Worker   // Vector vssrl instructions, funct6 = 0b101010
1262*795d594fSAndroid Build Coastguard Worker   void VSsrl_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1263*795d594fSAndroid Build Coastguard Worker   void VSsrl_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1264*795d594fSAndroid Build Coastguard Worker   void VSsrl_vi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1265*795d594fSAndroid Build Coastguard Worker 
1266*795d594fSAndroid Build Coastguard Worker   // Vector vssra instructions, funct6 = 0b101011
1267*795d594fSAndroid Build Coastguard Worker   void VSsra_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1268*795d594fSAndroid Build Coastguard Worker   void VSsra_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1269*795d594fSAndroid Build Coastguard Worker   void VSsra_vi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1270*795d594fSAndroid Build Coastguard Worker 
1271*795d594fSAndroid Build Coastguard Worker   // Vector vnsrl instructions, funct6 = 0b101100
1272*795d594fSAndroid Build Coastguard Worker   void VNsrl_wv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1273*795d594fSAndroid Build Coastguard Worker   void VNsrl_wx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1274*795d594fSAndroid Build Coastguard Worker   void VNsrl_wi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1275*795d594fSAndroid Build Coastguard Worker 
1276*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VNsrl_wx
1277*795d594fSAndroid Build Coastguard Worker   void VNcvt_x_x_w(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1278*795d594fSAndroid Build Coastguard Worker 
1279*795d594fSAndroid Build Coastguard Worker   // Vector vnsra instructions, funct6 = 0b101101
1280*795d594fSAndroid Build Coastguard Worker   void VNsra_wv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1281*795d594fSAndroid Build Coastguard Worker   void VNsra_wx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1282*795d594fSAndroid Build Coastguard Worker   void VNsra_wi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1283*795d594fSAndroid Build Coastguard Worker 
1284*795d594fSAndroid Build Coastguard Worker   // Vector vnclipu instructions, funct6 = 0b101110
1285*795d594fSAndroid Build Coastguard Worker   void VNclipu_wv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1286*795d594fSAndroid Build Coastguard Worker   void VNclipu_wx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1287*795d594fSAndroid Build Coastguard Worker   void VNclipu_wi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1288*795d594fSAndroid Build Coastguard Worker 
1289*795d594fSAndroid Build Coastguard Worker   // Vector vnclip instructions, funct6 = 0b101111
1290*795d594fSAndroid Build Coastguard Worker   void VNclip_wv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1291*795d594fSAndroid Build Coastguard Worker   void VNclip_wx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1292*795d594fSAndroid Build Coastguard Worker   void VNclip_wi(VRegister vd, VRegister vs2, uint32_t uimm5, VM vm = VM::kUnmasked);
1293*795d594fSAndroid Build Coastguard Worker 
1294*795d594fSAndroid Build Coastguard Worker   // Vector vwredsumu instructions, funct6 = 0b110000
1295*795d594fSAndroid Build Coastguard Worker   void VWredsumu_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1296*795d594fSAndroid Build Coastguard Worker 
1297*795d594fSAndroid Build Coastguard Worker   // Vector vwredsum instructions, funct6 = 0b110001
1298*795d594fSAndroid Build Coastguard Worker   void VWredsum_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1299*795d594fSAndroid Build Coastguard Worker 
1300*795d594fSAndroid Build Coastguard Worker   // Vector vredsum instructions, funct6 = 0b000000
1301*795d594fSAndroid Build Coastguard Worker   void VRedsum_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1302*795d594fSAndroid Build Coastguard Worker 
1303*795d594fSAndroid Build Coastguard Worker   // Vector vredand instructions, funct6 = 0b000001
1304*795d594fSAndroid Build Coastguard Worker   void VRedand_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1305*795d594fSAndroid Build Coastguard Worker 
1306*795d594fSAndroid Build Coastguard Worker   // Vector vredor instructions, funct6 = 0b000010
1307*795d594fSAndroid Build Coastguard Worker   void VRedor_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1308*795d594fSAndroid Build Coastguard Worker 
1309*795d594fSAndroid Build Coastguard Worker   // Vector vredxor instructions, funct6 = 0b000011
1310*795d594fSAndroid Build Coastguard Worker   void VRedxor_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1311*795d594fSAndroid Build Coastguard Worker 
1312*795d594fSAndroid Build Coastguard Worker   // Vector vredminu instructions, funct6 = 0b000100
1313*795d594fSAndroid Build Coastguard Worker   void VRedminu_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1314*795d594fSAndroid Build Coastguard Worker 
1315*795d594fSAndroid Build Coastguard Worker   // Vector vredmin instructions, funct6 = 0b000101
1316*795d594fSAndroid Build Coastguard Worker   void VRedmin_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1317*795d594fSAndroid Build Coastguard Worker 
1318*795d594fSAndroid Build Coastguard Worker   // Vector vredmaxu instructions, funct6 = 0b000110
1319*795d594fSAndroid Build Coastguard Worker   void VRedmaxu_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1320*795d594fSAndroid Build Coastguard Worker 
1321*795d594fSAndroid Build Coastguard Worker   // Vector vredmax instructions, funct6 = 0b000111
1322*795d594fSAndroid Build Coastguard Worker   void VRedmax_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1323*795d594fSAndroid Build Coastguard Worker 
1324*795d594fSAndroid Build Coastguard Worker   // Vector vaaddu instructions, funct6 = 0b001000
1325*795d594fSAndroid Build Coastguard Worker   void VAaddu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1326*795d594fSAndroid Build Coastguard Worker   void VAaddu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1327*795d594fSAndroid Build Coastguard Worker 
1328*795d594fSAndroid Build Coastguard Worker   // Vector vaadd instructions, funct6 = 0b001001
1329*795d594fSAndroid Build Coastguard Worker   void VAadd_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1330*795d594fSAndroid Build Coastguard Worker   void VAadd_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1331*795d594fSAndroid Build Coastguard Worker 
1332*795d594fSAndroid Build Coastguard Worker   // Vector vasubu instructions, funct6 = 0b001010
1333*795d594fSAndroid Build Coastguard Worker   void VAsubu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1334*795d594fSAndroid Build Coastguard Worker   void VAsubu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1335*795d594fSAndroid Build Coastguard Worker 
1336*795d594fSAndroid Build Coastguard Worker   // Vector vasub instructions, funct6 = 0b001011
1337*795d594fSAndroid Build Coastguard Worker   void VAsub_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1338*795d594fSAndroid Build Coastguard Worker   void VAsub_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1339*795d594fSAndroid Build Coastguard Worker 
1340*795d594fSAndroid Build Coastguard Worker   // Vector vslide1up instructions, funct6 = 0b001110
1341*795d594fSAndroid Build Coastguard Worker   void VSlide1up_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1342*795d594fSAndroid Build Coastguard Worker 
1343*795d594fSAndroid Build Coastguard Worker   // Vector vslide1down instructions, funct6 = 0b001111
1344*795d594fSAndroid Build Coastguard Worker   void VSlide1down_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1345*795d594fSAndroid Build Coastguard Worker 
1346*795d594fSAndroid Build Coastguard Worker   // Vector vcompress instructions, funct6 = 0b010111
1347*795d594fSAndroid Build Coastguard Worker   void VCompress_vm(VRegister vd, VRegister vs2, VRegister vs1);
1348*795d594fSAndroid Build Coastguard Worker 
1349*795d594fSAndroid Build Coastguard Worker   // Vector vmandn instructions, funct6 = 0b011000
1350*795d594fSAndroid Build Coastguard Worker   void VMandn_mm(VRegister vd, VRegister vs2, VRegister vs1);
1351*795d594fSAndroid Build Coastguard Worker 
1352*795d594fSAndroid Build Coastguard Worker   // Vector vmand instructions, funct6 = 0b011001
1353*795d594fSAndroid Build Coastguard Worker   void VMand_mm(VRegister vd, VRegister vs2, VRegister vs1);
1354*795d594fSAndroid Build Coastguard Worker 
1355*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VMand_mm
1356*795d594fSAndroid Build Coastguard Worker   void VMmv_m(VRegister vd, VRegister vs2);
1357*795d594fSAndroid Build Coastguard Worker 
1358*795d594fSAndroid Build Coastguard Worker   // Vector vmor instructions, funct6 = 0b011010
1359*795d594fSAndroid Build Coastguard Worker   void VMor_mm(VRegister vd, VRegister vs2, VRegister vs1);
1360*795d594fSAndroid Build Coastguard Worker 
1361*795d594fSAndroid Build Coastguard Worker   // Vector vmxor instructions, funct6 = 0b011011
1362*795d594fSAndroid Build Coastguard Worker   void VMxor_mm(VRegister vd, VRegister vs2, VRegister vs1);
1363*795d594fSAndroid Build Coastguard Worker 
1364*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VMxor_mm
1365*795d594fSAndroid Build Coastguard Worker   void VMclr_m(VRegister vd);
1366*795d594fSAndroid Build Coastguard Worker 
1367*795d594fSAndroid Build Coastguard Worker   // Vector vmorn instructions, funct6 = 0b011100
1368*795d594fSAndroid Build Coastguard Worker   void VMorn_mm(VRegister vd, VRegister vs2, VRegister vs1);
1369*795d594fSAndroid Build Coastguard Worker 
1370*795d594fSAndroid Build Coastguard Worker   // Vector vmnand instructions, funct6 = 0b011101
1371*795d594fSAndroid Build Coastguard Worker   void VMnand_mm(VRegister vd, VRegister vs2, VRegister vs1);
1372*795d594fSAndroid Build Coastguard Worker 
1373*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VMnand_mm
1374*795d594fSAndroid Build Coastguard Worker   void VMnot_m(VRegister vd, VRegister vs2);
1375*795d594fSAndroid Build Coastguard Worker 
1376*795d594fSAndroid Build Coastguard Worker   // Vector vmnor instructions, funct6 = 0b011110
1377*795d594fSAndroid Build Coastguard Worker   void VMnor_mm(VRegister vd, VRegister vs2, VRegister vs1);
1378*795d594fSAndroid Build Coastguard Worker 
1379*795d594fSAndroid Build Coastguard Worker   // Vector vmxnor instructions, funct6 = 0b011111
1380*795d594fSAndroid Build Coastguard Worker   void VMxnor_mm(VRegister vd, VRegister vs2, VRegister vs1);
1381*795d594fSAndroid Build Coastguard Worker 
1382*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VMxnor_mm
1383*795d594fSAndroid Build Coastguard Worker   void VMset_m(VRegister vd);
1384*795d594fSAndroid Build Coastguard Worker 
1385*795d594fSAndroid Build Coastguard Worker   // Vector vdivu instructions, funct6 = 0b100000
1386*795d594fSAndroid Build Coastguard Worker   void VDivu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1387*795d594fSAndroid Build Coastguard Worker   void VDivu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1388*795d594fSAndroid Build Coastguard Worker 
1389*795d594fSAndroid Build Coastguard Worker   // Vector vdiv instructions, funct6 = 0b100001
1390*795d594fSAndroid Build Coastguard Worker   void VDiv_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1391*795d594fSAndroid Build Coastguard Worker   void VDiv_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1392*795d594fSAndroid Build Coastguard Worker 
1393*795d594fSAndroid Build Coastguard Worker   // Vector vremu instructions, funct6 = 0b100010
1394*795d594fSAndroid Build Coastguard Worker   void VRemu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1395*795d594fSAndroid Build Coastguard Worker   void VRemu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1396*795d594fSAndroid Build Coastguard Worker 
1397*795d594fSAndroid Build Coastguard Worker   // Vector vrem instructions, funct6 = 0b100011
1398*795d594fSAndroid Build Coastguard Worker   void VRem_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1399*795d594fSAndroid Build Coastguard Worker   void VRem_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1400*795d594fSAndroid Build Coastguard Worker 
1401*795d594fSAndroid Build Coastguard Worker   // Vector vmulhu instructions, funct6 = 0b100100
1402*795d594fSAndroid Build Coastguard Worker   void VMulhu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1403*795d594fSAndroid Build Coastguard Worker   void VMulhu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1404*795d594fSAndroid Build Coastguard Worker 
1405*795d594fSAndroid Build Coastguard Worker   // Vector vmul instructions, funct6 = 0b100101
1406*795d594fSAndroid Build Coastguard Worker   void VMul_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1407*795d594fSAndroid Build Coastguard Worker   void VMul_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1408*795d594fSAndroid Build Coastguard Worker 
1409*795d594fSAndroid Build Coastguard Worker   // Vector vmulhsu instructions, funct6 = 0b100110
1410*795d594fSAndroid Build Coastguard Worker   void VMulhsu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1411*795d594fSAndroid Build Coastguard Worker   void VMulhsu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1412*795d594fSAndroid Build Coastguard Worker 
1413*795d594fSAndroid Build Coastguard Worker   // Vector vmulh instructions, funct6 = 0b100111
1414*795d594fSAndroid Build Coastguard Worker   void VMulh_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1415*795d594fSAndroid Build Coastguard Worker   void VMulh_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1416*795d594fSAndroid Build Coastguard Worker 
1417*795d594fSAndroid Build Coastguard Worker   // Vector vmadd instructions, funct6 = 0b101001
1418*795d594fSAndroid Build Coastguard Worker   void VMadd_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1419*795d594fSAndroid Build Coastguard Worker   void VMadd_vx(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1420*795d594fSAndroid Build Coastguard Worker 
1421*795d594fSAndroid Build Coastguard Worker   // Vector vnmsub instructions, funct6 = 0b101011
1422*795d594fSAndroid Build Coastguard Worker   void VNmsub_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1423*795d594fSAndroid Build Coastguard Worker   void VNmsub_vx(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1424*795d594fSAndroid Build Coastguard Worker 
1425*795d594fSAndroid Build Coastguard Worker   // Vector vmacc instructions, funct6 = 0b101101
1426*795d594fSAndroid Build Coastguard Worker   void VMacc_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1427*795d594fSAndroid Build Coastguard Worker   void VMacc_vx(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1428*795d594fSAndroid Build Coastguard Worker 
1429*795d594fSAndroid Build Coastguard Worker   // Vector vnmsac instructions, funct6 = 0b101111
1430*795d594fSAndroid Build Coastguard Worker   void VNmsac_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1431*795d594fSAndroid Build Coastguard Worker   void VNmsac_vx(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1432*795d594fSAndroid Build Coastguard Worker 
1433*795d594fSAndroid Build Coastguard Worker   // Vector vwaddu instructions, funct6 = 0b110000
1434*795d594fSAndroid Build Coastguard Worker   void VWaddu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1435*795d594fSAndroid Build Coastguard Worker   void VWaddu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1436*795d594fSAndroid Build Coastguard Worker 
1437*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VWaddu_vx
1438*795d594fSAndroid Build Coastguard Worker   void VWcvtu_x_x_v(VRegister vd, VRegister vs, VM vm = VM::kUnmasked);
1439*795d594fSAndroid Build Coastguard Worker 
1440*795d594fSAndroid Build Coastguard Worker   // Vector vwadd instructions, funct6 = 0b110001
1441*795d594fSAndroid Build Coastguard Worker   void VWadd_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1442*795d594fSAndroid Build Coastguard Worker   void VWadd_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1443*795d594fSAndroid Build Coastguard Worker 
1444*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VWadd_vx
1445*795d594fSAndroid Build Coastguard Worker   void VWcvt_x_x_v(VRegister vd, VRegister vs, VM vm = VM::kUnmasked);
1446*795d594fSAndroid Build Coastguard Worker 
1447*795d594fSAndroid Build Coastguard Worker   // Vector vwsubu instructions, funct6 = 0b110010
1448*795d594fSAndroid Build Coastguard Worker   void VWsubu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1449*795d594fSAndroid Build Coastguard Worker   void VWsubu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1450*795d594fSAndroid Build Coastguard Worker 
1451*795d594fSAndroid Build Coastguard Worker   // Vector vwsub instructions, funct6 = 0b110011
1452*795d594fSAndroid Build Coastguard Worker   void VWsub_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1453*795d594fSAndroid Build Coastguard Worker   void VWsub_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1454*795d594fSAndroid Build Coastguard Worker 
1455*795d594fSAndroid Build Coastguard Worker   // Vector vwaddu.w instructions, funct6 = 0b110100
1456*795d594fSAndroid Build Coastguard Worker   void VWaddu_wv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1457*795d594fSAndroid Build Coastguard Worker   void VWaddu_wx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1458*795d594fSAndroid Build Coastguard Worker 
1459*795d594fSAndroid Build Coastguard Worker   // Vector vwadd.w instructions, funct6 = 0b110101
1460*795d594fSAndroid Build Coastguard Worker   void VWadd_wv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1461*795d594fSAndroid Build Coastguard Worker   void VWadd_wx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1462*795d594fSAndroid Build Coastguard Worker 
1463*795d594fSAndroid Build Coastguard Worker   // Vector vwsubu.w instructions, funct6 = 0b110110
1464*795d594fSAndroid Build Coastguard Worker   void VWsubu_wv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1465*795d594fSAndroid Build Coastguard Worker   void VWsubu_wx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1466*795d594fSAndroid Build Coastguard Worker 
1467*795d594fSAndroid Build Coastguard Worker   // Vector vwsub.w instructions, funct6 = 0b110111
1468*795d594fSAndroid Build Coastguard Worker   void VWsub_wv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1469*795d594fSAndroid Build Coastguard Worker   void VWsub_wx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1470*795d594fSAndroid Build Coastguard Worker 
1471*795d594fSAndroid Build Coastguard Worker   // Vector vwmulu instructions, funct6 = 0b111000
1472*795d594fSAndroid Build Coastguard Worker   void VWmulu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1473*795d594fSAndroid Build Coastguard Worker   void VWmulu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1474*795d594fSAndroid Build Coastguard Worker 
1475*795d594fSAndroid Build Coastguard Worker   // Vector vwmulsu instructions, funct6 = 0b111010
1476*795d594fSAndroid Build Coastguard Worker   void VWmulsu_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1477*795d594fSAndroid Build Coastguard Worker   void VWmulsu_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1478*795d594fSAndroid Build Coastguard Worker 
1479*795d594fSAndroid Build Coastguard Worker   // Vector vwmul instructions, funct6 = 0b111011
1480*795d594fSAndroid Build Coastguard Worker   void VWmul_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1481*795d594fSAndroid Build Coastguard Worker   void VWmul_vx(VRegister vd, VRegister vs2, XRegister rs1, VM vm = VM::kUnmasked);
1482*795d594fSAndroid Build Coastguard Worker 
1483*795d594fSAndroid Build Coastguard Worker   // Vector vwmaccu instructions, funct6 = 0b111100
1484*795d594fSAndroid Build Coastguard Worker   void VWmaccu_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1485*795d594fSAndroid Build Coastguard Worker   void VWmaccu_vx(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1486*795d594fSAndroid Build Coastguard Worker 
1487*795d594fSAndroid Build Coastguard Worker   // Vector vwmacc instructions, funct6 = 0b111101
1488*795d594fSAndroid Build Coastguard Worker   void VWmacc_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1489*795d594fSAndroid Build Coastguard Worker   void VWmacc_vx(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1490*795d594fSAndroid Build Coastguard Worker 
1491*795d594fSAndroid Build Coastguard Worker   // Vector vwmaccus instructions, funct6 = 0b111110
1492*795d594fSAndroid Build Coastguard Worker   void VWmaccus_vx(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1493*795d594fSAndroid Build Coastguard Worker 
1494*795d594fSAndroid Build Coastguard Worker   // Vector vwmaccsu instructions, funct6 = 0b111111
1495*795d594fSAndroid Build Coastguard Worker   void VWmaccsu_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1496*795d594fSAndroid Build Coastguard Worker   void VWmaccsu_vx(VRegister vd, XRegister rs1, VRegister vs2, VM vm = VM::kUnmasked);
1497*795d594fSAndroid Build Coastguard Worker 
1498*795d594fSAndroid Build Coastguard Worker   // Vector vfadd instructions, funct6 = 0b000000
1499*795d594fSAndroid Build Coastguard Worker   void VFadd_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1500*795d594fSAndroid Build Coastguard Worker   void VFadd_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1501*795d594fSAndroid Build Coastguard Worker 
1502*795d594fSAndroid Build Coastguard Worker   // Vector vfredusum instructions, funct6 = 0b000001
1503*795d594fSAndroid Build Coastguard Worker   void VFredusum_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1504*795d594fSAndroid Build Coastguard Worker 
1505*795d594fSAndroid Build Coastguard Worker   // Vector vfsub instructions, funct6 = 0b000010
1506*795d594fSAndroid Build Coastguard Worker   void VFsub_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1507*795d594fSAndroid Build Coastguard Worker   void VFsub_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1508*795d594fSAndroid Build Coastguard Worker 
1509*795d594fSAndroid Build Coastguard Worker   // Vector vfredosum instructions, funct6 = 0b000011
1510*795d594fSAndroid Build Coastguard Worker   void VFredosum_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1511*795d594fSAndroid Build Coastguard Worker 
1512*795d594fSAndroid Build Coastguard Worker   // Vector vfmin instructions, funct6 = 0b000100
1513*795d594fSAndroid Build Coastguard Worker   void VFmin_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1514*795d594fSAndroid Build Coastguard Worker   void VFmin_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1515*795d594fSAndroid Build Coastguard Worker 
1516*795d594fSAndroid Build Coastguard Worker   // Vector vfredmin instructions, funct6 = 0b000101
1517*795d594fSAndroid Build Coastguard Worker   void VFredmin_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1518*795d594fSAndroid Build Coastguard Worker 
1519*795d594fSAndroid Build Coastguard Worker   // Vector vfmax instructions, funct6 = 0b000110
1520*795d594fSAndroid Build Coastguard Worker   void VFmax_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1521*795d594fSAndroid Build Coastguard Worker   void VFmax_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1522*795d594fSAndroid Build Coastguard Worker 
1523*795d594fSAndroid Build Coastguard Worker   // Vector vfredmax instructions, funct6 = 0b000111
1524*795d594fSAndroid Build Coastguard Worker   void VFredmax_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1525*795d594fSAndroid Build Coastguard Worker 
1526*795d594fSAndroid Build Coastguard Worker   // Vector vfsgnj instructions, funct6 = 0b001000
1527*795d594fSAndroid Build Coastguard Worker   void VFsgnj_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1528*795d594fSAndroid Build Coastguard Worker   void VFsgnj_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1529*795d594fSAndroid Build Coastguard Worker 
1530*795d594fSAndroid Build Coastguard Worker   // Vector vfsgnjn instructions, funct6 = 0b001001
1531*795d594fSAndroid Build Coastguard Worker   void VFsgnjn_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1532*795d594fSAndroid Build Coastguard Worker   void VFsgnjn_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1533*795d594fSAndroid Build Coastguard Worker 
1534*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VFsgnjn_vv
1535*795d594fSAndroid Build Coastguard Worker   void VFneg_v(VRegister vd, VRegister vs);
1536*795d594fSAndroid Build Coastguard Worker 
1537*795d594fSAndroid Build Coastguard Worker   // Vector vfsgnjx instructions, funct6 = 0b001010
1538*795d594fSAndroid Build Coastguard Worker   void VFsgnjx_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1539*795d594fSAndroid Build Coastguard Worker   void VFsgnjx_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1540*795d594fSAndroid Build Coastguard Worker 
1541*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VFsgnjx_vv
1542*795d594fSAndroid Build Coastguard Worker   void VFabs_v(VRegister vd, VRegister vs);
1543*795d594fSAndroid Build Coastguard Worker 
1544*795d594fSAndroid Build Coastguard Worker   // Vector vfslide1up instructions, funct6 = 0b001110
1545*795d594fSAndroid Build Coastguard Worker   void VFslide1up_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1546*795d594fSAndroid Build Coastguard Worker 
1547*795d594fSAndroid Build Coastguard Worker   // Vector vfslide1down instructions, funct6 = 0b001111
1548*795d594fSAndroid Build Coastguard Worker   void VFslide1down_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1549*795d594fSAndroid Build Coastguard Worker 
1550*795d594fSAndroid Build Coastguard Worker   // Vector vfmerge/vfmv instructions, funct6 = 0b010111
1551*795d594fSAndroid Build Coastguard Worker   void VFmerge_vfm(VRegister vd, VRegister vs2, FRegister fs1);
1552*795d594fSAndroid Build Coastguard Worker   void VFmv_v_f(VRegister vd, FRegister fs1);
1553*795d594fSAndroid Build Coastguard Worker 
1554*795d594fSAndroid Build Coastguard Worker   // Vector vmfeq instructions, funct6 = 0b011000
1555*795d594fSAndroid Build Coastguard Worker   void VMfeq_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1556*795d594fSAndroid Build Coastguard Worker   void VMfeq_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1557*795d594fSAndroid Build Coastguard Worker 
1558*795d594fSAndroid Build Coastguard Worker   // Vector vmfle instructions, funct6 = 0b011001
1559*795d594fSAndroid Build Coastguard Worker   void VMfle_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1560*795d594fSAndroid Build Coastguard Worker   void VMfle_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1561*795d594fSAndroid Build Coastguard Worker 
1562*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VMfle_vv
1563*795d594fSAndroid Build Coastguard Worker   void VMfge_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1564*795d594fSAndroid Build Coastguard Worker 
1565*795d594fSAndroid Build Coastguard Worker   // Vector vmflt instructions, funct6 = 0b011011
1566*795d594fSAndroid Build Coastguard Worker   void VMflt_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1567*795d594fSAndroid Build Coastguard Worker   void VMflt_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1568*795d594fSAndroid Build Coastguard Worker 
1569*795d594fSAndroid Build Coastguard Worker   // Pseudo-instruction over VMflt_vv
1570*795d594fSAndroid Build Coastguard Worker   void VMfgt_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1571*795d594fSAndroid Build Coastguard Worker 
1572*795d594fSAndroid Build Coastguard Worker   // Vector vmfne instructions, funct6 = 0b011100
1573*795d594fSAndroid Build Coastguard Worker   void VMfne_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1574*795d594fSAndroid Build Coastguard Worker   void VMfne_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1575*795d594fSAndroid Build Coastguard Worker 
1576*795d594fSAndroid Build Coastguard Worker   // Vector vmfgt instructions, funct6 = 0b011101
1577*795d594fSAndroid Build Coastguard Worker   void VMfgt_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1578*795d594fSAndroid Build Coastguard Worker 
1579*795d594fSAndroid Build Coastguard Worker   // Vector vmfge instructions, funct6 = 0b011111
1580*795d594fSAndroid Build Coastguard Worker   void VMfge_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1581*795d594fSAndroid Build Coastguard Worker 
1582*795d594fSAndroid Build Coastguard Worker   // Vector vfdiv instructions, funct6 = 0b100000
1583*795d594fSAndroid Build Coastguard Worker   void VFdiv_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1584*795d594fSAndroid Build Coastguard Worker   void VFdiv_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1585*795d594fSAndroid Build Coastguard Worker 
1586*795d594fSAndroid Build Coastguard Worker   // Vector vfrdiv instructions, funct6 = 0b100001
1587*795d594fSAndroid Build Coastguard Worker   void VFrdiv_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1588*795d594fSAndroid Build Coastguard Worker 
1589*795d594fSAndroid Build Coastguard Worker   // Vector vfmul instructions, funct6 = 0b100100
1590*795d594fSAndroid Build Coastguard Worker   void VFmul_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1591*795d594fSAndroid Build Coastguard Worker   void VFmul_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1592*795d594fSAndroid Build Coastguard Worker 
1593*795d594fSAndroid Build Coastguard Worker   // Vector vfrsub instructions, funct6 = 0b100111
1594*795d594fSAndroid Build Coastguard Worker   void VFrsub_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1595*795d594fSAndroid Build Coastguard Worker 
1596*795d594fSAndroid Build Coastguard Worker   // Vector vfmadd instructions, funct6 = 0b101000
1597*795d594fSAndroid Build Coastguard Worker   void VFmadd_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1598*795d594fSAndroid Build Coastguard Worker   void VFmadd_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1599*795d594fSAndroid Build Coastguard Worker 
1600*795d594fSAndroid Build Coastguard Worker   // Vector vfnmadd instructions, funct6 = 0b101001
1601*795d594fSAndroid Build Coastguard Worker   void VFnmadd_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1602*795d594fSAndroid Build Coastguard Worker   void VFnmadd_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1603*795d594fSAndroid Build Coastguard Worker 
1604*795d594fSAndroid Build Coastguard Worker   // Vector vfmsub instructions, funct6 = 0b101010
1605*795d594fSAndroid Build Coastguard Worker   void VFmsub_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1606*795d594fSAndroid Build Coastguard Worker   void VFmsub_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1607*795d594fSAndroid Build Coastguard Worker 
1608*795d594fSAndroid Build Coastguard Worker   // Vector vfnmsub instructions, funct6 = 0b101011
1609*795d594fSAndroid Build Coastguard Worker   void VFnmsub_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1610*795d594fSAndroid Build Coastguard Worker   void VFnmsub_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1611*795d594fSAndroid Build Coastguard Worker 
1612*795d594fSAndroid Build Coastguard Worker   // Vector vfmacc instructions, funct6 = 0b101100
1613*795d594fSAndroid Build Coastguard Worker   void VFmacc_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1614*795d594fSAndroid Build Coastguard Worker   void VFmacc_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1615*795d594fSAndroid Build Coastguard Worker 
1616*795d594fSAndroid Build Coastguard Worker   // Vector vfnmacc instructions, funct6 = 0b101101
1617*795d594fSAndroid Build Coastguard Worker   void VFnmacc_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1618*795d594fSAndroid Build Coastguard Worker   void VFnmacc_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1619*795d594fSAndroid Build Coastguard Worker 
1620*795d594fSAndroid Build Coastguard Worker   // Vector vfmsac instructions, funct6 = 0b101110
1621*795d594fSAndroid Build Coastguard Worker   void VFmsac_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1622*795d594fSAndroid Build Coastguard Worker   void VFmsac_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1623*795d594fSAndroid Build Coastguard Worker 
1624*795d594fSAndroid Build Coastguard Worker   // Vector vfnmsac instructions, funct6 = 0b101111
1625*795d594fSAndroid Build Coastguard Worker   void VFnmsac_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1626*795d594fSAndroid Build Coastguard Worker   void VFnmsac_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1627*795d594fSAndroid Build Coastguard Worker 
1628*795d594fSAndroid Build Coastguard Worker   // Vector vfwadd instructions, funct6 = 0b110000
1629*795d594fSAndroid Build Coastguard Worker   void VFwadd_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1630*795d594fSAndroid Build Coastguard Worker   void VFwadd_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1631*795d594fSAndroid Build Coastguard Worker 
1632*795d594fSAndroid Build Coastguard Worker   // Vector vfwredusum instructions, funct6 = 0b110001
1633*795d594fSAndroid Build Coastguard Worker   void VFwredusum_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1634*795d594fSAndroid Build Coastguard Worker 
1635*795d594fSAndroid Build Coastguard Worker   // Vector vfwsub instructions, funct6 = 0b110010
1636*795d594fSAndroid Build Coastguard Worker   void VFwsub_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1637*795d594fSAndroid Build Coastguard Worker   void VFwsub_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1638*795d594fSAndroid Build Coastguard Worker 
1639*795d594fSAndroid Build Coastguard Worker   // Vector vfwredosum instructions, funct6 = 0b110011
1640*795d594fSAndroid Build Coastguard Worker   void VFwredosum_vs(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1641*795d594fSAndroid Build Coastguard Worker 
1642*795d594fSAndroid Build Coastguard Worker   // Vector vfwadd.w instructions, funct6 = 0b110100
1643*795d594fSAndroid Build Coastguard Worker   void VFwadd_wv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1644*795d594fSAndroid Build Coastguard Worker   void VFwadd_wf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1645*795d594fSAndroid Build Coastguard Worker 
1646*795d594fSAndroid Build Coastguard Worker   // Vector vfwsub.w instructions, funct6 = 0b110110
1647*795d594fSAndroid Build Coastguard Worker   void VFwsub_wv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1648*795d594fSAndroid Build Coastguard Worker   void VFwsub_wf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1649*795d594fSAndroid Build Coastguard Worker 
1650*795d594fSAndroid Build Coastguard Worker   // Vector vfwmul instructions, funct6 = 0b111000
1651*795d594fSAndroid Build Coastguard Worker   void VFwmul_vv(VRegister vd, VRegister vs2, VRegister vs1, VM vm = VM::kUnmasked);
1652*795d594fSAndroid Build Coastguard Worker   void VFwmul_vf(VRegister vd, VRegister vs2, FRegister fs1, VM vm = VM::kUnmasked);
1653*795d594fSAndroid Build Coastguard Worker 
1654*795d594fSAndroid Build Coastguard Worker   // Vector vfwmacc instructions, funct6 = 0b111100
1655*795d594fSAndroid Build Coastguard Worker   void VFwmacc_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1656*795d594fSAndroid Build Coastguard Worker   void VFwmacc_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1657*795d594fSAndroid Build Coastguard Worker 
1658*795d594fSAndroid Build Coastguard Worker   // Vector vfwnmacc instructions, funct6 = 0b111101
1659*795d594fSAndroid Build Coastguard Worker   void VFwnmacc_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1660*795d594fSAndroid Build Coastguard Worker   void VFwnmacc_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1661*795d594fSAndroid Build Coastguard Worker 
1662*795d594fSAndroid Build Coastguard Worker   // Vector vfwmsac instructions, funct6 = 0b111110
1663*795d594fSAndroid Build Coastguard Worker   void VFwmsac_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1664*795d594fSAndroid Build Coastguard Worker   void VFwmsac_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1665*795d594fSAndroid Build Coastguard Worker 
1666*795d594fSAndroid Build Coastguard Worker   // Vector vfwnmsac instructions, funct6 = 0b111111
1667*795d594fSAndroid Build Coastguard Worker   void VFwnmsac_vv(VRegister vd, VRegister vs1, VRegister vs2, VM vm = VM::kUnmasked);
1668*795d594fSAndroid Build Coastguard Worker   void VFwnmsac_vf(VRegister vd, FRegister fs1, VRegister vs2, VM vm = VM::kUnmasked);
1669*795d594fSAndroid Build Coastguard Worker 
1670*795d594fSAndroid Build Coastguard Worker   // Vector VRXUNARY0 kind instructions, funct6 = 0b010000
1671*795d594fSAndroid Build Coastguard Worker   void VMv_s_x(VRegister vd, XRegister rs1);
1672*795d594fSAndroid Build Coastguard Worker 
1673*795d594fSAndroid Build Coastguard Worker   // Vector VWXUNARY0 kind instructions, funct6 = 0b010000
1674*795d594fSAndroid Build Coastguard Worker   void VMv_x_s(XRegister rd, VRegister vs2);
1675*795d594fSAndroid Build Coastguard Worker   void VCpop_m(XRegister rd, VRegister vs2, VM vm = VM::kUnmasked);
1676*795d594fSAndroid Build Coastguard Worker   void VFirst_m(XRegister rd, VRegister vs2, VM vm = VM::kUnmasked);
1677*795d594fSAndroid Build Coastguard Worker 
1678*795d594fSAndroid Build Coastguard Worker   // Vector VXUNARY0 kind instructions, funct6 = 0b010010
1679*795d594fSAndroid Build Coastguard Worker   void VZext_vf8(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1680*795d594fSAndroid Build Coastguard Worker   void VSext_vf8(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1681*795d594fSAndroid Build Coastguard Worker   void VZext_vf4(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1682*795d594fSAndroid Build Coastguard Worker   void VSext_vf4(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1683*795d594fSAndroid Build Coastguard Worker   void VZext_vf2(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1684*795d594fSAndroid Build Coastguard Worker   void VSext_vf2(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1685*795d594fSAndroid Build Coastguard Worker 
1686*795d594fSAndroid Build Coastguard Worker   // Vector VRFUNARY0 kind instructions, funct6 = 0b010000
1687*795d594fSAndroid Build Coastguard Worker   void VFmv_s_f(VRegister vd, FRegister fs1);
1688*795d594fSAndroid Build Coastguard Worker 
1689*795d594fSAndroid Build Coastguard Worker   // Vector VWFUNARY0 kind instructions, funct6 = 0b010000
1690*795d594fSAndroid Build Coastguard Worker   void VFmv_f_s(FRegister fd, VRegister vs2);
1691*795d594fSAndroid Build Coastguard Worker 
1692*795d594fSAndroid Build Coastguard Worker   // Vector VFUNARY0 kind instructions, funct6 = 0b010010
1693*795d594fSAndroid Build Coastguard Worker   void VFcvt_xu_f_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1694*795d594fSAndroid Build Coastguard Worker   void VFcvt_x_f_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1695*795d594fSAndroid Build Coastguard Worker   void VFcvt_f_xu_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1696*795d594fSAndroid Build Coastguard Worker   void VFcvt_f_x_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1697*795d594fSAndroid Build Coastguard Worker   void VFcvt_rtz_xu_f_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1698*795d594fSAndroid Build Coastguard Worker   void VFcvt_rtz_x_f_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1699*795d594fSAndroid Build Coastguard Worker   void VFwcvt_xu_f_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1700*795d594fSAndroid Build Coastguard Worker   void VFwcvt_x_f_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1701*795d594fSAndroid Build Coastguard Worker   void VFwcvt_f_xu_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1702*795d594fSAndroid Build Coastguard Worker   void VFwcvt_f_x_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1703*795d594fSAndroid Build Coastguard Worker   void VFwcvt_f_f_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1704*795d594fSAndroid Build Coastguard Worker   void VFwcvt_rtz_xu_f_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1705*795d594fSAndroid Build Coastguard Worker   void VFwcvt_rtz_x_f_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1706*795d594fSAndroid Build Coastguard Worker   void VFncvt_xu_f_w(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1707*795d594fSAndroid Build Coastguard Worker   void VFncvt_x_f_w(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1708*795d594fSAndroid Build Coastguard Worker   void VFncvt_f_xu_w(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1709*795d594fSAndroid Build Coastguard Worker   void VFncvt_f_x_w(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1710*795d594fSAndroid Build Coastguard Worker   void VFncvt_f_f_w(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1711*795d594fSAndroid Build Coastguard Worker   void VFncvt_rod_f_f_w(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1712*795d594fSAndroid Build Coastguard Worker   void VFncvt_rtz_xu_f_w(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1713*795d594fSAndroid Build Coastguard Worker   void VFncvt_rtz_x_f_w(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1714*795d594fSAndroid Build Coastguard Worker 
1715*795d594fSAndroid Build Coastguard Worker   // Vector VFUNARY1 kind instructions, funct6 = 0b010011
1716*795d594fSAndroid Build Coastguard Worker   void VFsqrt_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1717*795d594fSAndroid Build Coastguard Worker   void VFrsqrt7_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1718*795d594fSAndroid Build Coastguard Worker   void VFrec7_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1719*795d594fSAndroid Build Coastguard Worker   void VFclass_v(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1720*795d594fSAndroid Build Coastguard Worker 
1721*795d594fSAndroid Build Coastguard Worker   // Vector VMUNARY0 kind instructions, funct6 = 0b010100
1722*795d594fSAndroid Build Coastguard Worker   void VMsbf_m(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1723*795d594fSAndroid Build Coastguard Worker   void VMsof_m(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1724*795d594fSAndroid Build Coastguard Worker   void VMsif_m(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1725*795d594fSAndroid Build Coastguard Worker   void VIota_m(VRegister vd, VRegister vs2, VM vm = VM::kUnmasked);
1726*795d594fSAndroid Build Coastguard Worker   void VId_v(VRegister vd, VM vm = VM::kUnmasked);
1727*795d594fSAndroid Build Coastguard Worker 
1728*795d594fSAndroid Build Coastguard Worker   ////////////////////////////// RISC-V Vector Instructions  END //////////////////////////////
1729*795d594fSAndroid Build Coastguard Worker 
1730*795d594fSAndroid Build Coastguard Worker   ////////////////////////////// RV64 MACRO Instructions  START ///////////////////////////////
1731*795d594fSAndroid Build Coastguard Worker   // These pseudo instructions are from "RISC-V Assembly Programmer's Manual".
1732*795d594fSAndroid Build Coastguard Worker 
1733*795d594fSAndroid Build Coastguard Worker   void Nop();
1734*795d594fSAndroid Build Coastguard Worker   void Li(XRegister rd, int64_t imm);
1735*795d594fSAndroid Build Coastguard Worker   void Mv(XRegister rd, XRegister rs);
1736*795d594fSAndroid Build Coastguard Worker   void Not(XRegister rd, XRegister rs);
1737*795d594fSAndroid Build Coastguard Worker   void Neg(XRegister rd, XRegister rs);
1738*795d594fSAndroid Build Coastguard Worker   void NegW(XRegister rd, XRegister rs);
1739*795d594fSAndroid Build Coastguard Worker   void SextB(XRegister rd, XRegister rs);
1740*795d594fSAndroid Build Coastguard Worker   void SextH(XRegister rd, XRegister rs);
1741*795d594fSAndroid Build Coastguard Worker   void SextW(XRegister rd, XRegister rs);
1742*795d594fSAndroid Build Coastguard Worker   void ZextB(XRegister rd, XRegister rs);
1743*795d594fSAndroid Build Coastguard Worker   void ZextH(XRegister rd, XRegister rs);
1744*795d594fSAndroid Build Coastguard Worker   void ZextW(XRegister rd, XRegister rs);
1745*795d594fSAndroid Build Coastguard Worker   void Seqz(XRegister rd, XRegister rs);
1746*795d594fSAndroid Build Coastguard Worker   void Snez(XRegister rd, XRegister rs);
1747*795d594fSAndroid Build Coastguard Worker   void Sltz(XRegister rd, XRegister rs);
1748*795d594fSAndroid Build Coastguard Worker   void Sgtz(XRegister rd, XRegister rs);
1749*795d594fSAndroid Build Coastguard Worker   void FMvS(FRegister rd, FRegister rs);
1750*795d594fSAndroid Build Coastguard Worker   void FAbsS(FRegister rd, FRegister rs);
1751*795d594fSAndroid Build Coastguard Worker   void FNegS(FRegister rd, FRegister rs);
1752*795d594fSAndroid Build Coastguard Worker   void FMvD(FRegister rd, FRegister rs);
1753*795d594fSAndroid Build Coastguard Worker   void FAbsD(FRegister rd, FRegister rs);
1754*795d594fSAndroid Build Coastguard Worker   void FNegD(FRegister rd, FRegister rs);
1755*795d594fSAndroid Build Coastguard Worker 
1756*795d594fSAndroid Build Coastguard Worker   // Branch pseudo instructions
1757*795d594fSAndroid Build Coastguard Worker   void Beqz(XRegister rs, int32_t offset);
1758*795d594fSAndroid Build Coastguard Worker   void Bnez(XRegister rs, int32_t offset);
1759*795d594fSAndroid Build Coastguard Worker   void Blez(XRegister rs, int32_t offset);
1760*795d594fSAndroid Build Coastguard Worker   void Bgez(XRegister rs, int32_t offset);
1761*795d594fSAndroid Build Coastguard Worker   void Bltz(XRegister rs, int32_t offset);
1762*795d594fSAndroid Build Coastguard Worker   void Bgtz(XRegister rs, int32_t offset);
1763*795d594fSAndroid Build Coastguard Worker   void Bgt(XRegister rs, XRegister rt, int32_t offset);
1764*795d594fSAndroid Build Coastguard Worker   void Ble(XRegister rs, XRegister rt, int32_t offset);
1765*795d594fSAndroid Build Coastguard Worker   void Bgtu(XRegister rs, XRegister rt, int32_t offset);
1766*795d594fSAndroid Build Coastguard Worker   void Bleu(XRegister rs, XRegister rt, int32_t offset);
1767*795d594fSAndroid Build Coastguard Worker 
1768*795d594fSAndroid Build Coastguard Worker   // Jump pseudo instructions
1769*795d594fSAndroid Build Coastguard Worker   void J(int32_t offset);
1770*795d594fSAndroid Build Coastguard Worker   void Jal(int32_t offset);
1771*795d594fSAndroid Build Coastguard Worker   void Jr(XRegister rs);
1772*795d594fSAndroid Build Coastguard Worker   void Jalr(XRegister rs);
1773*795d594fSAndroid Build Coastguard Worker   void Jalr(XRegister rd, XRegister rs);
1774*795d594fSAndroid Build Coastguard Worker   void Ret();
1775*795d594fSAndroid Build Coastguard Worker 
1776*795d594fSAndroid Build Coastguard Worker   // Pseudo instructions for accessing control and status registers
1777*795d594fSAndroid Build Coastguard Worker   void RdCycle(XRegister rd);
1778*795d594fSAndroid Build Coastguard Worker   void RdTime(XRegister rd);
1779*795d594fSAndroid Build Coastguard Worker   void RdInstret(XRegister rd);
1780*795d594fSAndroid Build Coastguard Worker   void Csrr(XRegister rd, uint32_t csr);
1781*795d594fSAndroid Build Coastguard Worker   void Csrw(uint32_t csr, XRegister rs);
1782*795d594fSAndroid Build Coastguard Worker   void Csrs(uint32_t csr, XRegister rs);
1783*795d594fSAndroid Build Coastguard Worker   void Csrc(uint32_t csr, XRegister rs);
1784*795d594fSAndroid Build Coastguard Worker   void Csrwi(uint32_t csr, uint32_t uimm5);
1785*795d594fSAndroid Build Coastguard Worker   void Csrsi(uint32_t csr, uint32_t uimm5);
1786*795d594fSAndroid Build Coastguard Worker   void Csrci(uint32_t csr, uint32_t uimm5);
1787*795d594fSAndroid Build Coastguard Worker 
1788*795d594fSAndroid Build Coastguard Worker   // Load/store macros for arbitrary 32-bit offsets.
1789*795d594fSAndroid Build Coastguard Worker   void Loadb(XRegister rd, XRegister rs1, int32_t offset);
1790*795d594fSAndroid Build Coastguard Worker   void Loadh(XRegister rd, XRegister rs1, int32_t offset);
1791*795d594fSAndroid Build Coastguard Worker   void Loadw(XRegister rd, XRegister rs1, int32_t offset);
1792*795d594fSAndroid Build Coastguard Worker   void Loadd(XRegister rd, XRegister rs1, int32_t offset);
1793*795d594fSAndroid Build Coastguard Worker   void Loadbu(XRegister rd, XRegister rs1, int32_t offset);
1794*795d594fSAndroid Build Coastguard Worker   void Loadhu(XRegister rd, XRegister rs1, int32_t offset);
1795*795d594fSAndroid Build Coastguard Worker   void Loadwu(XRegister rd, XRegister rs1, int32_t offset);
1796*795d594fSAndroid Build Coastguard Worker   void Storeb(XRegister rs2, XRegister rs1, int32_t offset);
1797*795d594fSAndroid Build Coastguard Worker   void Storeh(XRegister rs2, XRegister rs1, int32_t offset);
1798*795d594fSAndroid Build Coastguard Worker   void Storew(XRegister rs2, XRegister rs1, int32_t offset);
1799*795d594fSAndroid Build Coastguard Worker   void Stored(XRegister rs2, XRegister rs1, int32_t offset);
1800*795d594fSAndroid Build Coastguard Worker   void FLoadw(FRegister rd, XRegister rs1, int32_t offset);
1801*795d594fSAndroid Build Coastguard Worker   void FLoadd(FRegister rd, XRegister rs1, int32_t offset);
1802*795d594fSAndroid Build Coastguard Worker   void FStorew(FRegister rs2, XRegister rs1, int32_t offset);
1803*795d594fSAndroid Build Coastguard Worker   void FStored(FRegister rs2, XRegister rs1, int32_t offset);
1804*795d594fSAndroid Build Coastguard Worker 
1805*795d594fSAndroid Build Coastguard Worker   // Macros for loading constants.
1806*795d594fSAndroid Build Coastguard Worker   void LoadConst32(XRegister rd, int32_t value);
1807*795d594fSAndroid Build Coastguard Worker   void LoadConst64(XRegister rd, int64_t value);
1808*795d594fSAndroid Build Coastguard Worker 
1809*795d594fSAndroid Build Coastguard Worker   // Macros for adding constants.
1810*795d594fSAndroid Build Coastguard Worker   void AddConst32(XRegister rd, XRegister rs1, int32_t value);
1811*795d594fSAndroid Build Coastguard Worker   void AddConst64(XRegister rd, XRegister rs1, int64_t value);
1812*795d594fSAndroid Build Coastguard Worker 
1813*795d594fSAndroid Build Coastguard Worker   // Jumps and branches to a label.
1814*795d594fSAndroid Build Coastguard Worker   void Beqz(XRegister rs, Riscv64Label* label, bool is_bare = false);
1815*795d594fSAndroid Build Coastguard Worker   void Bnez(XRegister rs, Riscv64Label* label, bool is_bare = false);
1816*795d594fSAndroid Build Coastguard Worker   void Blez(XRegister rs, Riscv64Label* label, bool is_bare = false);
1817*795d594fSAndroid Build Coastguard Worker   void Bgez(XRegister rs, Riscv64Label* label, bool is_bare = false);
1818*795d594fSAndroid Build Coastguard Worker   void Bltz(XRegister rs, Riscv64Label* label, bool is_bare = false);
1819*795d594fSAndroid Build Coastguard Worker   void Bgtz(XRegister rs, Riscv64Label* label, bool is_bare = false);
1820*795d594fSAndroid Build Coastguard Worker   void Beq(XRegister rs, XRegister rt, Riscv64Label* label, bool is_bare = false);
1821*795d594fSAndroid Build Coastguard Worker   void Bne(XRegister rs, XRegister rt, Riscv64Label* label, bool is_bare = false);
1822*795d594fSAndroid Build Coastguard Worker   void Ble(XRegister rs, XRegister rt, Riscv64Label* label, bool is_bare = false);
1823*795d594fSAndroid Build Coastguard Worker   void Bge(XRegister rs, XRegister rt, Riscv64Label* label, bool is_bare = false);
1824*795d594fSAndroid Build Coastguard Worker   void Blt(XRegister rs, XRegister rt, Riscv64Label* label, bool is_bare = false);
1825*795d594fSAndroid Build Coastguard Worker   void Bgt(XRegister rs, XRegister rt, Riscv64Label* label, bool is_bare = false);
1826*795d594fSAndroid Build Coastguard Worker   void Bleu(XRegister rs, XRegister rt, Riscv64Label* label, bool is_bare = false);
1827*795d594fSAndroid Build Coastguard Worker   void Bgeu(XRegister rs, XRegister rt, Riscv64Label* label, bool is_bare = false);
1828*795d594fSAndroid Build Coastguard Worker   void Bltu(XRegister rs, XRegister rt, Riscv64Label* label, bool is_bare = false);
1829*795d594fSAndroid Build Coastguard Worker   void Bgtu(XRegister rs, XRegister rt, Riscv64Label* label, bool is_bare = false);
1830*795d594fSAndroid Build Coastguard Worker   void Jal(XRegister rd, Riscv64Label* label, bool is_bare = false);
1831*795d594fSAndroid Build Coastguard Worker   void J(Riscv64Label* label, bool is_bare = false);
1832*795d594fSAndroid Build Coastguard Worker   void Jal(Riscv64Label* label, bool is_bare = false);
1833*795d594fSAndroid Build Coastguard Worker 
1834*795d594fSAndroid Build Coastguard Worker   // Literal load.
1835*795d594fSAndroid Build Coastguard Worker   void Loadw(XRegister rd, Literal* literal);
1836*795d594fSAndroid Build Coastguard Worker   void Loadwu(XRegister rd, Literal* literal);
1837*795d594fSAndroid Build Coastguard Worker   void Loadd(XRegister rd, Literal* literal);
1838*795d594fSAndroid Build Coastguard Worker   void FLoadw(FRegister rd, Literal* literal);
1839*795d594fSAndroid Build Coastguard Worker   void FLoadd(FRegister rd, Literal* literal);
1840*795d594fSAndroid Build Coastguard Worker 
1841*795d594fSAndroid Build Coastguard Worker   // Illegal instruction that triggers SIGILL.
1842*795d594fSAndroid Build Coastguard Worker   void Unimp();
1843*795d594fSAndroid Build Coastguard Worker 
1844*795d594fSAndroid Build Coastguard Worker   /////////////////////////////// RV64 MACRO Instructions END ///////////////////////////////
1845*795d594fSAndroid Build Coastguard Worker 
Bind(Label * label)1846*795d594fSAndroid Build Coastguard Worker   void Bind(Label* label) override { Bind(down_cast<Riscv64Label*>(label)); }
1847*795d594fSAndroid Build Coastguard Worker 
Jump(Label * label)1848*795d594fSAndroid Build Coastguard Worker   void Jump([[maybe_unused]] Label* label) override {
1849*795d594fSAndroid Build Coastguard Worker     UNIMPLEMENTED(FATAL) << "Do not use Jump for RISCV64";
1850*795d594fSAndroid Build Coastguard Worker   }
1851*795d594fSAndroid Build Coastguard Worker 
Jump(Riscv64Label * label)1852*795d594fSAndroid Build Coastguard Worker   void Jump(Riscv64Label* label) {
1853*795d594fSAndroid Build Coastguard Worker     J(label);
1854*795d594fSAndroid Build Coastguard Worker   }
1855*795d594fSAndroid Build Coastguard Worker 
1856*795d594fSAndroid Build Coastguard Worker   void Bind(Riscv64Label* label);
1857*795d594fSAndroid Build Coastguard Worker 
1858*795d594fSAndroid Build Coastguard Worker   // Load label address using PC-relative loads.
1859*795d594fSAndroid Build Coastguard Worker   void LoadLabelAddress(XRegister rd, Riscv64Label* label);
1860*795d594fSAndroid Build Coastguard Worker 
1861*795d594fSAndroid Build Coastguard Worker   // Create a new literal with a given value.
1862*795d594fSAndroid Build Coastguard Worker   // NOTE:Use `Identity<>` to force the template parameter to be explicitly specified.
1863*795d594fSAndroid Build Coastguard Worker   template <typename T>
NewLiteral(typename Identity<T>::type value)1864*795d594fSAndroid Build Coastguard Worker   Literal* NewLiteral(typename Identity<T>::type value) {
1865*795d594fSAndroid Build Coastguard Worker     static_assert(std::is_integral<T>::value, "T must be an integral type.");
1866*795d594fSAndroid Build Coastguard Worker     return NewLiteral(sizeof(value), reinterpret_cast<const uint8_t*>(&value));
1867*795d594fSAndroid Build Coastguard Worker   }
1868*795d594fSAndroid Build Coastguard Worker 
1869*795d594fSAndroid Build Coastguard Worker   // Create a new literal with the given data.
1870*795d594fSAndroid Build Coastguard Worker   Literal* NewLiteral(size_t size, const uint8_t* data);
1871*795d594fSAndroid Build Coastguard Worker 
1872*795d594fSAndroid Build Coastguard Worker   // Create a jump table for the given labels that will be emitted when finalizing.
1873*795d594fSAndroid Build Coastguard Worker   // When the table is emitted, offsets will be relative to the location of the table.
1874*795d594fSAndroid Build Coastguard Worker   // The table location is determined by the location of its label (the label precedes
1875*795d594fSAndroid Build Coastguard Worker   // the table data) and should be loaded using LoadLabelAddress().
1876*795d594fSAndroid Build Coastguard Worker   JumpTable* CreateJumpTable(ArenaVector<Riscv64Label*>&& labels);
1877*795d594fSAndroid Build Coastguard Worker 
1878*795d594fSAndroid Build Coastguard Worker  public:
1879*795d594fSAndroid Build Coastguard Worker   // Emit slow paths queued during assembly, promote short branches to long if needed,
1880*795d594fSAndroid Build Coastguard Worker   // and emit branches.
1881*795d594fSAndroid Build Coastguard Worker   void FinalizeCode() override;
1882*795d594fSAndroid Build Coastguard Worker 
1883*795d594fSAndroid Build Coastguard Worker   template <typename Reg>
IsShortReg(Reg reg)1884*795d594fSAndroid Build Coastguard Worker   static inline bool IsShortReg(Reg reg) {
1885*795d594fSAndroid Build Coastguard Worker     static_assert(std::is_same_v<Reg, XRegister> || std::is_same_v<Reg, FRegister>);
1886*795d594fSAndroid Build Coastguard Worker     uint32_t uv = enum_cast<uint32_t>(reg) - 8u;
1887*795d594fSAndroid Build Coastguard Worker     return IsUint<3>(uv);
1888*795d594fSAndroid Build Coastguard Worker   }
1889*795d594fSAndroid Build Coastguard Worker 
1890*795d594fSAndroid Build Coastguard Worker   // Returns the current location of a label.
1891*795d594fSAndroid Build Coastguard Worker   //
1892*795d594fSAndroid Build Coastguard Worker   // This function must be used instead of `Riscv64Label::GetPosition()`
1893*795d594fSAndroid Build Coastguard Worker   // which returns assembler's internal data instead of an actual location.
1894*795d594fSAndroid Build Coastguard Worker   //
1895*795d594fSAndroid Build Coastguard Worker   // The location can change during branch fixup in `FinalizeCode()`. Before that,
1896*795d594fSAndroid Build Coastguard Worker   // the location is not final and therefore not very useful to external users,
1897*795d594fSAndroid Build Coastguard Worker   // so they should preferably retrieve the location only after `FinalizeCode()`.
1898*795d594fSAndroid Build Coastguard Worker   uint32_t GetLabelLocation(const Riscv64Label* label) const;
1899*795d594fSAndroid Build Coastguard Worker 
1900*795d594fSAndroid Build Coastguard Worker   // Get the final position of a label after local fixup based on the old position
1901*795d594fSAndroid Build Coastguard Worker   // recorded before FinalizeCode().
1902*795d594fSAndroid Build Coastguard Worker   uint32_t GetAdjustedPosition(uint32_t old_position);
1903*795d594fSAndroid Build Coastguard Worker 
1904*795d594fSAndroid Build Coastguard Worker  private:
ConvertExtensions(const Riscv64InstructionSetFeatures * instruction_set_features)1905*795d594fSAndroid Build Coastguard Worker   static uint32_t ConvertExtensions(
1906*795d594fSAndroid Build Coastguard Worker       const Riscv64InstructionSetFeatures* instruction_set_features) {
1907*795d594fSAndroid Build Coastguard Worker     // The `Riscv64InstructionSetFeatures` currently does not support "Zcb",
1908*795d594fSAndroid Build Coastguard Worker     // only the original "C" extension. For riscv64 that means "Zca" and "Zcd".
1909*795d594fSAndroid Build Coastguard Worker     constexpr Riscv64ExtensionMask kCompressedExtensionsMask =
1910*795d594fSAndroid Build Coastguard Worker         Riscv64ExtensionBit(Riscv64Extension::kZca) | Riscv64ExtensionBit(Riscv64Extension::kZcd);
1911*795d594fSAndroid Build Coastguard Worker     return
1912*795d594fSAndroid Build Coastguard Worker         (Riscv64ExtensionBit(Riscv64Extension::kLoadStore)) |
1913*795d594fSAndroid Build Coastguard Worker         (Riscv64ExtensionBit(Riscv64Extension::kZifencei)) |
1914*795d594fSAndroid Build Coastguard Worker         (Riscv64ExtensionBit(Riscv64Extension::kM)) |
1915*795d594fSAndroid Build Coastguard Worker         (Riscv64ExtensionBit(Riscv64Extension::kA)) |
1916*795d594fSAndroid Build Coastguard Worker         (Riscv64ExtensionBit(Riscv64Extension::kZicsr)) |
1917*795d594fSAndroid Build Coastguard Worker         (Riscv64ExtensionBit(Riscv64Extension::kF)) |
1918*795d594fSAndroid Build Coastguard Worker         (Riscv64ExtensionBit(Riscv64Extension::kD)) |
1919*795d594fSAndroid Build Coastguard Worker         (instruction_set_features->HasZba() ? Riscv64ExtensionBit(Riscv64Extension::kZba) : 0u) |
1920*795d594fSAndroid Build Coastguard Worker         (instruction_set_features->HasZbb() ? Riscv64ExtensionBit(Riscv64Extension::kZbb) : 0u) |
1921*795d594fSAndroid Build Coastguard Worker         (instruction_set_features->HasZbs() ? Riscv64ExtensionBit(Riscv64Extension::kZbs) : 0u) |
1922*795d594fSAndroid Build Coastguard Worker         (instruction_set_features->HasVector() ? Riscv64ExtensionBit(Riscv64Extension::kV) : 0u) |
1923*795d594fSAndroid Build Coastguard Worker         (instruction_set_features->HasCompressed() ? kCompressedExtensionsMask : 0u);
1924*795d594fSAndroid Build Coastguard Worker   }
1925*795d594fSAndroid Build Coastguard Worker 
AssertExtensionsEnabled(Riscv64Extension ext)1926*795d594fSAndroid Build Coastguard Worker   void AssertExtensionsEnabled(Riscv64Extension ext) {
1927*795d594fSAndroid Build Coastguard Worker     DCHECK(IsExtensionEnabled(ext))
1928*795d594fSAndroid Build Coastguard Worker         << "ext=" << enum_cast<>(ext) << " enabled=0x" << std::hex << enabled_extensions_;
1929*795d594fSAndroid Build Coastguard Worker   }
1930*795d594fSAndroid Build Coastguard Worker 
1931*795d594fSAndroid Build Coastguard Worker   template <typename... OtherExt>
AssertExtensionsEnabled(Riscv64Extension ext,OtherExt...other_ext)1932*795d594fSAndroid Build Coastguard Worker   void AssertExtensionsEnabled(Riscv64Extension ext, OtherExt... other_ext) {
1933*795d594fSAndroid Build Coastguard Worker     AssertExtensionsEnabled(ext);
1934*795d594fSAndroid Build Coastguard Worker     AssertExtensionsEnabled(other_ext...);
1935*795d594fSAndroid Build Coastguard Worker   }
1936*795d594fSAndroid Build Coastguard Worker 
1937*795d594fSAndroid Build Coastguard Worker   enum BranchCondition : uint8_t {
1938*795d594fSAndroid Build Coastguard Worker     kCondEQ,
1939*795d594fSAndroid Build Coastguard Worker     kCondNE,
1940*795d594fSAndroid Build Coastguard Worker     kCondLT,
1941*795d594fSAndroid Build Coastguard Worker     kCondGE,
1942*795d594fSAndroid Build Coastguard Worker     kCondLE,
1943*795d594fSAndroid Build Coastguard Worker     kCondGT,
1944*795d594fSAndroid Build Coastguard Worker     kCondLTU,
1945*795d594fSAndroid Build Coastguard Worker     kCondGEU,
1946*795d594fSAndroid Build Coastguard Worker     kCondLEU,
1947*795d594fSAndroid Build Coastguard Worker     kCondGTU,
1948*795d594fSAndroid Build Coastguard Worker     kUncond,
1949*795d594fSAndroid Build Coastguard Worker   };
1950*795d594fSAndroid Build Coastguard Worker 
1951*795d594fSAndroid Build Coastguard Worker   // Note that PC-relative literal loads are handled as pseudo branches because they need
1952*795d594fSAndroid Build Coastguard Worker   // to be emitted after branch relocation to use correct offsets.
1953*795d594fSAndroid Build Coastguard Worker   class Branch {
1954*795d594fSAndroid Build Coastguard Worker    public:
1955*795d594fSAndroid Build Coastguard Worker     enum Type : uint8_t {
1956*795d594fSAndroid Build Coastguard Worker       // Compressed branches (can be promoted to longer)
1957*795d594fSAndroid Build Coastguard Worker       kCondCBranch,
1958*795d594fSAndroid Build Coastguard Worker       kUncondCBranch,
1959*795d594fSAndroid Build Coastguard Worker       // Compressed branches (can't be promoted to longer)
1960*795d594fSAndroid Build Coastguard Worker       kBareCondCBranch,
1961*795d594fSAndroid Build Coastguard Worker       kBareUncondCBranch,
1962*795d594fSAndroid Build Coastguard Worker 
1963*795d594fSAndroid Build Coastguard Worker       // Short branches (can be promoted to longer).
1964*795d594fSAndroid Build Coastguard Worker       kCondBranch,
1965*795d594fSAndroid Build Coastguard Worker       kUncondBranch,
1966*795d594fSAndroid Build Coastguard Worker       kCall,
1967*795d594fSAndroid Build Coastguard Worker       // Short branches (can't be promoted to longer).
1968*795d594fSAndroid Build Coastguard Worker       kBareCondBranch,
1969*795d594fSAndroid Build Coastguard Worker       kBareUncondBranch,
1970*795d594fSAndroid Build Coastguard Worker       kBareCall,
1971*795d594fSAndroid Build Coastguard Worker 
1972*795d594fSAndroid Build Coastguard Worker       // Medium branches (can be promoted to long).
1973*795d594fSAndroid Build Coastguard Worker       // Compressed version
1974*795d594fSAndroid Build Coastguard Worker       kCondCBranch21,
1975*795d594fSAndroid Build Coastguard Worker       kCondBranch21,
1976*795d594fSAndroid Build Coastguard Worker 
1977*795d594fSAndroid Build Coastguard Worker       // Long branches.
1978*795d594fSAndroid Build Coastguard Worker       kLongCondCBranch,
1979*795d594fSAndroid Build Coastguard Worker       kLongCondBranch,
1980*795d594fSAndroid Build Coastguard Worker       kLongUncondBranch,
1981*795d594fSAndroid Build Coastguard Worker       kLongCall,
1982*795d594fSAndroid Build Coastguard Worker 
1983*795d594fSAndroid Build Coastguard Worker       // Label.
1984*795d594fSAndroid Build Coastguard Worker       kLabel,
1985*795d594fSAndroid Build Coastguard Worker 
1986*795d594fSAndroid Build Coastguard Worker       // Literals.
1987*795d594fSAndroid Build Coastguard Worker       kLiteral,
1988*795d594fSAndroid Build Coastguard Worker       kLiteralUnsigned,
1989*795d594fSAndroid Build Coastguard Worker       kLiteralLong,
1990*795d594fSAndroid Build Coastguard Worker       kLiteralFloat,
1991*795d594fSAndroid Build Coastguard Worker       kLiteralDouble,
1992*795d594fSAndroid Build Coastguard Worker     };
1993*795d594fSAndroid Build Coastguard Worker 
1994*795d594fSAndroid Build Coastguard Worker     // Bit sizes of offsets defined as enums to minimize chance of typos.
1995*795d594fSAndroid Build Coastguard Worker     enum OffsetBits {
1996*795d594fSAndroid Build Coastguard Worker       kOffset9 = 9,
1997*795d594fSAndroid Build Coastguard Worker       kOffset12 = 12,
1998*795d594fSAndroid Build Coastguard Worker       kOffset13 = 13,
1999*795d594fSAndroid Build Coastguard Worker       kOffset21 = 21,
2000*795d594fSAndroid Build Coastguard Worker       kOffset32 = 32,
2001*795d594fSAndroid Build Coastguard Worker     };
2002*795d594fSAndroid Build Coastguard Worker 
2003*795d594fSAndroid Build Coastguard Worker     static constexpr uint32_t kUnresolved = 0xffffffff;  // Unresolved target_
2004*795d594fSAndroid Build Coastguard Worker     static constexpr uint32_t kMaxBranchLength = 12;  // In bytes.
2005*795d594fSAndroid Build Coastguard Worker 
2006*795d594fSAndroid Build Coastguard Worker     struct BranchInfo {
2007*795d594fSAndroid Build Coastguard Worker       // Branch length in bytes.
2008*795d594fSAndroid Build Coastguard Worker       uint32_t length;
2009*795d594fSAndroid Build Coastguard Worker       // The offset in bytes of the PC used in the (only) PC-relative instruction from
2010*795d594fSAndroid Build Coastguard Worker       // the start of the branch sequence. RISC-V always uses the address of the PC-relative
2011*795d594fSAndroid Build Coastguard Worker       // instruction as the PC, so this is essentially the offset of that instruction.
2012*795d594fSAndroid Build Coastguard Worker       uint32_t pc_offset;
2013*795d594fSAndroid Build Coastguard Worker       // How large (in bits) a PC-relative offset can be for a given type of branch.
2014*795d594fSAndroid Build Coastguard Worker       OffsetBits offset_size;
2015*795d594fSAndroid Build Coastguard Worker     };
2016*795d594fSAndroid Build Coastguard Worker     static const BranchInfo branch_info_[/* Type */];
2017*795d594fSAndroid Build Coastguard Worker 
2018*795d594fSAndroid Build Coastguard Worker     // Unconditional branch or call.
2019*795d594fSAndroid Build Coastguard Worker     Branch(
2020*795d594fSAndroid Build Coastguard Worker         uint32_t location, uint32_t target, XRegister rd, bool is_bare, bool compression_allowed);
2021*795d594fSAndroid Build Coastguard Worker     // Conditional branch.
2022*795d594fSAndroid Build Coastguard Worker     Branch(uint32_t location,
2023*795d594fSAndroid Build Coastguard Worker            uint32_t target,
2024*795d594fSAndroid Build Coastguard Worker            BranchCondition condition,
2025*795d594fSAndroid Build Coastguard Worker            XRegister lhs_reg,
2026*795d594fSAndroid Build Coastguard Worker            XRegister rhs_reg,
2027*795d594fSAndroid Build Coastguard Worker            bool is_bare,
2028*795d594fSAndroid Build Coastguard Worker            bool compression_allowed);
2029*795d594fSAndroid Build Coastguard Worker     // Label address or literal.
2030*795d594fSAndroid Build Coastguard Worker     Branch(uint32_t location, uint32_t target, XRegister rd, Type label_or_literal_type);
2031*795d594fSAndroid Build Coastguard Worker     Branch(uint32_t location, uint32_t target, FRegister rd, Type literal_type);
2032*795d594fSAndroid Build Coastguard Worker 
2033*795d594fSAndroid Build Coastguard Worker     // Some conditional branches with lhs = rhs are effectively NOPs, while some
2034*795d594fSAndroid Build Coastguard Worker     // others are effectively unconditional.
2035*795d594fSAndroid Build Coastguard Worker     static bool IsNop(BranchCondition condition, XRegister lhs, XRegister rhs);
2036*795d594fSAndroid Build Coastguard Worker     static bool IsUncond(BranchCondition condition, XRegister lhs, XRegister rhs);
2037*795d594fSAndroid Build Coastguard Worker     static bool IsCompressed(Type type);
2038*795d594fSAndroid Build Coastguard Worker 
2039*795d594fSAndroid Build Coastguard Worker     static BranchCondition OppositeCondition(BranchCondition cond);
2040*795d594fSAndroid Build Coastguard Worker 
2041*795d594fSAndroid Build Coastguard Worker     Type GetType() const;
2042*795d594fSAndroid Build Coastguard Worker     Type GetOldType() const;
2043*795d594fSAndroid Build Coastguard Worker     BranchCondition GetCondition() const;
2044*795d594fSAndroid Build Coastguard Worker     XRegister GetLeftRegister() const;
2045*795d594fSAndroid Build Coastguard Worker     XRegister GetRightRegister() const;
2046*795d594fSAndroid Build Coastguard Worker     XRegister GetNonZeroRegister() const;
2047*795d594fSAndroid Build Coastguard Worker     FRegister GetFRegister() const;
2048*795d594fSAndroid Build Coastguard Worker     uint32_t GetTarget() const;
2049*795d594fSAndroid Build Coastguard Worker     uint32_t GetLocation() const;
2050*795d594fSAndroid Build Coastguard Worker     uint32_t GetOldLocation() const;
2051*795d594fSAndroid Build Coastguard Worker     uint32_t GetLength() const;
2052*795d594fSAndroid Build Coastguard Worker     uint32_t GetOldLength() const;
2053*795d594fSAndroid Build Coastguard Worker     uint32_t GetEndLocation() const;
2054*795d594fSAndroid Build Coastguard Worker     uint32_t GetOldEndLocation() const;
2055*795d594fSAndroid Build Coastguard Worker     bool IsBare() const;
2056*795d594fSAndroid Build Coastguard Worker     bool IsResolved() const;
2057*795d594fSAndroid Build Coastguard Worker 
2058*795d594fSAndroid Build Coastguard Worker     uint32_t NextBranchId() const;
2059*795d594fSAndroid Build Coastguard Worker 
2060*795d594fSAndroid Build Coastguard Worker     // Checks if condition meets compression requirements
2061*795d594fSAndroid Build Coastguard Worker     bool IsCompressableCondition() const;
2062*795d594fSAndroid Build Coastguard Worker 
2063*795d594fSAndroid Build Coastguard Worker     // Returns the bit size of the signed offset that the branch instruction can handle.
2064*795d594fSAndroid Build Coastguard Worker     OffsetBits GetOffsetSize() const;
2065*795d594fSAndroid Build Coastguard Worker 
2066*795d594fSAndroid Build Coastguard Worker     // Calculates the distance between two byte locations in the assembler buffer and
2067*795d594fSAndroid Build Coastguard Worker     // returns the number of bits needed to represent the distance as a signed integer.
2068*795d594fSAndroid Build Coastguard Worker     static OffsetBits GetOffsetSizeNeeded(uint32_t location, uint32_t target);
2069*795d594fSAndroid Build Coastguard Worker 
2070*795d594fSAndroid Build Coastguard Worker     // Resolve a branch when the target is known.
2071*795d594fSAndroid Build Coastguard Worker     void Resolve(uint32_t target);
2072*795d594fSAndroid Build Coastguard Worker 
2073*795d594fSAndroid Build Coastguard Worker     // Relocate a branch by a given delta if needed due to expansion of this or another
2074*795d594fSAndroid Build Coastguard Worker     // branch at a given location by this delta (just changes location_ and target_).
2075*795d594fSAndroid Build Coastguard Worker     void Relocate(uint32_t expand_location, uint32_t delta);
2076*795d594fSAndroid Build Coastguard Worker 
2077*795d594fSAndroid Build Coastguard Worker     // If necessary, updates the type by promoting a short branch to a longer branch
2078*795d594fSAndroid Build Coastguard Worker     // based on the branch location and target. Returns the amount (in bytes) by
2079*795d594fSAndroid Build Coastguard Worker     // which the branch size has increased.
2080*795d594fSAndroid Build Coastguard Worker     uint32_t PromoteIfNeeded();
2081*795d594fSAndroid Build Coastguard Worker 
2082*795d594fSAndroid Build Coastguard Worker     // Returns the offset into assembler buffer that shall be used as the base PC for
2083*795d594fSAndroid Build Coastguard Worker     // offset calculation. RISC-V always uses the address of the PC-relative instruction
2084*795d594fSAndroid Build Coastguard Worker     // as the PC, so this is essentially the location of that instruction.
2085*795d594fSAndroid Build Coastguard Worker     uint32_t GetOffsetLocation() const;
2086*795d594fSAndroid Build Coastguard Worker 
2087*795d594fSAndroid Build Coastguard Worker     // Calculates and returns the offset ready for encoding in the branch instruction(s).
2088*795d594fSAndroid Build Coastguard Worker     int32_t GetOffset() const;
2089*795d594fSAndroid Build Coastguard Worker 
2090*795d594fSAndroid Build Coastguard Worker     // Link with the next branch
2091*795d594fSAndroid Build Coastguard Worker     void LinkToList(uint32_t next_branch_id);
2092*795d594fSAndroid Build Coastguard Worker 
2093*795d594fSAndroid Build Coastguard Worker    private:
2094*795d594fSAndroid Build Coastguard Worker     // Completes branch construction by determining and recording its type.
2095*795d594fSAndroid Build Coastguard Worker     void InitializeType(Type initial_type);
2096*795d594fSAndroid Build Coastguard Worker     // Helper for the above.
2097*795d594fSAndroid Build Coastguard Worker     void InitShortOrLong(OffsetBits ofs_size, std::initializer_list<Type> types);
2098*795d594fSAndroid Build Coastguard Worker 
2099*795d594fSAndroid Build Coastguard Worker     uint32_t old_location_;  // Offset into assembler buffer in bytes.
2100*795d594fSAndroid Build Coastguard Worker     uint32_t location_;      // Offset into assembler buffer in bytes.
2101*795d594fSAndroid Build Coastguard Worker     uint32_t target_;        // Offset into assembler buffer in bytes.
2102*795d594fSAndroid Build Coastguard Worker 
2103*795d594fSAndroid Build Coastguard Worker     XRegister lhs_reg_;          // Left-hand side register in conditional branches or
2104*795d594fSAndroid Build Coastguard Worker                                  // destination register in calls or literals.
2105*795d594fSAndroid Build Coastguard Worker     XRegister rhs_reg_;          // Right-hand side register in conditional branches.
2106*795d594fSAndroid Build Coastguard Worker     FRegister freg_;             // Destination register in FP literals.
2107*795d594fSAndroid Build Coastguard Worker     BranchCondition condition_;  // Condition for conditional branches.
2108*795d594fSAndroid Build Coastguard Worker 
2109*795d594fSAndroid Build Coastguard Worker     Type type_;      // Current type of the branch.
2110*795d594fSAndroid Build Coastguard Worker     Type old_type_;  // Initial type of the branch.
2111*795d594fSAndroid Build Coastguard Worker 
2112*795d594fSAndroid Build Coastguard Worker     bool compression_allowed_;
2113*795d594fSAndroid Build Coastguard Worker 
2114*795d594fSAndroid Build Coastguard Worker     // Id of the next branch bound to the same label in singly-linked zero-terminated list
2115*795d594fSAndroid Build Coastguard Worker     // NOTE: encoded the same way as a position in a linked Label (id + sizeof(void*))
2116*795d594fSAndroid Build Coastguard Worker     // Label itself is used to hold the 'head' of this list
2117*795d594fSAndroid Build Coastguard Worker     uint32_t next_branch_id_;
2118*795d594fSAndroid Build Coastguard Worker   };
2119*795d594fSAndroid Build Coastguard Worker 
2120*795d594fSAndroid Build Coastguard Worker   // Branch and literal fixup.
2121*795d594fSAndroid Build Coastguard Worker 
2122*795d594fSAndroid Build Coastguard Worker   void EmitBcond(BranchCondition cond, XRegister rs, XRegister rt, int32_t offset);
2123*795d594fSAndroid Build Coastguard Worker   void EmitBranch(Branch* branch);
2124*795d594fSAndroid Build Coastguard Worker   void EmitBranches();
2125*795d594fSAndroid Build Coastguard Worker   void EmitJumpTables();
2126*795d594fSAndroid Build Coastguard Worker   void EmitLiterals();
2127*795d594fSAndroid Build Coastguard Worker 
2128*795d594fSAndroid Build Coastguard Worker   void FinalizeLabeledBranch(Riscv64Label* label);
2129*795d594fSAndroid Build Coastguard Worker   void Bcond(Riscv64Label* label,
2130*795d594fSAndroid Build Coastguard Worker              bool is_bare,
2131*795d594fSAndroid Build Coastguard Worker              BranchCondition condition,
2132*795d594fSAndroid Build Coastguard Worker              XRegister lhs,
2133*795d594fSAndroid Build Coastguard Worker              XRegister rhs);
2134*795d594fSAndroid Build Coastguard Worker   void Buncond(Riscv64Label* label, XRegister rd, bool is_bare);
2135*795d594fSAndroid Build Coastguard Worker   template <typename XRegisterOrFRegister>
2136*795d594fSAndroid Build Coastguard Worker   void LoadLiteral(Literal* literal, XRegisterOrFRegister rd, Branch::Type literal_type);
2137*795d594fSAndroid Build Coastguard Worker 
2138*795d594fSAndroid Build Coastguard Worker   Branch* GetBranch(uint32_t branch_id);
2139*795d594fSAndroid Build Coastguard Worker   const Branch* GetBranch(uint32_t branch_id) const;
2140*795d594fSAndroid Build Coastguard Worker 
2141*795d594fSAndroid Build Coastguard Worker   void ReserveJumpTableSpace();
2142*795d594fSAndroid Build Coastguard Worker   void PromoteBranches();
2143*795d594fSAndroid Build Coastguard Worker   void PatchCFI();
2144*795d594fSAndroid Build Coastguard Worker 
2145*795d594fSAndroid Build Coastguard Worker   // Emit data (e.g. encoded instruction or immediate) to the instruction stream.
2146*795d594fSAndroid Build Coastguard Worker   template <typename T>
Emit(T value)2147*795d594fSAndroid Build Coastguard Worker   void Emit(T value) {
2148*795d594fSAndroid Build Coastguard Worker     static_assert(std::is_same_v<T, uint32_t> || std::is_same_v<T, uint16_t>,
2149*795d594fSAndroid Build Coastguard Worker                   "Only Integer types are allowed");
2150*795d594fSAndroid Build Coastguard Worker     if (overwriting_) {
2151*795d594fSAndroid Build Coastguard Worker       // Branches to labels are emitted into their placeholders here.
2152*795d594fSAndroid Build Coastguard Worker       buffer_.Store<T>(overwrite_location_, value);
2153*795d594fSAndroid Build Coastguard Worker       overwrite_location_ += sizeof(T);
2154*795d594fSAndroid Build Coastguard Worker     } else {
2155*795d594fSAndroid Build Coastguard Worker       // Other instructions are simply appended at the end here.
2156*795d594fSAndroid Build Coastguard Worker       AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2157*795d594fSAndroid Build Coastguard Worker       buffer_.Emit<T>(value);
2158*795d594fSAndroid Build Coastguard Worker     }
2159*795d594fSAndroid Build Coastguard Worker   }
2160*795d594fSAndroid Build Coastguard Worker 
Emit16(uint32_t value)2161*795d594fSAndroid Build Coastguard Worker   void Emit16(uint32_t value) { Emit(dchecked_integral_cast<uint16_t>(value)); }
Emit32(uint32_t value)2162*795d594fSAndroid Build Coastguard Worker   void Emit32(uint32_t value) { Emit(value); }
2163*795d594fSAndroid Build Coastguard Worker 
2164*795d594fSAndroid Build Coastguard Worker   // Adjust base register and offset if needed for load/store with a large offset.
2165*795d594fSAndroid Build Coastguard Worker   void AdjustBaseAndOffset(XRegister& base, int32_t& offset, ScratchRegisterScope& srs);
2166*795d594fSAndroid Build Coastguard Worker 
2167*795d594fSAndroid Build Coastguard Worker   // Helper templates for loads/stores with 32-bit offsets.
2168*795d594fSAndroid Build Coastguard Worker   template <void (Riscv64Assembler::*insn)(XRegister, XRegister, int32_t)>
2169*795d594fSAndroid Build Coastguard Worker   void LoadFromOffset(XRegister rd, XRegister rs1, int32_t offset);
2170*795d594fSAndroid Build Coastguard Worker   template <void (Riscv64Assembler::*insn)(XRegister, XRegister, int32_t)>
2171*795d594fSAndroid Build Coastguard Worker   void StoreToOffset(XRegister rs2, XRegister rs1, int32_t offset);
2172*795d594fSAndroid Build Coastguard Worker   template <void (Riscv64Assembler::*insn)(FRegister, XRegister, int32_t)>
2173*795d594fSAndroid Build Coastguard Worker   void FLoadFromOffset(FRegister rd, XRegister rs1, int32_t offset);
2174*795d594fSAndroid Build Coastguard Worker   template <void (Riscv64Assembler::*insn)(FRegister, XRegister, int32_t)>
2175*795d594fSAndroid Build Coastguard Worker   void FStoreToOffset(FRegister rs2, XRegister rs1, int32_t offset);
2176*795d594fSAndroid Build Coastguard Worker 
2177*795d594fSAndroid Build Coastguard Worker   // Implementation helper for `Li()`, `LoadConst32()` and `LoadConst64()`.
2178*795d594fSAndroid Build Coastguard Worker   void LoadImmediate(XRegister rd, int64_t imm, bool can_use_tmp);
2179*795d594fSAndroid Build Coastguard Worker 
2180*795d594fSAndroid Build Coastguard Worker   // RVV constants and helpers
2181*795d594fSAndroid Build Coastguard Worker 
2182*795d594fSAndroid Build Coastguard Worker   enum class Nf : uint32_t {
2183*795d594fSAndroid Build Coastguard Worker     k1 = 0b000,
2184*795d594fSAndroid Build Coastguard Worker     k2 = 0b001,
2185*795d594fSAndroid Build Coastguard Worker     k3 = 0b010,
2186*795d594fSAndroid Build Coastguard Worker     k4 = 0b011,
2187*795d594fSAndroid Build Coastguard Worker     k5 = 0b100,
2188*795d594fSAndroid Build Coastguard Worker     k6 = 0b101,
2189*795d594fSAndroid Build Coastguard Worker     k7 = 0b110,
2190*795d594fSAndroid Build Coastguard Worker     k8 = 0b111,
2191*795d594fSAndroid Build Coastguard Worker   };
2192*795d594fSAndroid Build Coastguard Worker 
2193*795d594fSAndroid Build Coastguard Worker   enum class VAIEncoding : uint32_t {
2194*795d594fSAndroid Build Coastguard Worker                      // ----Operands---- | Type of Scalar                | Instruction type
2195*795d594fSAndroid Build Coastguard Worker     kOPIVV = 0b000,  // vector-vector    | --                            | R-type
2196*795d594fSAndroid Build Coastguard Worker     kOPFVV = 0b001,  // vector-vector    | --                            | R-type
2197*795d594fSAndroid Build Coastguard Worker     kOPMVV = 0b010,  // vector-vector    | --                            | R-type
2198*795d594fSAndroid Build Coastguard Worker     kOPIVI = 0b011,  // vector-immediate | imm[4:0]                      | R-type
2199*795d594fSAndroid Build Coastguard Worker     kOPIVX = 0b100,  // vector-scalar    | GPR x register rs1            | R-type
2200*795d594fSAndroid Build Coastguard Worker     kOPFVF = 0b101,  // vector-scalar    | FP f register rs1             | R-type
2201*795d594fSAndroid Build Coastguard Worker     kOPMVX = 0b110,  // vector-scalar    | GPR x register rs1            | R-type
2202*795d594fSAndroid Build Coastguard Worker     kOPCFG = 0b111,  // scalars-imms     | GPR x register rs1 & rs2/imm  | R/I-type
2203*795d594fSAndroid Build Coastguard Worker   };
2204*795d594fSAndroid Build Coastguard Worker 
2205*795d594fSAndroid Build Coastguard Worker   enum class MemAddressMode : uint32_t {
2206*795d594fSAndroid Build Coastguard Worker     kUnitStride = 0b00,
2207*795d594fSAndroid Build Coastguard Worker     kIndexedUnordered = 0b01,
2208*795d594fSAndroid Build Coastguard Worker     kStrided = 0b10,
2209*795d594fSAndroid Build Coastguard Worker     kIndexedOrdered = 0b11,
2210*795d594fSAndroid Build Coastguard Worker   };
2211*795d594fSAndroid Build Coastguard Worker 
2212*795d594fSAndroid Build Coastguard Worker   enum class VectorWidth : uint32_t {
2213*795d594fSAndroid Build Coastguard Worker     k8 = 0b000,
2214*795d594fSAndroid Build Coastguard Worker     k16 = 0b101,
2215*795d594fSAndroid Build Coastguard Worker     k32 = 0b110,
2216*795d594fSAndroid Build Coastguard Worker     k64 = 0b111,
2217*795d594fSAndroid Build Coastguard Worker 
2218*795d594fSAndroid Build Coastguard Worker     kMask = 0b000,
2219*795d594fSAndroid Build Coastguard Worker     kWholeR = 0b000,
2220*795d594fSAndroid Build Coastguard Worker   };
2221*795d594fSAndroid Build Coastguard Worker 
EncodeRVVMemF7(const Nf nf,const uint32_t mew,const MemAddressMode mop,const VM vm)2222*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t EncodeRVVMemF7(const Nf nf,
2223*795d594fSAndroid Build Coastguard Worker                                            const uint32_t mew,
2224*795d594fSAndroid Build Coastguard Worker                                            const MemAddressMode mop,
2225*795d594fSAndroid Build Coastguard Worker                                            const VM vm) {
2226*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(enum_cast<uint32_t>(nf)));
2227*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<1>(mew));
2228*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(enum_cast<uint32_t>(mop)));
2229*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<1>(enum_cast<uint32_t>(vm)));
2230*795d594fSAndroid Build Coastguard Worker 
2231*795d594fSAndroid Build Coastguard Worker     return enum_cast<uint32_t>(nf) << 4 | mew << 3 | enum_cast<uint32_t>(mop) << 1 |
2232*795d594fSAndroid Build Coastguard Worker            enum_cast<uint32_t>(vm);
2233*795d594fSAndroid Build Coastguard Worker   }
2234*795d594fSAndroid Build Coastguard Worker 
EncodeRVVF7(const uint32_t funct6,const VM vm)2235*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t EncodeRVVF7(const uint32_t funct6, const VM vm) {
2236*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<6>(funct6));
2237*795d594fSAndroid Build Coastguard Worker     return funct6 << 1 | enum_cast<uint32_t>(vm);
2238*795d594fSAndroid Build Coastguard Worker   }
2239*795d594fSAndroid Build Coastguard Worker 
2240*795d594fSAndroid Build Coastguard Worker   template <unsigned kWidth>
EncodeIntWidth(const int32_t imm)2241*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t EncodeIntWidth(const int32_t imm) {
2242*795d594fSAndroid Build Coastguard Worker     DCHECK(IsInt<kWidth>(imm));
2243*795d594fSAndroid Build Coastguard Worker     return static_cast<uint32_t>(imm) & MaskLeastSignificant<uint32_t>(kWidth);
2244*795d594fSAndroid Build Coastguard Worker   }
2245*795d594fSAndroid Build Coastguard Worker 
EncodeInt5(const int32_t imm)2246*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t EncodeInt5(const int32_t imm) { return EncodeIntWidth<5>(imm); }
EncodeInt6(const int32_t imm)2247*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t EncodeInt6(const int32_t imm) { return EncodeIntWidth<6>(imm); }
2248*795d594fSAndroid Build Coastguard Worker 
2249*795d594fSAndroid Build Coastguard Worker   template <typename Reg>
EncodeShortReg(const Reg reg)2250*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t EncodeShortReg(const Reg reg) {
2251*795d594fSAndroid Build Coastguard Worker     DCHECK(IsShortReg(reg));
2252*795d594fSAndroid Build Coastguard Worker     return enum_cast<uint32_t>(reg) - 8u;
2253*795d594fSAndroid Build Coastguard Worker   }
2254*795d594fSAndroid Build Coastguard Worker 
2255*795d594fSAndroid Build Coastguard Worker   // Rearrange given offset in the way {offset[0] | offset[1]}
EncodeOffset0_1(int32_t offset)2256*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t EncodeOffset0_1(int32_t offset) {
2257*795d594fSAndroid Build Coastguard Worker     uint32_t u_offset = static_cast<uint32_t>(offset);
2258*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(u_offset));
2259*795d594fSAndroid Build Coastguard Worker 
2260*795d594fSAndroid Build Coastguard Worker     return u_offset >> 1 | (u_offset & 1u) << 1;
2261*795d594fSAndroid Build Coastguard Worker   }
2262*795d594fSAndroid Build Coastguard Worker 
2263*795d594fSAndroid Build Coastguard Worker   // Rearrange given offset, scaled by 4, in the way {offset[5:2] | offset[7:6]}
ExtractOffset52_76(int32_t offset)2264*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t ExtractOffset52_76(int32_t offset) {
2265*795d594fSAndroid Build Coastguard Worker     DCHECK(IsAligned<4>(offset)) << "Offset should be scalable by 4";
2266*795d594fSAndroid Build Coastguard Worker 
2267*795d594fSAndroid Build Coastguard Worker     uint32_t u_offset = static_cast<uint32_t>(offset);
2268*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<6 + 2>(u_offset));
2269*795d594fSAndroid Build Coastguard Worker 
2270*795d594fSAndroid Build Coastguard Worker     uint32_t imm_52 = BitFieldExtract(u_offset, 2, 4);
2271*795d594fSAndroid Build Coastguard Worker     uint32_t imm_76 = BitFieldExtract(u_offset, 6, 2);
2272*795d594fSAndroid Build Coastguard Worker 
2273*795d594fSAndroid Build Coastguard Worker     return BitFieldInsert(imm_76, imm_52, 2, 4);
2274*795d594fSAndroid Build Coastguard Worker   }
2275*795d594fSAndroid Build Coastguard Worker 
2276*795d594fSAndroid Build Coastguard Worker   // Rearrange given offset, scaled by 8, in the way {offset[5:3] | offset[8:6]}
ExtractOffset53_86(int32_t offset)2277*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t ExtractOffset53_86(int32_t offset) {
2278*795d594fSAndroid Build Coastguard Worker     DCHECK(IsAligned<8>(offset)) << "Offset should be scalable by 8";
2279*795d594fSAndroid Build Coastguard Worker 
2280*795d594fSAndroid Build Coastguard Worker     uint32_t u_offset = static_cast<uint32_t>(offset);
2281*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<6 + 3>(u_offset));
2282*795d594fSAndroid Build Coastguard Worker 
2283*795d594fSAndroid Build Coastguard Worker     uint32_t imm_53 = BitFieldExtract(u_offset, 3, 3);
2284*795d594fSAndroid Build Coastguard Worker     uint32_t imm_86 = BitFieldExtract(u_offset, 6, 3);
2285*795d594fSAndroid Build Coastguard Worker 
2286*795d594fSAndroid Build Coastguard Worker     return BitFieldInsert(imm_86, imm_53, 3, 3);
2287*795d594fSAndroid Build Coastguard Worker   }
2288*795d594fSAndroid Build Coastguard Worker 
2289*795d594fSAndroid Build Coastguard Worker   // Rearrange given offset, scaled by 4, in the way {offset[5:2] | offset[6]}
ExtractOffset52_6(int32_t offset)2290*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t ExtractOffset52_6(int32_t offset) {
2291*795d594fSAndroid Build Coastguard Worker     DCHECK(IsAligned<4>(offset)) << "Offset should be scalable by 4";
2292*795d594fSAndroid Build Coastguard Worker 
2293*795d594fSAndroid Build Coastguard Worker     uint32_t u_offset = static_cast<uint32_t>(offset);
2294*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5 + 2>(u_offset));
2295*795d594fSAndroid Build Coastguard Worker 
2296*795d594fSAndroid Build Coastguard Worker     uint32_t imm_52 = BitFieldExtract(u_offset, 2, 4);
2297*795d594fSAndroid Build Coastguard Worker     uint32_t imm_6  = BitFieldExtract(u_offset, 6, 1);
2298*795d594fSAndroid Build Coastguard Worker 
2299*795d594fSAndroid Build Coastguard Worker     return BitFieldInsert(imm_6, imm_52, 1, 4);
2300*795d594fSAndroid Build Coastguard Worker   }
2301*795d594fSAndroid Build Coastguard Worker 
2302*795d594fSAndroid Build Coastguard Worker   // Rearrange given offset, scaled by 8, in the way {offset[5:3], offset[7:6]}
ExtractOffset53_76(int32_t offset)2303*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t ExtractOffset53_76(int32_t offset) {
2304*795d594fSAndroid Build Coastguard Worker     DCHECK(IsAligned<8>(offset)) << "Offset should be scalable by 4";
2305*795d594fSAndroid Build Coastguard Worker 
2306*795d594fSAndroid Build Coastguard Worker     uint32_t u_offset = static_cast<uint32_t>(offset);
2307*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5 + 3>(u_offset));
2308*795d594fSAndroid Build Coastguard Worker 
2309*795d594fSAndroid Build Coastguard Worker     uint32_t imm_53 = BitFieldExtract(u_offset, 3, 3);
2310*795d594fSAndroid Build Coastguard Worker     uint32_t imm_76 = BitFieldExtract(u_offset, 6, 2);
2311*795d594fSAndroid Build Coastguard Worker 
2312*795d594fSAndroid Build Coastguard Worker     return BitFieldInsert(imm_76, imm_53, 2, 3);
2313*795d594fSAndroid Build Coastguard Worker   }
2314*795d594fSAndroid Build Coastguard Worker 
IsImmCLuiEncodable(uint32_t uimm)2315*795d594fSAndroid Build Coastguard Worker   static constexpr bool IsImmCLuiEncodable(uint32_t uimm) {
2316*795d594fSAndroid Build Coastguard Worker     // Instruction c.lui is odd and its immediate value is a bit tricky
2317*795d594fSAndroid Build Coastguard Worker     // Its value is not a full 32 bits value, but its bits [31:12]
2318*795d594fSAndroid Build Coastguard Worker     // (where the bit 17 marks the sign bit) shifted towards the bottom i.e. bits [19:0]
2319*795d594fSAndroid Build Coastguard Worker     // are the meaningful ones. Since that we want a signed non-zero 6-bit immediate to
2320*795d594fSAndroid Build Coastguard Worker     // keep values in the range [0, 0x1f], and the range [0xfffe0, 0xfffff] for negative values
2321*795d594fSAndroid Build Coastguard Worker     // since the sign bit was bit 17 (which is now bit 5 and replicated in the higher bits too)
2322*795d594fSAndroid Build Coastguard Worker     // Also encoding with immediate = 0 is reserved
2323*795d594fSAndroid Build Coastguard Worker     // For more details please see 16.5 chapter is the specification
2324*795d594fSAndroid Build Coastguard Worker 
2325*795d594fSAndroid Build Coastguard Worker     return uimm != 0u && (IsUint<5>(uimm) || IsUint<5>(uimm - 0xfffe0u));
2326*795d594fSAndroid Build Coastguard Worker   }
2327*795d594fSAndroid Build Coastguard Worker 
2328*795d594fSAndroid Build Coastguard Worker   // Emit helpers.
2329*795d594fSAndroid Build Coastguard Worker 
2330*795d594fSAndroid Build Coastguard Worker   // I-type instruction:
2331*795d594fSAndroid Build Coastguard Worker   //
2332*795d594fSAndroid Build Coastguard Worker   //    31                   20 19     15 14 12 11      7 6           0
2333*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2334*795d594fSAndroid Build Coastguard Worker   //   [ . . . . . . . . . . . | . . . . | . . | . . . . | . . . . . . ]
2335*795d594fSAndroid Build Coastguard Worker   //   [        imm11:0            rs1   funct3     rd        opcode   ]
2336*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2337*795d594fSAndroid Build Coastguard Worker   template <typename Reg1, typename Reg2>
EmitI(int32_t imm12,Reg1 rs1,uint32_t funct3,Reg2 rd,uint32_t opcode)2338*795d594fSAndroid Build Coastguard Worker   void EmitI(int32_t imm12, Reg1 rs1, uint32_t funct3, Reg2 rd, uint32_t opcode) {
2339*795d594fSAndroid Build Coastguard Worker     DCHECK(IsInt<12>(imm12)) << imm12;
2340*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs1)));
2341*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2342*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rd)));
2343*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<7>(opcode));
2344*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = static_cast<uint32_t>(imm12) << 20 | static_cast<uint32_t>(rs1) << 15 |
2345*795d594fSAndroid Build Coastguard Worker                         funct3 << 12 | static_cast<uint32_t>(rd) << 7 | opcode;
2346*795d594fSAndroid Build Coastguard Worker     Emit32(encoding);
2347*795d594fSAndroid Build Coastguard Worker   }
2348*795d594fSAndroid Build Coastguard Worker 
2349*795d594fSAndroid Build Coastguard Worker   // R-type instruction:
2350*795d594fSAndroid Build Coastguard Worker   //
2351*795d594fSAndroid Build Coastguard Worker   //    31         25 24     20 19     15 14 12 11      7 6           0
2352*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2353*795d594fSAndroid Build Coastguard Worker   //   [ . . . . . . | . . . . | . . . . | . . | . . . . | . . . . . . ]
2354*795d594fSAndroid Build Coastguard Worker   //   [   funct7        rs2       rs1   funct3     rd        opcode   ]
2355*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2356*795d594fSAndroid Build Coastguard Worker   template <typename Reg1, typename Reg2, typename Reg3>
EmitR(uint32_t funct7,Reg1 rs2,Reg2 rs1,uint32_t funct3,Reg3 rd,uint32_t opcode)2357*795d594fSAndroid Build Coastguard Worker   void EmitR(uint32_t funct7, Reg1 rs2, Reg2 rs1, uint32_t funct3, Reg3 rd, uint32_t opcode) {
2358*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<7>(funct7));
2359*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs2)));
2360*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs1)));
2361*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2362*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rd)));
2363*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<7>(opcode));
2364*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = funct7 << 25 | static_cast<uint32_t>(rs2) << 20 |
2365*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(rs1) << 15 | funct3 << 12 |
2366*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(rd) << 7 | opcode;
2367*795d594fSAndroid Build Coastguard Worker     Emit32(encoding);
2368*795d594fSAndroid Build Coastguard Worker   }
2369*795d594fSAndroid Build Coastguard Worker 
2370*795d594fSAndroid Build Coastguard Worker   // R-type instruction variant for floating-point fused multiply-add/sub (F[N]MADD/ F[N]MSUB):
2371*795d594fSAndroid Build Coastguard Worker   //
2372*795d594fSAndroid Build Coastguard Worker   //    31     27  25 24     20 19     15 14 12 11      7 6           0
2373*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2374*795d594fSAndroid Build Coastguard Worker   //   [ . . . . | . | . . . . | . . . . | . . | . . . . | . . . . . . ]
2375*795d594fSAndroid Build Coastguard Worker   //   [  rs3     fmt    rs2       rs1   funct3     rd        opcode   ]
2376*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2377*795d594fSAndroid Build Coastguard Worker   template <typename Reg1, typename Reg2, typename Reg3, typename Reg4>
EmitR4(Reg1 rs3,uint32_t fmt,Reg2 rs2,Reg3 rs1,uint32_t funct3,Reg4 rd,uint32_t opcode)2378*795d594fSAndroid Build Coastguard Worker   void EmitR4(
2379*795d594fSAndroid Build Coastguard Worker       Reg1 rs3, uint32_t fmt, Reg2 rs2, Reg3 rs1, uint32_t funct3, Reg4 rd, uint32_t opcode) {
2380*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs3)));
2381*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(fmt));
2382*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs2)));
2383*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs1)));
2384*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2385*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rd)));
2386*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<7>(opcode));
2387*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = static_cast<uint32_t>(rs3) << 27 | static_cast<uint32_t>(fmt) << 25 |
2388*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(rs2) << 20 | static_cast<uint32_t>(rs1) << 15 |
2389*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(funct3) << 12 | static_cast<uint32_t>(rd) << 7 |
2390*795d594fSAndroid Build Coastguard Worker                         opcode;
2391*795d594fSAndroid Build Coastguard Worker     Emit32(encoding);
2392*795d594fSAndroid Build Coastguard Worker   }
2393*795d594fSAndroid Build Coastguard Worker 
2394*795d594fSAndroid Build Coastguard Worker   // S-type instruction:
2395*795d594fSAndroid Build Coastguard Worker   //
2396*795d594fSAndroid Build Coastguard Worker   //    31         25 24     20 19     15 14 12 11      7 6           0
2397*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2398*795d594fSAndroid Build Coastguard Worker   //   [ . . . . . . | . . . . | . . . . | . . | . . . . | . . . . . . ]
2399*795d594fSAndroid Build Coastguard Worker   //   [   imm11:5       rs2       rs1   funct3   imm4:0      opcode   ]
2400*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2401*795d594fSAndroid Build Coastguard Worker   template <typename Reg1, typename Reg2>
EmitS(int32_t imm12,Reg1 rs2,Reg2 rs1,uint32_t funct3,uint32_t opcode)2402*795d594fSAndroid Build Coastguard Worker   void EmitS(int32_t imm12, Reg1 rs2, Reg2 rs1, uint32_t funct3, uint32_t opcode) {
2403*795d594fSAndroid Build Coastguard Worker     DCHECK(IsInt<12>(imm12)) << imm12;
2404*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs2)));
2405*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs1)));
2406*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2407*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<7>(opcode));
2408*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = (static_cast<uint32_t>(imm12) & 0xFE0) << 20 |
2409*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(rs2) << 20 | static_cast<uint32_t>(rs1) << 15 |
2410*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(funct3) << 12 |
2411*795d594fSAndroid Build Coastguard Worker                         (static_cast<uint32_t>(imm12) & 0x1F) << 7 | opcode;
2412*795d594fSAndroid Build Coastguard Worker     Emit32(encoding);
2413*795d594fSAndroid Build Coastguard Worker   }
2414*795d594fSAndroid Build Coastguard Worker 
2415*795d594fSAndroid Build Coastguard Worker   // I-type instruction variant for shifts (SLLI / SRLI / SRAI):
2416*795d594fSAndroid Build Coastguard Worker   //
2417*795d594fSAndroid Build Coastguard Worker   //    31       26 25       20 19     15 14 12 11      7 6           0
2418*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2419*795d594fSAndroid Build Coastguard Worker   //   [ . . . . . | . . . . . | . . . . | . . | . . . . | . . . . . . ]
2420*795d594fSAndroid Build Coastguard Worker   //   [  imm11:6  imm5:0(shamt)   rs1   funct3     rd        opcode   ]
2421*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
EmitI6(uint32_t funct6,uint32_t imm6,XRegister rs1,uint32_t funct3,XRegister rd,uint32_t opcode)2422*795d594fSAndroid Build Coastguard Worker   void EmitI6(uint32_t funct6,
2423*795d594fSAndroid Build Coastguard Worker               uint32_t imm6,
2424*795d594fSAndroid Build Coastguard Worker               XRegister rs1,
2425*795d594fSAndroid Build Coastguard Worker               uint32_t funct3,
2426*795d594fSAndroid Build Coastguard Worker               XRegister rd,
2427*795d594fSAndroid Build Coastguard Worker               uint32_t opcode) {
2428*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<6>(funct6));
2429*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<6>(imm6)) << imm6;
2430*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs1)));
2431*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2432*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rd)));
2433*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<7>(opcode));
2434*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = funct6 << 26 | static_cast<uint32_t>(imm6) << 20 |
2435*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(rs1) << 15 | funct3 << 12 |
2436*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(rd) << 7 | opcode;
2437*795d594fSAndroid Build Coastguard Worker     Emit32(encoding);
2438*795d594fSAndroid Build Coastguard Worker   }
2439*795d594fSAndroid Build Coastguard Worker 
2440*795d594fSAndroid Build Coastguard Worker   // B-type instruction:
2441*795d594fSAndroid Build Coastguard Worker   //
2442*795d594fSAndroid Build Coastguard Worker   //   31 30       25 24     20 19     15 14 12 11    8 7 6           0
2443*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2444*795d594fSAndroid Build Coastguard Worker   //   [ | . . . . . | . . . . | . . . . | . . | . . . | | . . . . . . ]
2445*795d594fSAndroid Build Coastguard Worker   //  imm12 imm11:5      rs2       rs1   funct3 imm4:1 imm11  opcode   ]
2446*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
EmitB(int32_t offset,XRegister rs2,XRegister rs1,uint32_t funct3,uint32_t opcode)2447*795d594fSAndroid Build Coastguard Worker   void EmitB(int32_t offset, XRegister rs2, XRegister rs1, uint32_t funct3, uint32_t opcode) {
2448*795d594fSAndroid Build Coastguard Worker     DCHECK_ALIGNED(offset, 2);
2449*795d594fSAndroid Build Coastguard Worker     DCHECK(IsInt<13>(offset)) << offset;
2450*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs2)));
2451*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs1)));
2452*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2453*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<7>(opcode));
2454*795d594fSAndroid Build Coastguard Worker     uint32_t imm12 = (static_cast<uint32_t>(offset) >> 1) & 0xfffu;
2455*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = (imm12 & 0x800u) << (31 - 11) | (imm12 & 0x03f0u) << (25 - 4) |
2456*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(rs2) << 20 | static_cast<uint32_t>(rs1) << 15 |
2457*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(funct3) << 12 |
2458*795d594fSAndroid Build Coastguard Worker                         (imm12 & 0xfu) << 8 | (imm12 & 0x400u) >> (10 - 7) | opcode;
2459*795d594fSAndroid Build Coastguard Worker     Emit32(encoding);
2460*795d594fSAndroid Build Coastguard Worker   }
2461*795d594fSAndroid Build Coastguard Worker 
2462*795d594fSAndroid Build Coastguard Worker   // U-type instruction:
2463*795d594fSAndroid Build Coastguard Worker   //
2464*795d594fSAndroid Build Coastguard Worker   //    31                                   12 11      7 6           0
2465*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2466*795d594fSAndroid Build Coastguard Worker   //   [ . . . . . . . . . . . . . . . . . . . | . . . . | . . . . . . ]
2467*795d594fSAndroid Build Coastguard Worker   //   [                imm31:12                    rd        opcode   ]
2468*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
EmitU(uint32_t imm20,XRegister rd,uint32_t opcode)2469*795d594fSAndroid Build Coastguard Worker   void EmitU(uint32_t imm20, XRegister rd, uint32_t opcode) {
2470*795d594fSAndroid Build Coastguard Worker     CHECK(IsUint<20>(imm20)) << imm20;
2471*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rd)));
2472*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<7>(opcode));
2473*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = imm20 << 12 | static_cast<uint32_t>(rd) << 7 | opcode;
2474*795d594fSAndroid Build Coastguard Worker     Emit32(encoding);
2475*795d594fSAndroid Build Coastguard Worker   }
2476*795d594fSAndroid Build Coastguard Worker 
2477*795d594fSAndroid Build Coastguard Worker   // J-type instruction:
2478*795d594fSAndroid Build Coastguard Worker   //
2479*795d594fSAndroid Build Coastguard Worker   //   31 30               21   19           12 11      7 6           0
2480*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
2481*795d594fSAndroid Build Coastguard Worker   //   [ | . . . . . . . . . | | . . . . . . . | . . . . | . . . . . . ]
2482*795d594fSAndroid Build Coastguard Worker   //  imm20    imm10:1      imm11   imm19:12        rd        opcode   ]
2483*795d594fSAndroid Build Coastguard Worker   //   -----------------------------------------------------------------
EmitJ(int32_t offset,XRegister rd,uint32_t opcode)2484*795d594fSAndroid Build Coastguard Worker   void EmitJ(int32_t offset, XRegister rd, uint32_t opcode) {
2485*795d594fSAndroid Build Coastguard Worker     DCHECK_ALIGNED(offset, 2);
2486*795d594fSAndroid Build Coastguard Worker     CHECK(IsInt<21>(offset)) << offset;
2487*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rd)));
2488*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<7>(opcode));
2489*795d594fSAndroid Build Coastguard Worker     uint32_t imm20 = (static_cast<uint32_t>(offset) >> 1) & 0xfffffu;
2490*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = (imm20 & 0x80000u) << (31 - 19) | (imm20 & 0x03ffu) << 21 |
2491*795d594fSAndroid Build Coastguard Worker                         (imm20 & 0x400u) << (20 - 10) | (imm20 & 0x7f800u) << (12 - 11) |
2492*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(rd) << 7 | opcode;
2493*795d594fSAndroid Build Coastguard Worker     Emit32(encoding);
2494*795d594fSAndroid Build Coastguard Worker   }
2495*795d594fSAndroid Build Coastguard Worker 
2496*795d594fSAndroid Build Coastguard Worker   // Compressed Instruction Encodings
2497*795d594fSAndroid Build Coastguard Worker 
2498*795d594fSAndroid Build Coastguard Worker   // CR-type instruction:
2499*795d594fSAndroid Build Coastguard Worker   //
2500*795d594fSAndroid Build Coastguard Worker   //   15    12 11      7 6       2 1 0
2501*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2502*795d594fSAndroid Build Coastguard Worker   //   [ . . . | . . . . | . . . . | . ]
2503*795d594fSAndroid Build Coastguard Worker   //   [ func4   rd/rs1      rs2    op ]
2504*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2505*795d594fSAndroid Build Coastguard Worker   //
EmitCR(uint32_t funct4,XRegister rd_rs1,XRegister rs2,uint32_t opcode)2506*795d594fSAndroid Build Coastguard Worker   void EmitCR(uint32_t funct4, XRegister rd_rs1, XRegister rs2, uint32_t opcode) {
2507*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<4>(funct4));
2508*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rd_rs1)));
2509*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs2)));
2510*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(opcode));
2511*795d594fSAndroid Build Coastguard Worker 
2512*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = funct4 << 12 | static_cast<uint32_t>(rd_rs1) << 7 |
2513*795d594fSAndroid Build Coastguard Worker                         static_cast<uint32_t>(rs2) << 2 | opcode;
2514*795d594fSAndroid Build Coastguard Worker     Emit16(encoding);
2515*795d594fSAndroid Build Coastguard Worker   }
2516*795d594fSAndroid Build Coastguard Worker 
2517*795d594fSAndroid Build Coastguard Worker   // CI-type instruction:
2518*795d594fSAndroid Build Coastguard Worker   //
2519*795d594fSAndroid Build Coastguard Worker   //   15  13   11      7 6       2 1 0
2520*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2521*795d594fSAndroid Build Coastguard Worker   //   [ . . | | . . . . | . . . . | . ]
2522*795d594fSAndroid Build Coastguard Worker   //   [func3 imm rd/rs1     imm    op ]
2523*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2524*795d594fSAndroid Build Coastguard Worker   //
2525*795d594fSAndroid Build Coastguard Worker   template <typename Reg>
EmitCI(uint32_t funct3,Reg rd_rs1,uint32_t imm6,uint32_t opcode)2526*795d594fSAndroid Build Coastguard Worker   void EmitCI(uint32_t funct3, Reg rd_rs1, uint32_t imm6, uint32_t opcode) {
2527*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2528*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rd_rs1)));
2529*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<6>(imm6));
2530*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(opcode));
2531*795d594fSAndroid Build Coastguard Worker 
2532*795d594fSAndroid Build Coastguard Worker     uint32_t immH1 = BitFieldExtract(imm6, 5, 1);
2533*795d594fSAndroid Build Coastguard Worker     uint32_t immL5 = BitFieldExtract(imm6, 0, 5);
2534*795d594fSAndroid Build Coastguard Worker 
2535*795d594fSAndroid Build Coastguard Worker     uint32_t encoding =
2536*795d594fSAndroid Build Coastguard Worker         funct3 << 13 | immH1 << 12 | static_cast<uint32_t>(rd_rs1) << 7 | immL5 << 2 | opcode;
2537*795d594fSAndroid Build Coastguard Worker     Emit16(encoding);
2538*795d594fSAndroid Build Coastguard Worker   }
2539*795d594fSAndroid Build Coastguard Worker 
2540*795d594fSAndroid Build Coastguard Worker   // CSS-type instruction:
2541*795d594fSAndroid Build Coastguard Worker   //
2542*795d594fSAndroid Build Coastguard Worker   //   15  13 12        7 6       2 1 0
2543*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2544*795d594fSAndroid Build Coastguard Worker   //   [ . . | . . . . . | . . . . | . ]
2545*795d594fSAndroid Build Coastguard Worker   //   [func3     imm6      rs2     op ]
2546*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2547*795d594fSAndroid Build Coastguard Worker   //
2548*795d594fSAndroid Build Coastguard Worker   template <typename Reg>
EmitCSS(uint32_t funct3,uint32_t offset6,Reg rs2,uint32_t opcode)2549*795d594fSAndroid Build Coastguard Worker   void EmitCSS(uint32_t funct3, uint32_t offset6, Reg rs2, uint32_t opcode) {
2550*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2551*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<6>(offset6));
2552*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(static_cast<uint32_t>(rs2)));
2553*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(opcode));
2554*795d594fSAndroid Build Coastguard Worker 
2555*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = funct3 << 13 | offset6 << 7 | static_cast<uint32_t>(rs2) << 2 | opcode;
2556*795d594fSAndroid Build Coastguard Worker     Emit16(encoding);
2557*795d594fSAndroid Build Coastguard Worker   }
2558*795d594fSAndroid Build Coastguard Worker 
2559*795d594fSAndroid Build Coastguard Worker   // CIW-type instruction:
2560*795d594fSAndroid Build Coastguard Worker   //
2561*795d594fSAndroid Build Coastguard Worker   //   15  13 12            5 4   2 1 0
2562*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2563*795d594fSAndroid Build Coastguard Worker   //   [ . . | . . . . . . . | . . | . ]
2564*795d594fSAndroid Build Coastguard Worker   //   [func3     imm8         rd'  op ]
2565*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2566*795d594fSAndroid Build Coastguard Worker   //
EmitCIW(uint32_t funct3,uint32_t imm8,XRegister rd_s,uint32_t opcode)2567*795d594fSAndroid Build Coastguard Worker   void EmitCIW(uint32_t funct3, uint32_t imm8, XRegister rd_s, uint32_t opcode) {
2568*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2569*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<8>(imm8));
2570*795d594fSAndroid Build Coastguard Worker     DCHECK(IsShortReg(rd_s)) << rd_s;
2571*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(opcode));
2572*795d594fSAndroid Build Coastguard Worker 
2573*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = funct3 << 13 | imm8 << 5 | EncodeShortReg(rd_s) << 2 | opcode;
2574*795d594fSAndroid Build Coastguard Worker     Emit16(encoding);
2575*795d594fSAndroid Build Coastguard Worker   }
2576*795d594fSAndroid Build Coastguard Worker 
2577*795d594fSAndroid Build Coastguard Worker   // CL/S-type instruction:
2578*795d594fSAndroid Build Coastguard Worker   //
2579*795d594fSAndroid Build Coastguard Worker   //   15  13 12  10 9  7 6 5 4   2 1 0
2580*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2581*795d594fSAndroid Build Coastguard Worker   //   [ . . | . . | . . | . | . . | . ]
2582*795d594fSAndroid Build Coastguard Worker   //   [func3  imm   rs1' imm rds2' op ]
2583*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2584*795d594fSAndroid Build Coastguard Worker   //
2585*795d594fSAndroid Build Coastguard Worker   template <typename Reg>
EmitCM(uint32_t funct3,uint32_t imm5,XRegister rs1_s,Reg rd_rs2_s,uint32_t opcode)2586*795d594fSAndroid Build Coastguard Worker   void EmitCM(uint32_t funct3, uint32_t imm5, XRegister rs1_s, Reg rd_rs2_s, uint32_t opcode) {
2587*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2588*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<5>(imm5));
2589*795d594fSAndroid Build Coastguard Worker     DCHECK(IsShortReg(rs1_s)) << rs1_s;
2590*795d594fSAndroid Build Coastguard Worker     DCHECK(IsShortReg(rd_rs2_s)) << rd_rs2_s;
2591*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(opcode));
2592*795d594fSAndroid Build Coastguard Worker 
2593*795d594fSAndroid Build Coastguard Worker     uint32_t immH3 = BitFieldExtract(imm5, 2, 3);
2594*795d594fSAndroid Build Coastguard Worker     uint32_t immL2 = BitFieldExtract(imm5, 0, 2);
2595*795d594fSAndroid Build Coastguard Worker 
2596*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = funct3 << 13 | immH3 << 10 | EncodeShortReg(rs1_s) << 7 | immL2 << 5 |
2597*795d594fSAndroid Build Coastguard Worker                         EncodeShortReg(rd_rs2_s) << 2 | opcode;
2598*795d594fSAndroid Build Coastguard Worker     Emit16(encoding);
2599*795d594fSAndroid Build Coastguard Worker   }
2600*795d594fSAndroid Build Coastguard Worker 
2601*795d594fSAndroid Build Coastguard Worker   // CA-type instruction:
2602*795d594fSAndroid Build Coastguard Worker   //
2603*795d594fSAndroid Build Coastguard Worker   //   15         10 9  7 6 5 4   2 1 0
2604*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2605*795d594fSAndroid Build Coastguard Worker   //   [ . . . . . | . . | . | . . | . ]
2606*795d594fSAndroid Build Coastguard Worker   //   [    funct6 rds1' funct2 rs2' op]
2607*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2608*795d594fSAndroid Build Coastguard Worker   //
EmitCA(uint32_t funct6,XRegister rd_rs1_s,uint32_t funct2,uint32_t rs2_v,uint32_t opcode)2609*795d594fSAndroid Build Coastguard Worker   void EmitCA(
2610*795d594fSAndroid Build Coastguard Worker       uint32_t funct6, XRegister rd_rs1_s, uint32_t funct2, uint32_t rs2_v, uint32_t opcode) {
2611*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<6>(funct6));
2612*795d594fSAndroid Build Coastguard Worker     DCHECK(IsShortReg(rd_rs1_s)) << rd_rs1_s;
2613*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(funct2));
2614*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(rs2_v));
2615*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(opcode));
2616*795d594fSAndroid Build Coastguard Worker 
2617*795d594fSAndroid Build Coastguard Worker     uint32_t encoding =
2618*795d594fSAndroid Build Coastguard Worker         funct6 << 10 | EncodeShortReg(rd_rs1_s) << 7 | funct2 << 5  | rs2_v << 2 | opcode;
2619*795d594fSAndroid Build Coastguard Worker     Emit16(encoding);
2620*795d594fSAndroid Build Coastguard Worker   }
2621*795d594fSAndroid Build Coastguard Worker 
EmitCAReg(uint32_t funct6,XRegister rd_rs1_s,uint32_t funct2,XRegister rs2_s,uint32_t opcode)2622*795d594fSAndroid Build Coastguard Worker   void EmitCAReg(
2623*795d594fSAndroid Build Coastguard Worker       uint32_t funct6, XRegister rd_rs1_s, uint32_t funct2, XRegister rs2_s, uint32_t opcode) {
2624*795d594fSAndroid Build Coastguard Worker     DCHECK(IsShortReg(rs2_s)) << rs2_s;
2625*795d594fSAndroid Build Coastguard Worker     EmitCA(funct6, rd_rs1_s, funct2, EncodeShortReg(rs2_s), opcode);
2626*795d594fSAndroid Build Coastguard Worker   }
2627*795d594fSAndroid Build Coastguard Worker 
EmitCAImm(uint32_t funct6,XRegister rd_rs1_s,uint32_t funct2,uint32_t funct3,uint32_t opcode)2628*795d594fSAndroid Build Coastguard Worker   void EmitCAImm(
2629*795d594fSAndroid Build Coastguard Worker       uint32_t funct6, XRegister rd_rs1_s, uint32_t funct2, uint32_t funct3, uint32_t opcode) {
2630*795d594fSAndroid Build Coastguard Worker     EmitCA(funct6, rd_rs1_s, funct2, funct3, opcode);
2631*795d594fSAndroid Build Coastguard Worker   }
2632*795d594fSAndroid Build Coastguard Worker 
2633*795d594fSAndroid Build Coastguard Worker   // CB-type instruction:
2634*795d594fSAndroid Build Coastguard Worker   //
2635*795d594fSAndroid Build Coastguard Worker   //   15  13 12  10 9  7 6       2 1 0
2636*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2637*795d594fSAndroid Build Coastguard Worker   //   [ . . | . . | . . | . . . . | . ]
2638*795d594fSAndroid Build Coastguard Worker   //   [func3 offset rs1'   offset  op ]
2639*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2640*795d594fSAndroid Build Coastguard Worker   //
EmitCB(uint32_t funct3,int32_t offset8,XRegister rd_rs1_s,uint32_t opcode)2641*795d594fSAndroid Build Coastguard Worker   void EmitCB(uint32_t funct3, int32_t offset8, XRegister rd_rs1_s, uint32_t opcode) {
2642*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2643*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<8>(offset8));
2644*795d594fSAndroid Build Coastguard Worker     DCHECK(IsShortReg(rd_rs1_s)) << rd_rs1_s;
2645*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(opcode));
2646*795d594fSAndroid Build Coastguard Worker 
2647*795d594fSAndroid Build Coastguard Worker     uint32_t offsetH3 = BitFieldExtract<uint32_t>(offset8, 5, 3);
2648*795d594fSAndroid Build Coastguard Worker     uint32_t offsetL5 = BitFieldExtract<uint32_t>(offset8, 0, 5);
2649*795d594fSAndroid Build Coastguard Worker 
2650*795d594fSAndroid Build Coastguard Worker     uint32_t encoding =
2651*795d594fSAndroid Build Coastguard Worker         funct3 << 13 | offsetH3 << 10 | EncodeShortReg(rd_rs1_s) << 7 | offsetL5 << 2 | opcode;
2652*795d594fSAndroid Build Coastguard Worker     Emit16(encoding);
2653*795d594fSAndroid Build Coastguard Worker   }
2654*795d594fSAndroid Build Coastguard Worker 
2655*795d594fSAndroid Build Coastguard Worker   // Wrappers for EmitCB with different imm bit permutation
EmitCBBranch(uint32_t funct3,int32_t offset,XRegister rs1_s,uint32_t opcode)2656*795d594fSAndroid Build Coastguard Worker   void EmitCBBranch(uint32_t funct3, int32_t offset, XRegister rs1_s, uint32_t opcode) {
2657*795d594fSAndroid Build Coastguard Worker     DCHECK(IsInt<9>(offset));
2658*795d594fSAndroid Build Coastguard Worker     DCHECK_ALIGNED(offset, 2);
2659*795d594fSAndroid Build Coastguard Worker 
2660*795d594fSAndroid Build Coastguard Worker     uint32_t u_offset = static_cast<uint32_t>(offset);
2661*795d594fSAndroid Build Coastguard Worker 
2662*795d594fSAndroid Build Coastguard Worker     // offset[8|4:3]
2663*795d594fSAndroid Build Coastguard Worker     uint32_t offsetH3 = (BitFieldExtract(u_offset, 8, 1) << 2) |
2664*795d594fSAndroid Build Coastguard Worker                          BitFieldExtract(u_offset, 3, 2);
2665*795d594fSAndroid Build Coastguard Worker     // offset[7:6|2:1|5]
2666*795d594fSAndroid Build Coastguard Worker     uint32_t offsetL5 = (BitFieldExtract(u_offset, 6, 2) << 3) |
2667*795d594fSAndroid Build Coastguard Worker                         (BitFieldExtract(u_offset, 1, 2) << 1) |
2668*795d594fSAndroid Build Coastguard Worker                          BitFieldExtract(u_offset, 5, 1);
2669*795d594fSAndroid Build Coastguard Worker 
2670*795d594fSAndroid Build Coastguard Worker     EmitCB(funct3, BitFieldInsert(offsetL5, offsetH3, 5, 3), rs1_s, opcode);
2671*795d594fSAndroid Build Coastguard Worker   }
2672*795d594fSAndroid Build Coastguard Worker 
EmitCBArithmetic(uint32_t funct3,uint32_t funct2,uint32_t imm,XRegister rd_s,uint32_t opcode)2673*795d594fSAndroid Build Coastguard Worker   void EmitCBArithmetic(
2674*795d594fSAndroid Build Coastguard Worker       uint32_t funct3, uint32_t funct2, uint32_t imm, XRegister rd_s, uint32_t opcode) {
2675*795d594fSAndroid Build Coastguard Worker     uint32_t imm_5 = BitFieldExtract(imm, 5, 1);
2676*795d594fSAndroid Build Coastguard Worker     uint32_t immH3 = BitFieldInsert(funct2, imm_5, 2, 1);
2677*795d594fSAndroid Build Coastguard Worker     uint32_t immL5 = BitFieldExtract(imm, 0, 5);
2678*795d594fSAndroid Build Coastguard Worker 
2679*795d594fSAndroid Build Coastguard Worker     EmitCB(funct3, BitFieldInsert(immL5, immH3, 5, 3), rd_s, opcode);
2680*795d594fSAndroid Build Coastguard Worker   }
2681*795d594fSAndroid Build Coastguard Worker 
2682*795d594fSAndroid Build Coastguard Worker   // CJ-type instruction:
2683*795d594fSAndroid Build Coastguard Worker   //
2684*795d594fSAndroid Build Coastguard Worker   //   15  13 12                  2 1 0
2685*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2686*795d594fSAndroid Build Coastguard Worker   //   [ . . | . . . . . . . . . . | . ]
2687*795d594fSAndroid Build Coastguard Worker   //   [func3    jump target 11     op ]
2688*795d594fSAndroid Build Coastguard Worker   //   ---------------------------------
2689*795d594fSAndroid Build Coastguard Worker   //
EmitCJ(uint32_t funct3,int32_t offset,uint32_t opcode)2690*795d594fSAndroid Build Coastguard Worker   void EmitCJ(uint32_t funct3, int32_t offset, uint32_t opcode) {
2691*795d594fSAndroid Build Coastguard Worker     DCHECK_ALIGNED(offset, 2);
2692*795d594fSAndroid Build Coastguard Worker     DCHECK(IsInt<12>(offset)) << offset;
2693*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<3>(funct3));
2694*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<2>(opcode));
2695*795d594fSAndroid Build Coastguard Worker 
2696*795d594fSAndroid Build Coastguard Worker     uint32_t uoffset = static_cast<uint32_t>(offset);
2697*795d594fSAndroid Build Coastguard Worker     // offset[11|4|9:8|10|6|7|3:1|5]
2698*795d594fSAndroid Build Coastguard Worker     uint32_t jumpt = (BitFieldExtract(uoffset, 11, 1) << 10) |
2699*795d594fSAndroid Build Coastguard Worker                      (BitFieldExtract(uoffset, 4, 1) << 9)   |
2700*795d594fSAndroid Build Coastguard Worker                      (BitFieldExtract(uoffset, 8, 2) << 7)   |
2701*795d594fSAndroid Build Coastguard Worker                      (BitFieldExtract(uoffset, 10, 1) << 6)  |
2702*795d594fSAndroid Build Coastguard Worker                      (BitFieldExtract(uoffset, 6, 1) << 5)   |
2703*795d594fSAndroid Build Coastguard Worker                      (BitFieldExtract(uoffset, 7, 1) << 4)   |
2704*795d594fSAndroid Build Coastguard Worker                      (BitFieldExtract(uoffset, 1, 3) << 1)   |
2705*795d594fSAndroid Build Coastguard Worker                       BitFieldExtract(uoffset, 5, 1);
2706*795d594fSAndroid Build Coastguard Worker 
2707*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<11>(jumpt));
2708*795d594fSAndroid Build Coastguard Worker 
2709*795d594fSAndroid Build Coastguard Worker     uint32_t encoding = funct3 << 13 | jumpt << 2 | opcode;
2710*795d594fSAndroid Build Coastguard Worker     Emit16(encoding);
2711*795d594fSAndroid Build Coastguard Worker   }
2712*795d594fSAndroid Build Coastguard Worker 
2713*795d594fSAndroid Build Coastguard Worker   ArenaVector<Branch> branches_;
2714*795d594fSAndroid Build Coastguard Worker 
2715*795d594fSAndroid Build Coastguard Worker   // For checking that we finalize the code only once.
2716*795d594fSAndroid Build Coastguard Worker   bool finalized_;
2717*795d594fSAndroid Build Coastguard Worker 
2718*795d594fSAndroid Build Coastguard Worker   // Whether appending instructions at the end of the buffer or overwriting the existing ones.
2719*795d594fSAndroid Build Coastguard Worker   bool overwriting_;
2720*795d594fSAndroid Build Coastguard Worker   // The current overwrite location.
2721*795d594fSAndroid Build Coastguard Worker   uint32_t overwrite_location_;
2722*795d594fSAndroid Build Coastguard Worker 
2723*795d594fSAndroid Build Coastguard Worker   // Use `std::deque<>` for literal labels to allow insertions at the end
2724*795d594fSAndroid Build Coastguard Worker   // without invalidating pointers and references to existing elements.
2725*795d594fSAndroid Build Coastguard Worker   ArenaDeque<Literal> literals_;
2726*795d594fSAndroid Build Coastguard Worker   ArenaDeque<Literal> long_literals_;  // 64-bit literals separated for alignment reasons.
2727*795d594fSAndroid Build Coastguard Worker 
2728*795d594fSAndroid Build Coastguard Worker   // Jump table list.
2729*795d594fSAndroid Build Coastguard Worker   ArenaDeque<JumpTable> jump_tables_;
2730*795d594fSAndroid Build Coastguard Worker 
2731*795d594fSAndroid Build Coastguard Worker   // Data for `GetAdjustedPosition()`, see the description there.
2732*795d594fSAndroid Build Coastguard Worker   uint32_t last_position_adjustment_;
2733*795d594fSAndroid Build Coastguard Worker   uint32_t last_old_position_;
2734*795d594fSAndroid Build Coastguard Worker   uint32_t last_branch_id_;
2735*795d594fSAndroid Build Coastguard Worker 
2736*795d594fSAndroid Build Coastguard Worker   Riscv64ExtensionMask enabled_extensions_;
2737*795d594fSAndroid Build Coastguard Worker   uint32_t available_scratch_core_registers_;
2738*795d594fSAndroid Build Coastguard Worker   uint32_t available_scratch_fp_registers_;
2739*795d594fSAndroid Build Coastguard Worker 
2740*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t kXlen = 64;
2741*795d594fSAndroid Build Coastguard Worker 
2742*795d594fSAndroid Build Coastguard Worker   friend class ScopedExtensionsOverride;
2743*795d594fSAndroid Build Coastguard Worker   friend class ScratchRegisterScope;
2744*795d594fSAndroid Build Coastguard Worker 
2745*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(Riscv64Assembler);
2746*795d594fSAndroid Build Coastguard Worker };
2747*795d594fSAndroid Build Coastguard Worker 
2748*795d594fSAndroid Build Coastguard Worker class ScopedExtensionsOverride {
2749*795d594fSAndroid Build Coastguard Worker  public:
ScopedExtensionsOverride(Riscv64Assembler * assembler,Riscv64ExtensionMask enabled_extensions)2750*795d594fSAndroid Build Coastguard Worker   ScopedExtensionsOverride(Riscv64Assembler* assembler, Riscv64ExtensionMask enabled_extensions)
2751*795d594fSAndroid Build Coastguard Worker       : assembler_(assembler),
2752*795d594fSAndroid Build Coastguard Worker         old_enabled_extensions_(assembler->enabled_extensions_) {
2753*795d594fSAndroid Build Coastguard Worker     assembler->enabled_extensions_ = enabled_extensions;
2754*795d594fSAndroid Build Coastguard Worker   }
2755*795d594fSAndroid Build Coastguard Worker 
~ScopedExtensionsOverride()2756*795d594fSAndroid Build Coastguard Worker   ~ScopedExtensionsOverride() {
2757*795d594fSAndroid Build Coastguard Worker     assembler_->enabled_extensions_ = old_enabled_extensions_;
2758*795d594fSAndroid Build Coastguard Worker   }
2759*795d594fSAndroid Build Coastguard Worker 
2760*795d594fSAndroid Build Coastguard Worker  protected:
GetEnabledExtensions(Riscv64Assembler * assembler)2761*795d594fSAndroid Build Coastguard Worker   static Riscv64ExtensionMask GetEnabledExtensions(Riscv64Assembler* assembler) {
2762*795d594fSAndroid Build Coastguard Worker     return assembler->enabled_extensions_;
2763*795d594fSAndroid Build Coastguard Worker   }
2764*795d594fSAndroid Build Coastguard Worker 
2765*795d594fSAndroid Build Coastguard Worker  private:
2766*795d594fSAndroid Build Coastguard Worker   Riscv64Assembler* const assembler_;
2767*795d594fSAndroid Build Coastguard Worker   const Riscv64ExtensionMask old_enabled_extensions_;
2768*795d594fSAndroid Build Coastguard Worker };
2769*795d594fSAndroid Build Coastguard Worker 
2770*795d594fSAndroid Build Coastguard Worker template <Riscv64ExtensionMask kMask>
2771*795d594fSAndroid Build Coastguard Worker class ScopedExtensionsRestriction : public ScopedExtensionsOverride {
2772*795d594fSAndroid Build Coastguard Worker  public:
ScopedExtensionsRestriction(Riscv64Assembler * assembler)2773*795d594fSAndroid Build Coastguard Worker   explicit ScopedExtensionsRestriction(Riscv64Assembler* assembler)
2774*795d594fSAndroid Build Coastguard Worker       : ScopedExtensionsOverride(assembler, GetEnabledExtensions(assembler) & kMask) {}
2775*795d594fSAndroid Build Coastguard Worker };
2776*795d594fSAndroid Build Coastguard Worker 
2777*795d594fSAndroid Build Coastguard Worker template <Riscv64ExtensionMask kMask>
2778*795d594fSAndroid Build Coastguard Worker class ScopedExtensionsInclusion : public ScopedExtensionsOverride {
2779*795d594fSAndroid Build Coastguard Worker  public:
ScopedExtensionsInclusion(Riscv64Assembler * assembler)2780*795d594fSAndroid Build Coastguard Worker   explicit ScopedExtensionsInclusion(Riscv64Assembler* assembler)
2781*795d594fSAndroid Build Coastguard Worker       : ScopedExtensionsOverride(assembler, GetEnabledExtensions(assembler) | kMask) {}
2782*795d594fSAndroid Build Coastguard Worker };
2783*795d594fSAndroid Build Coastguard Worker 
2784*795d594fSAndroid Build Coastguard Worker template <Riscv64ExtensionMask kMask>
2785*795d594fSAndroid Build Coastguard Worker using ScopedExtensionsExclusion = ScopedExtensionsRestriction<~kMask>;
2786*795d594fSAndroid Build Coastguard Worker 
2787*795d594fSAndroid Build Coastguard Worker using ScopedLrScExtensionsRestriction =
2788*795d594fSAndroid Build Coastguard Worker     ScopedExtensionsRestriction<kRiscv64LrScSequenceExtensionsMask>;
2789*795d594fSAndroid Build Coastguard Worker 
2790*795d594fSAndroid Build Coastguard Worker class ScratchRegisterScope {
2791*795d594fSAndroid Build Coastguard Worker  public:
ScratchRegisterScope(Riscv64Assembler * assembler)2792*795d594fSAndroid Build Coastguard Worker   explicit ScratchRegisterScope(Riscv64Assembler* assembler)
2793*795d594fSAndroid Build Coastguard Worker       : assembler_(assembler),
2794*795d594fSAndroid Build Coastguard Worker         old_available_scratch_core_registers_(assembler->available_scratch_core_registers_),
2795*795d594fSAndroid Build Coastguard Worker         old_available_scratch_fp_registers_(assembler->available_scratch_fp_registers_) {}
2796*795d594fSAndroid Build Coastguard Worker 
~ScratchRegisterScope()2797*795d594fSAndroid Build Coastguard Worker   ~ScratchRegisterScope() {
2798*795d594fSAndroid Build Coastguard Worker     assembler_->available_scratch_core_registers_ = old_available_scratch_core_registers_;
2799*795d594fSAndroid Build Coastguard Worker     assembler_->available_scratch_fp_registers_ = old_available_scratch_fp_registers_;
2800*795d594fSAndroid Build Coastguard Worker   }
2801*795d594fSAndroid Build Coastguard Worker 
2802*795d594fSAndroid Build Coastguard Worker   // Alocate a scratch `XRegister`. There must be an available register to allocate.
AllocateXRegister()2803*795d594fSAndroid Build Coastguard Worker   XRegister AllocateXRegister() {
2804*795d594fSAndroid Build Coastguard Worker     CHECK_NE(assembler_->available_scratch_core_registers_, 0u);
2805*795d594fSAndroid Build Coastguard Worker     // Allocate the highest available scratch register (prefer TMP(T6) over TMP2(T5)).
2806*795d594fSAndroid Build Coastguard Worker     uint32_t reg_num = (BitSizeOf(assembler_->available_scratch_core_registers_) - 1u) -
2807*795d594fSAndroid Build Coastguard Worker                        CLZ(assembler_->available_scratch_core_registers_);
2808*795d594fSAndroid Build Coastguard Worker     assembler_->available_scratch_core_registers_ &= ~(1u << reg_num);
2809*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg_num, enum_cast<uint32_t>(kNumberOfXRegisters));
2810*795d594fSAndroid Build Coastguard Worker     return enum_cast<XRegister>(reg_num);
2811*795d594fSAndroid Build Coastguard Worker   }
2812*795d594fSAndroid Build Coastguard Worker 
2813*795d594fSAndroid Build Coastguard Worker   // Free a previously unavailable core register for use as a scratch register.
2814*795d594fSAndroid Build Coastguard Worker   // This can be an arbitrary register, not necessarly the usual `TMP` or `TMP2`.
FreeXRegister(XRegister reg)2815*795d594fSAndroid Build Coastguard Worker   void FreeXRegister(XRegister reg) {
2816*795d594fSAndroid Build Coastguard Worker     uint32_t reg_num = enum_cast<uint32_t>(reg);
2817*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg_num, enum_cast<uint32_t>(kNumberOfXRegisters));
2818*795d594fSAndroid Build Coastguard Worker     CHECK_EQ((1u << reg_num) & assembler_->available_scratch_core_registers_, 0u);
2819*795d594fSAndroid Build Coastguard Worker     assembler_->available_scratch_core_registers_ |= 1u << reg_num;
2820*795d594fSAndroid Build Coastguard Worker   }
2821*795d594fSAndroid Build Coastguard Worker 
2822*795d594fSAndroid Build Coastguard Worker   // The number of available scratch core registers.
AvailableXRegisters()2823*795d594fSAndroid Build Coastguard Worker   size_t AvailableXRegisters() {
2824*795d594fSAndroid Build Coastguard Worker     return POPCOUNT(assembler_->available_scratch_core_registers_);
2825*795d594fSAndroid Build Coastguard Worker   }
2826*795d594fSAndroid Build Coastguard Worker 
2827*795d594fSAndroid Build Coastguard Worker   // Make sure a core register is available for use as a scratch register.
IncludeXRegister(XRegister reg)2828*795d594fSAndroid Build Coastguard Worker   void IncludeXRegister(XRegister reg) {
2829*795d594fSAndroid Build Coastguard Worker     uint32_t reg_num = enum_cast<uint32_t>(reg);
2830*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg_num, enum_cast<uint32_t>(kNumberOfXRegisters));
2831*795d594fSAndroid Build Coastguard Worker     assembler_->available_scratch_core_registers_ |= 1u << reg_num;
2832*795d594fSAndroid Build Coastguard Worker   }
2833*795d594fSAndroid Build Coastguard Worker 
2834*795d594fSAndroid Build Coastguard Worker   // Make sure a core register is not available for use as a scratch register.
ExcludeXRegister(XRegister reg)2835*795d594fSAndroid Build Coastguard Worker   void ExcludeXRegister(XRegister reg) {
2836*795d594fSAndroid Build Coastguard Worker     uint32_t reg_num = enum_cast<uint32_t>(reg);
2837*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg_num, enum_cast<uint32_t>(kNumberOfXRegisters));
2838*795d594fSAndroid Build Coastguard Worker     assembler_->available_scratch_core_registers_ &= ~(1u << reg_num);
2839*795d594fSAndroid Build Coastguard Worker   }
2840*795d594fSAndroid Build Coastguard Worker 
2841*795d594fSAndroid Build Coastguard Worker   // Alocate a scratch `FRegister`. There must be an available register to allocate.
AllocateFRegister()2842*795d594fSAndroid Build Coastguard Worker   FRegister AllocateFRegister() {
2843*795d594fSAndroid Build Coastguard Worker     CHECK_NE(assembler_->available_scratch_fp_registers_, 0u);
2844*795d594fSAndroid Build Coastguard Worker     // Allocate the highest available scratch register (same as for core registers).
2845*795d594fSAndroid Build Coastguard Worker     uint32_t reg_num = (BitSizeOf(assembler_->available_scratch_fp_registers_) - 1u) -
2846*795d594fSAndroid Build Coastguard Worker                        CLZ(assembler_->available_scratch_fp_registers_);
2847*795d594fSAndroid Build Coastguard Worker     assembler_->available_scratch_fp_registers_ &= ~(1u << reg_num);
2848*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg_num, enum_cast<uint32_t>(kNumberOfFRegisters));
2849*795d594fSAndroid Build Coastguard Worker     return enum_cast<FRegister>(reg_num);
2850*795d594fSAndroid Build Coastguard Worker   }
2851*795d594fSAndroid Build Coastguard Worker 
2852*795d594fSAndroid Build Coastguard Worker   // Free a previously unavailable FP register for use as a scratch register.
2853*795d594fSAndroid Build Coastguard Worker   // This can be an arbitrary register, not necessarly the usual `FTMP`.
FreeFRegister(FRegister reg)2854*795d594fSAndroid Build Coastguard Worker   void FreeFRegister(FRegister reg) {
2855*795d594fSAndroid Build Coastguard Worker     uint32_t reg_num = enum_cast<uint32_t>(reg);
2856*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg_num, enum_cast<uint32_t>(kNumberOfFRegisters));
2857*795d594fSAndroid Build Coastguard Worker     CHECK_EQ((1u << reg_num) & assembler_->available_scratch_fp_registers_, 0u);
2858*795d594fSAndroid Build Coastguard Worker     assembler_->available_scratch_fp_registers_ |= 1u << reg_num;
2859*795d594fSAndroid Build Coastguard Worker   }
2860*795d594fSAndroid Build Coastguard Worker 
2861*795d594fSAndroid Build Coastguard Worker   // The number of available scratch FP registers.
AvailableFRegisters()2862*795d594fSAndroid Build Coastguard Worker   size_t AvailableFRegisters() {
2863*795d594fSAndroid Build Coastguard Worker     return POPCOUNT(assembler_->available_scratch_fp_registers_);
2864*795d594fSAndroid Build Coastguard Worker   }
2865*795d594fSAndroid Build Coastguard Worker 
2866*795d594fSAndroid Build Coastguard Worker   // Make sure an FP register is available for use as a scratch register.
IncludeFRegister(FRegister reg)2867*795d594fSAndroid Build Coastguard Worker   void IncludeFRegister(FRegister reg) {
2868*795d594fSAndroid Build Coastguard Worker     uint32_t reg_num = enum_cast<uint32_t>(reg);
2869*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg_num, enum_cast<uint32_t>(kNumberOfFRegisters));
2870*795d594fSAndroid Build Coastguard Worker     assembler_->available_scratch_fp_registers_ |= 1u << reg_num;
2871*795d594fSAndroid Build Coastguard Worker   }
2872*795d594fSAndroid Build Coastguard Worker 
2873*795d594fSAndroid Build Coastguard Worker   // Make sure an FP register is not available for use as a scratch register.
ExcludeFRegister(FRegister reg)2874*795d594fSAndroid Build Coastguard Worker   void ExcludeFRegister(FRegister reg) {
2875*795d594fSAndroid Build Coastguard Worker     uint32_t reg_num = enum_cast<uint32_t>(reg);
2876*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(reg_num, enum_cast<uint32_t>(kNumberOfFRegisters));
2877*795d594fSAndroid Build Coastguard Worker     assembler_->available_scratch_fp_registers_ &= ~(1u << reg_num);
2878*795d594fSAndroid Build Coastguard Worker   }
2879*795d594fSAndroid Build Coastguard Worker 
2880*795d594fSAndroid Build Coastguard Worker  private:
2881*795d594fSAndroid Build Coastguard Worker   Riscv64Assembler* const assembler_;
2882*795d594fSAndroid Build Coastguard Worker   const uint32_t old_available_scratch_core_registers_;
2883*795d594fSAndroid Build Coastguard Worker   const uint32_t old_available_scratch_fp_registers_;
2884*795d594fSAndroid Build Coastguard Worker 
2885*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScratchRegisterScope);
2886*795d594fSAndroid Build Coastguard Worker };
2887*795d594fSAndroid Build Coastguard Worker 
2888*795d594fSAndroid Build Coastguard Worker constexpr Riscv64ExtensionMask kRiscv64CompressedExtensionsMask =
2889*795d594fSAndroid Build Coastguard Worker     Riscv64ExtensionBit(Riscv64Extension::kZca) |
2890*795d594fSAndroid Build Coastguard Worker     Riscv64ExtensionBit(Riscv64Extension::kZcd) |
2891*795d594fSAndroid Build Coastguard Worker     Riscv64ExtensionBit(Riscv64Extension::kZcb);
2892*795d594fSAndroid Build Coastguard Worker 
2893*795d594fSAndroid Build Coastguard Worker using ScopedNoCInstructions = ScopedExtensionsExclusion<kRiscv64CompressedExtensionsMask>;
2894*795d594fSAndroid Build Coastguard Worker using ScopedUseCInstructions = ScopedExtensionsInclusion<kRiscv64CompressedExtensionsMask>;
2895*795d594fSAndroid Build Coastguard Worker 
2896*795d594fSAndroid Build Coastguard Worker }  // namespace riscv64
2897*795d594fSAndroid Build Coastguard Worker }  // namespace art
2898*795d594fSAndroid Build Coastguard Worker 
2899*795d594fSAndroid Build Coastguard Worker #endif  // ART_COMPILER_UTILS_RISCV64_ASSEMBLER_RISCV64_H_
2900