Path: blob/master/dep/biscuit/src/assembler_vector.cpp
4253 views
#include <biscuit/assert.hpp>1#include <biscuit/assembler.hpp>23namespace biscuit {4namespace {56enum class AddressingMode : uint32_t {7// clang-format off8UnitStride = 0b00,9IndexedUnordered = 0b01,10Strided = 0b10,11IndexedOrdered = 0b11,12// clang-format on13};1415enum class UnitStrideLoadAddressingMode : uint32_t {16// clang-format off17Load = 0b00000,18MaskLoad = 0b01011,19LoadFaultOnlyFirst = 0b10000,20// clang-format on21};2223enum class UnitStrideStoreAddressingMode : uint32_t {24// clang-format off25Store = 0b00000,26MaskStore = 0b01011,27// clang-format on28};2930enum class WidthEncoding : uint32_t {31// clang-format off32E8 = 0b000,33E16 = 0b101,34E32 = 0b110,35E64 = 0b111,36// clang-format on37};3839void EmitVectorLoadImpl(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,40VecMask vm, uint32_t lumop, GPR rs, WidthEncoding width, Vec vd) noexcept {41BISCUIT_ASSERT(nf <= 8);4243// Fit to encoding space. Allows for being more explicit about the size in calling functions44// (e.g. using 8 for 8 elements instead of 7).45if (nf != 0) {46nf -= 1;47}4849// clang-format off50const auto value = (nf << 29) |51(static_cast<uint32_t>(mew) << 28) |52(static_cast<uint32_t>(mop) << 26) |53(static_cast<uint32_t>(vm) << 25) |54(lumop << 20) |55(rs.Index() << 15) |56(static_cast<uint32_t>(width) << 12) |57(vd.Index() << 7);58// clang-format on5960buffer.Emit32(value | 0b111);61}6263void EmitVectorLoad(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,64VecMask vm, UnitStrideLoadAddressingMode lumop, GPR rs,65WidthEncoding width, Vec vd) noexcept {66EmitVectorLoadImpl(buffer, nf, mew, mop, vm, static_cast<uint32_t>(lumop), rs, width, vd);67}6869void EmitVectorLoad(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,70VecMask vm, GPR rs2, GPR rs1, WidthEncoding width, Vec vd) noexcept {71EmitVectorLoadImpl(buffer, nf, mew, mop, vm, rs2.Index(), rs1, width, vd);72}7374void EmitVectorLoad(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,75VecMask vm, Vec vs2, GPR rs1, WidthEncoding width, Vec vd) noexcept {76EmitVectorLoadImpl(buffer, nf, mew, mop, vm, vs2.Index(), rs1, width, vd);77}7879void EmitVectorLoadWholeReg(CodeBuffer& buffer, uint32_t nf, bool mew, GPR rs,80WidthEncoding width, Vec vd) noexcept {81// RISC-V V extension spec (as of 1.0RC) only allows these nf values.82BISCUIT_ASSERT(nf == 1 || nf == 2 || nf == 4 || nf == 8);8384EmitVectorLoadImpl(buffer, nf, mew, AddressingMode::UnitStride,85VecMask::No, 0b01000, rs, width, vd);86}8788void EmitVectorStoreImpl(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,89VecMask vm, uint32_t sumop, GPR rs, WidthEncoding width, Vec vd) noexcept {90BISCUIT_ASSERT(nf <= 8);9192// Fit to encoding space. Allows for being more explicit about the size in calling functions93// (e.g. using 8 for 8 elements instead of 7).94if (nf != 0) {95nf -= 1;96}9798// clang-format off99const auto value = (nf << 29) |100(static_cast<uint32_t>(mew) << 28) |101(static_cast<uint32_t>(mop) << 26) |102(static_cast<uint32_t>(vm) << 25) |103(sumop << 20) |104(rs.Index() << 15) |105(static_cast<uint32_t>(width) << 12) |106(vd.Index() << 7);107// clang-format on108109buffer.Emit32(value | 0b100111);110}111112void EmitVectorStore(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,113VecMask vm, UnitStrideStoreAddressingMode lumop, GPR rs,114WidthEncoding width, Vec vs) noexcept {115EmitVectorStoreImpl(buffer, nf, mew, mop, vm, static_cast<uint32_t>(lumop), rs, width, vs);116}117118void EmitVectorStore(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,119VecMask vm, GPR rs2, GPR rs1, WidthEncoding width, Vec vs3) noexcept {120EmitVectorStoreImpl(buffer, nf, mew, mop, vm, rs2.Index(), rs1, width, vs3);121}122123void EmitVectorStore(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,124VecMask vm, Vec vs2, GPR rs1, WidthEncoding width, Vec vs3) noexcept {125EmitVectorStoreImpl(buffer, nf, mew, mop, vm, vs2.Index(), rs1, width, vs3);126}127128void EmitVectorStoreWholeReg(CodeBuffer& buffer, uint32_t nf, GPR rs, Vec vs) noexcept {129// RISC-V V extension spec (as of 1.0RC) only allows these nf values.130BISCUIT_ASSERT(nf == 1 || nf == 2 || nf == 4 || nf == 8);131132EmitVectorStoreImpl(buffer, nf, false, AddressingMode::UnitStride, VecMask::No,1330b01000, rs, WidthEncoding::E8, vs);134}135136void EmitVectorOPIVIImpl(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, uint32_t imm5, Vec vd) noexcept {137// clang-format off138const auto value = (funct6 << 26) |139(static_cast<uint32_t>(vm) << 25) |140(vs2.Index() << 20) |141((imm5 & 0b11111) << 15) |142(0b011U << 12) |143(vd.Index() << 7);144// clang-format on145146buffer.Emit32(value | 0b1010111);147}148149void EmitVectorOPIVI(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, int32_t simm5, Vec vd) noexcept {150BISCUIT_ASSERT(simm5 >= -16 && simm5 <= 15);151EmitVectorOPIVIImpl(buffer, funct6, vm, vs2, static_cast<uint32_t>(simm5), vd);152}153154void EmitVectorOPIVUI(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, uint32_t uimm5, Vec vd) noexcept {155BISCUIT_ASSERT(uimm5 <= 31);156EmitVectorOPIVIImpl(buffer, funct6, vm, vs2, uimm5, vd);157}158159void EmitVectorOPIVV(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, Vec vs1, Vec vd) noexcept {160// clang-format off161const auto value = (funct6 << 26) |162(static_cast<uint32_t>(vm) << 25) |163(vs2.Index() << 20) |164(vs1.Index() << 15) |165(vd.Index() << 7);166// clang-format on167168buffer.Emit32(value | 0b1010111);169}170171void EmitVectorOPIVX(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, GPR rs1, Vec vd) noexcept {172// clang-format off173const auto value = (funct6 << 26) |174(static_cast<uint32_t>(vm) << 25) |175(vs2.Index() << 20) |176(rs1.Index() << 15) |177(0b100U << 12) |178(vd.Index() << 7);179// clang-format on180181buffer.Emit32(value | 0b1010111);182}183184void EmitVectorOPMVV(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, Vec vs1, Vec vd) noexcept {185// clang-format off186const auto value = (funct6 << 26) |187(static_cast<uint32_t>(vm) << 25) |188(vs2.Index() << 20) |189(vs1.Index() << 15) |190(0b010U << 12) |191(vd.Index() << 7);192// clang-format on193194buffer.Emit32(value | 0b1010111);195}196197void EmitVectorOPMVX(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, GPR rs1, Vec vd) noexcept {198// clang-format off199const auto value = (funct6 << 26) |200(static_cast<uint32_t>(vm) << 25) |201(vs2.Index() << 20) |202(rs1.Index() << 15) |203(0b110U << 12) |204(vd.Index() << 7);205// clang-format on206207buffer.Emit32(value | 0b1010111);208}209210void EmitVectorOPFVV(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, Vec vs1, Vec vd) noexcept {211// clang-format off212const auto value = (funct6 << 26) |213(static_cast<uint32_t>(vm) << 25) |214(vs2.Index() << 20) |215(vs1.Index() << 15) |216(0b001U << 12) |217(vd.Index() << 7);218// clang-format on219220buffer.Emit32(value | 0b1010111);221}222223void EmitVectorOPFVF(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, FPR rs1, Vec vd) noexcept {224// clang-format off225const auto value = (funct6 << 26) |226(static_cast<uint32_t>(vm) << 25) |227(vs2.Index() << 20) |228(rs1.Index() << 15) |229(0b101U << 12) |230(vd.Index() << 7);231// clang-format on232233buffer.Emit32(value | 0b1010111);234}235} // Anonymous namespace236237// Vector Integer Arithmetic Instructions238239void Assembler::VAADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {240EmitVectorOPMVV(m_buffer, 0b001001, mask, vs2, vs1, vd);241}242243void Assembler::VAADD(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {244EmitVectorOPMVX(m_buffer, 0b001001, mask, vs2, rs1, vd);245}246247void Assembler::VAADDU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {248EmitVectorOPMVV(m_buffer, 0b001000, mask, vs2, vs1, vd);249}250251void Assembler::VAADDU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {252EmitVectorOPMVX(m_buffer, 0b001000, mask, vs2, rs1, vd);253}254255void Assembler::VADC(Vec vd, Vec vs2, Vec vs1) noexcept {256EmitVectorOPIVV(m_buffer, 0b010000, VecMask::Yes, vs2, vs1, vd);257}258259void Assembler::VADC(Vec vd, Vec vs2, GPR rs1) noexcept {260EmitVectorOPIVX(m_buffer, 0b010000, VecMask::Yes, vs2, rs1, vd);261}262263void Assembler::VADC(Vec vd, Vec vs2, int32_t simm) noexcept {264EmitVectorOPIVI(m_buffer, 0b010000, VecMask::Yes, vs2, simm, vd);265}266267void Assembler::VADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {268EmitVectorOPIVV(m_buffer, 0b000000, mask, vs2, vs1, vd);269}270271void Assembler::VADD(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {272EmitVectorOPIVX(m_buffer, 0b000000, mask, vs2, rs1, vd);273}274275void Assembler::VADD(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {276EmitVectorOPIVI(m_buffer, 0b000000, mask, vs2, simm, vd);277}278279void Assembler::VAND(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {280EmitVectorOPIVV(m_buffer, 0b001001, mask, vs2, vs1, vd);281}282283void Assembler::VAND(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {284EmitVectorOPIVX(m_buffer, 0b001001, mask, vs2, rs1, vd);285}286287void Assembler::VAND(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {288EmitVectorOPIVI(m_buffer, 0b001001, mask, vs2, simm, vd);289}290291void Assembler::VASUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {292EmitVectorOPMVV(m_buffer, 0b001011, mask, vs2, vs1, vd);293}294295void Assembler::VASUB(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {296EmitVectorOPMVX(m_buffer, 0b001011, mask, vs2, rs1, vd);297}298299void Assembler::VASUBU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {300EmitVectorOPMVV(m_buffer, 0b001010, mask, vs2, vs1, vd);301}302303void Assembler::VASUBU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {304EmitVectorOPMVX(m_buffer, 0b001010, mask, vs2, rs1, vd);305}306307void Assembler::VCOMPRESS(Vec vd, Vec vs2, Vec vs1) noexcept {308// Note: Destination register may not overlap any of the source registers,309// as per the RVV spec (as of 1.0RC; see section 16.5)310EmitVectorOPMVV(m_buffer, 0b010111, VecMask::No, vs2, vs1, vd);311}312313void Assembler::VDIV(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {314EmitVectorOPMVV(m_buffer, 0b100001, mask, vs2, vs1, vd);315}316317void Assembler::VDIV(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {318EmitVectorOPMVX(m_buffer, 0b100001, mask, vs2, rs1, vd);319}320321void Assembler::VDIVU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {322EmitVectorOPMVV(m_buffer, 0b100000, mask, vs2, vs1, vd);323}324325void Assembler::VDIVU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {326EmitVectorOPMVX(m_buffer, 0b100000, mask, vs2, rs1, vd);327}328329void Assembler::VFIRST(GPR rd, Vec vs, VecMask mask) noexcept {330EmitVectorOPMVV(m_buffer, 0b010000, mask, vs, v17, Vec{rd.Index()});331}332333void Assembler::VID(Vec vd, VecMask mask) noexcept {334EmitVectorOPMVV(m_buffer, 0b010100, mask, v0, v17, vd);335}336337void Assembler::VIOTA(Vec vd, Vec vs, VecMask mask) noexcept {338EmitVectorOPMVV(m_buffer, 0b010100, mask, vs, v16, vd);339}340341void Assembler::VMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {342EmitVectorOPMVV(m_buffer, 0b101101, mask, vs2, vs1, vd);343}344345void Assembler::VMACC(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {346EmitVectorOPMVX(m_buffer, 0b101101, mask, vs2, rs1, vd);347}348349void Assembler::VMADC(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {350EmitVectorOPIVV(m_buffer, 0b010001, mask, vs2, vs1, vd);351}352353void Assembler::VMADC(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {354EmitVectorOPIVX(m_buffer, 0b010001, mask, vs2, rs1, vd);355}356357void Assembler::VMADC(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {358EmitVectorOPIVI(m_buffer, 0b010001, mask, vs2, simm, vd);359}360361void Assembler::VMADD(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {362EmitVectorOPMVV(m_buffer, 0b101001, mask, vs2, vs1, vd);363}364365void Assembler::VMADD(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {366EmitVectorOPMVX(m_buffer, 0b101001, mask, vs2, rs1, vd);367}368369void Assembler::VMAND(Vec vd, Vec vs2, Vec vs1) noexcept {370EmitVectorOPMVV(m_buffer, 0b011001, VecMask::No, vs2, vs1, vd);371}372373void Assembler::VMANDNOT(Vec vd, Vec vs2, Vec vs1) noexcept {374EmitVectorOPMVV(m_buffer, 0b011000, VecMask::No, vs2, vs1, vd);375}376377void Assembler::VMNAND(Vec vd, Vec vs2, Vec vs1) noexcept {378EmitVectorOPMVV(m_buffer, 0b011101, VecMask::No, vs2, vs1, vd);379}380381void Assembler::VMNOR(Vec vd, Vec vs2, Vec vs1) noexcept {382EmitVectorOPMVV(m_buffer, 0b011110, VecMask::No, vs2, vs1, vd);383}384385void Assembler::VMOR(Vec vd, Vec vs2, Vec vs1) noexcept {386EmitVectorOPMVV(m_buffer, 0b011010, VecMask::No, vs2, vs1, vd);387}388389void Assembler::VMORNOT(Vec vd, Vec vs2, Vec vs1) noexcept {390EmitVectorOPMVV(m_buffer, 0b011100, VecMask::No, vs2, vs1, vd);391}392393void Assembler::VMXNOR(Vec vd, Vec vs2, Vec vs1) noexcept {394EmitVectorOPMVV(m_buffer, 0b011111, VecMask::No, vs2, vs1, vd);395}396397void Assembler::VMXOR(Vec vd, Vec vs2, Vec vs1) noexcept {398EmitVectorOPMVV(m_buffer, 0b011011, VecMask::No, vs2, vs1, vd);399}400401void Assembler::VMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {402EmitVectorOPIVV(m_buffer, 0b000111, mask, vs2, vs1, vd);403}404405void Assembler::VMAX(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {406EmitVectorOPIVX(m_buffer, 0b000111, mask, vs2, rs1, vd);407}408409void Assembler::VMAXU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {410EmitVectorOPIVV(m_buffer, 0b000110, mask, vs2, vs1, vd);411}412413void Assembler::VMAXU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {414EmitVectorOPIVX(m_buffer, 0b000110, mask, vs2, rs1, vd);415}416417void Assembler::VMERGE(Vec vd, Vec vs2, Vec vs1) noexcept {418EmitVectorOPIVV(m_buffer, 0b010111, VecMask::Yes, vs2, vs1, vd);419}420421void Assembler::VMERGE(Vec vd, Vec vs2, GPR rs1) noexcept {422EmitVectorOPIVX(m_buffer, 0b010111, VecMask::Yes, vs2, rs1, vd);423}424425void Assembler::VMERGE(Vec vd, Vec vs2, int32_t simm) noexcept {426EmitVectorOPIVI(m_buffer, 0b010111, VecMask::Yes, vs2, simm, vd);427}428429void Assembler::VMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {430EmitVectorOPIVV(m_buffer, 0b000101, mask, vs2, vs1, vd);431}432433void Assembler::VMIN(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {434EmitVectorOPIVX(m_buffer, 0b000101, mask, vs2, rs1, vd);435}436437void Assembler::VMINU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {438EmitVectorOPIVV(m_buffer, 0b000100, mask, vs2, vs1, vd);439}440441void Assembler::VMINU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {442EmitVectorOPIVX(m_buffer, 0b000100, mask, vs2, rs1, vd);443}444445void Assembler::VMSBC(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {446EmitVectorOPIVV(m_buffer, 0b010011, mask, vs2, vs1, vd);447}448449void Assembler::VMSBC(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {450EmitVectorOPIVX(m_buffer, 0b010011, mask, vs2, rs1, vd);451}452453void Assembler::VMSBF(Vec vd, Vec vs, VecMask mask) noexcept {454EmitVectorOPMVV(m_buffer, 0b010100, mask, vs, v1, vd);455}456457void Assembler::VMSIF(Vec vd, Vec vs, VecMask mask) noexcept {458EmitVectorOPMVV(m_buffer, 0b010100, mask, vs, v3, vd);459}460461void Assembler::VMSOF(Vec vd, Vec vs, VecMask mask) noexcept {462EmitVectorOPMVV(m_buffer, 0b010100, mask, vs, v2, vd);463}464465void Assembler::VMSEQ(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {466EmitVectorOPIVV(m_buffer, 0b011000, mask, vs2, vs1, vd);467}468469void Assembler::VMSEQ(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {470EmitVectorOPIVX(m_buffer, 0b011000, mask, vs2, rs1, vd);471}472473void Assembler::VMSEQ(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {474EmitVectorOPIVI(m_buffer, 0b011000, mask, vs2, simm, vd);475}476477void Assembler::VMSGT(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {478EmitVectorOPIVX(m_buffer, 0b011111, mask, vs2, rs1, vd);479}480481void Assembler::VMSGT(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {482EmitVectorOPIVI(m_buffer, 0b011111, mask, vs2, simm, vd);483}484485void Assembler::VMSGTU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {486EmitVectorOPIVX(m_buffer, 0b011110, mask, vs2, rs1, vd);487}488489void Assembler::VMSGTU(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {490EmitVectorOPIVI(m_buffer, 0b011110, mask, vs2, simm, vd);491}492493void Assembler::VMSLE(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {494EmitVectorOPIVV(m_buffer, 0b011101, mask, vs2, vs1, vd);495}496497void Assembler::VMSLE(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {498EmitVectorOPIVX(m_buffer, 0b011101, mask, vs2, rs1, vd);499}500501void Assembler::VMSLE(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {502EmitVectorOPIVI(m_buffer, 0b011101, mask, vs2, simm, vd);503}504505void Assembler::VMSLEU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {506EmitVectorOPIVV(m_buffer, 0b011100, mask, vs2, vs1, vd);507}508509void Assembler::VMSLEU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {510EmitVectorOPIVX(m_buffer, 0b011100, mask, vs2, rs1, vd);511}512513void Assembler::VMSLEU(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {514EmitVectorOPIVI(m_buffer, 0b011100, mask, vs2, simm, vd);515}516517void Assembler::VMSLT(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {518EmitVectorOPIVV(m_buffer, 0b011011, mask, vs2, vs1, vd);519}520521void Assembler::VMSLT(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {522EmitVectorOPIVX(m_buffer, 0b011011, mask, vs2, rs1, vd);523}524525void Assembler::VMSLTU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {526EmitVectorOPIVV(m_buffer, 0b011010, mask, vs2, vs1, vd);527}528529void Assembler::VMSLTU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {530EmitVectorOPIVX(m_buffer, 0b011010, mask, vs2, rs1, vd);531}532533void Assembler::VMSNE(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {534EmitVectorOPIVV(m_buffer, 0b011001, mask, vs2, vs1, vd);535}536537void Assembler::VMSNE(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {538EmitVectorOPIVX(m_buffer, 0b011001, mask, vs2, rs1, vd);539}540541void Assembler::VMSNE(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {542EmitVectorOPIVI(m_buffer, 0b011001, mask, vs2, simm, vd);543}544545void Assembler::VMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {546EmitVectorOPMVV(m_buffer, 0b100101, mask, vs2, vs1, vd);547}548549void Assembler::VMUL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {550EmitVectorOPMVX(m_buffer, 0b100101, mask, vs2, rs1, vd);551}552553void Assembler::VMULH(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {554EmitVectorOPMVV(m_buffer, 0b100111, mask, vs2, vs1, vd);555}556557void Assembler::VMULH(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {558EmitVectorOPMVX(m_buffer, 0b100111, mask, vs2, rs1, vd);559}560561void Assembler::VMULHSU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {562EmitVectorOPMVV(m_buffer, 0b100110, mask, vs2, vs1, vd);563}564565void Assembler::VMULHSU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {566EmitVectorOPMVX(m_buffer, 0b100110, mask, vs2, rs1, vd);567}568569void Assembler::VMULHU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {570EmitVectorOPMVV(m_buffer, 0b100100, mask, vs2, vs1, vd);571}572573void Assembler::VMULHU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {574EmitVectorOPMVX(m_buffer, 0b100100, mask, vs2, rs1, vd);575}576577void Assembler::VMV(Vec vd, Vec vs1) noexcept {578EmitVectorOPIVV(m_buffer, 0b010111, VecMask::No, v0, vs1, vd);579}580581void Assembler::VMV(Vec vd, GPR rs1) noexcept {582EmitVectorOPIVX(m_buffer, 0b010111, VecMask::No, v0, rs1, vd);583}584585void Assembler::VMV(Vec vd, int32_t simm) noexcept {586EmitVectorOPIVI(m_buffer, 0b010111, VecMask::No, v0, simm, vd);587}588589void Assembler::VMV1R(Vec vd, Vec vs) noexcept {590EmitVectorOPIVI(m_buffer, 0b100111, VecMask::No, vs, 0b00000, vd);591}592593void Assembler::VMV2R(Vec vd, Vec vs) noexcept {594// Registers must be aligned to the register group size, per the595// RVV spec (as of 1.0RC)596BISCUIT_ASSERT(vd.Index() % 2 == 0);597BISCUIT_ASSERT(vs.Index() % 2 == 0);598599EmitVectorOPIVI(m_buffer, 0b100111, VecMask::No, vs, 0b00001, vd);600}601602void Assembler::VMV4R(Vec vd, Vec vs) noexcept {603// Registers must be aligned to the register group size, per the604// RVV spec (as of 1.0RC)605BISCUIT_ASSERT(vd.Index() % 4 == 0);606BISCUIT_ASSERT(vs.Index() % 4 == 0);607608EmitVectorOPIVI(m_buffer, 0b100111, VecMask::No, vs, 0b00011, vd);609}610611void Assembler::VMV8R(Vec vd, Vec vs) noexcept {612// Registers must be aligned to the register group size, per the613// RVV spec (as of 1.0RC)614BISCUIT_ASSERT(vd.Index() % 8 == 0);615BISCUIT_ASSERT(vs.Index() % 8 == 0);616617EmitVectorOPIVI(m_buffer, 0b100111, VecMask::No, vs, 0b00111, vd);618}619620void Assembler::VMV_SX(Vec vd, GPR rs) noexcept {621EmitVectorOPMVX(m_buffer, 0b010000, VecMask::No, v0, rs, vd);622}623624void Assembler::VMV_XS(GPR rd, Vec vs) noexcept {625EmitVectorOPMVV(m_buffer, 0b010000, VecMask::No, vs, v0, Vec{rd.Index()});626}627628void Assembler::VNCLIP(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {629EmitVectorOPIVV(m_buffer, 0b101111, mask, vs2, vs1, vd);630}631632void Assembler::VNCLIP(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {633EmitVectorOPIVX(m_buffer, 0b101111, mask, vs2, rs1, vd);634}635636void Assembler::VNCLIP(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {637EmitVectorOPIVUI(m_buffer, 0b101111, mask, vs2, uimm, vd);638}639640void Assembler::VNCLIPU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {641EmitVectorOPIVV(m_buffer, 0b101110, mask, vs2, vs1, vd);642}643644void Assembler::VNCLIPU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {645EmitVectorOPIVX(m_buffer, 0b101110, mask, vs2, rs1, vd);646}647648void Assembler::VNCLIPU(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {649EmitVectorOPIVUI(m_buffer, 0b101110, mask, vs2, uimm, vd);650}651652void Assembler::VNMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {653EmitVectorOPMVV(m_buffer, 0b101111, mask, vs2, vs1, vd);654}655656void Assembler::VNMSAC(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {657EmitVectorOPMVX(m_buffer, 0b101111, mask, vs2, rs1, vd);658}659660void Assembler::VNMSUB(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {661EmitVectorOPMVV(m_buffer, 0b101011, mask, vs2, vs1, vd);662}663664void Assembler::VNMSUB(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {665EmitVectorOPMVX(m_buffer, 0b101011, mask, vs2, rs1, vd);666}667668void Assembler::VNSRA(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {669EmitVectorOPIVV(m_buffer, 0b101101, mask, vs2, vs1, vd);670}671672void Assembler::VNSRA(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {673EmitVectorOPIVX(m_buffer, 0b101101, mask, vs2, rs1, vd);674}675676void Assembler::VNSRA(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {677EmitVectorOPIVUI(m_buffer, 0b101101, mask, vs2, uimm, vd);678}679680void Assembler::VNSRL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {681EmitVectorOPIVV(m_buffer, 0b101100, mask, vs2, vs1, vd);682}683684void Assembler::VNSRL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {685EmitVectorOPIVX(m_buffer, 0b101100, mask, vs2, rs1, vd);686}687688void Assembler::VNSRL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {689EmitVectorOPIVUI(m_buffer, 0b101100, mask, vs2, uimm, vd);690}691692void Assembler::VOR(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {693EmitVectorOPIVV(m_buffer, 0b001010, mask, vs2, vs1, vd);694}695696void Assembler::VOR(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {697EmitVectorOPIVX(m_buffer, 0b001010, mask, vs2, rs1, vd);698}699700void Assembler::VOR(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {701EmitVectorOPIVI(m_buffer, 0b001010, mask, vs2, simm, vd);702}703704void Assembler::VPOPC(GPR rd, Vec vs, VecMask mask) noexcept {705EmitVectorOPMVV(m_buffer, 0b010000, mask, vs, v16, Vec{rd.Index()});706}707708void Assembler::VREDAND(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {709EmitVectorOPMVV(m_buffer, 0b000001, mask, vs2, vs1, vd);710}711712void Assembler::VREDMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {713EmitVectorOPMVV(m_buffer, 0b000111, mask, vs2, vs1, vd);714}715716void Assembler::VREDMAXU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {717EmitVectorOPMVV(m_buffer, 0b000110, mask, vs2, vs1, vd);718}719720void Assembler::VREDMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {721EmitVectorOPMVV(m_buffer, 0b000101, mask, vs2, vs1, vd);722}723724void Assembler::VREDMINU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {725EmitVectorOPMVV(m_buffer, 0b000100, mask, vs2, vs1, vd);726}727728void Assembler::VREDOR(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {729EmitVectorOPMVV(m_buffer, 0b000010, mask, vs2, vs1, vd);730}731732void Assembler::VREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {733EmitVectorOPMVV(m_buffer, 0b000000, mask, vs2, vs1, vd);734}735736void Assembler::VREDXOR(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {737EmitVectorOPMVV(m_buffer, 0b000011, mask, vs2, vs1, vd);738}739740void Assembler::VREM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {741EmitVectorOPMVV(m_buffer, 0b100011, mask, vs2, vs1, vd);742}743744void Assembler::VREM(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {745EmitVectorOPMVX(m_buffer, 0b100011, mask, vs2, rs1, vd);746}747748void Assembler::VREMU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {749EmitVectorOPMVV(m_buffer, 0b100010, mask, vs2, vs1, vd);750}751752void Assembler::VREMU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {753EmitVectorOPMVX(m_buffer, 0b100010, mask, vs2, rs1, vd);754}755756void Assembler::VRGATHER(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {757EmitVectorOPIVV(m_buffer, 0b001100, mask, vs2, vs1, vd);758}759760void Assembler::VRGATHER(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {761EmitVectorOPIVX(m_buffer, 0b001100, mask, vs2, rs1, vd);762}763764void Assembler::VRGATHER(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {765EmitVectorOPIVUI(m_buffer, 0b001100, mask, vs2, uimm, vd);766}767768void Assembler::VRGATHEREI16(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {769EmitVectorOPIVV(m_buffer, 0b001110, mask, vs2, vs1, vd);770}771772void Assembler::VRSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {773EmitVectorOPIVX(m_buffer, 0b000011, mask, vs2, rs1, vd);774}775776void Assembler::VRSUB(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {777EmitVectorOPIVI(m_buffer, 0b000011, mask, vs2, simm, vd);778}779780void Assembler::VSADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {781EmitVectorOPIVV(m_buffer, 0b100001, mask, vs2, vs1, vd);782}783784void Assembler::VSADD(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {785EmitVectorOPIVX(m_buffer, 0b100001, mask, vs2, rs1, vd);786}787788void Assembler::VSADD(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {789EmitVectorOPIVI(m_buffer, 0b100001, mask, vs2, simm, vd);790}791792void Assembler::VSADDU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {793EmitVectorOPIVV(m_buffer, 0b100000, mask, vs2, vs1, vd);794}795796void Assembler::VSADDU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {797EmitVectorOPIVX(m_buffer, 0b100000, mask, vs2, rs1, vd);798}799800void Assembler::VSADDU(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {801EmitVectorOPIVI(m_buffer, 0b100000, mask, vs2, simm, vd);802}803804void Assembler::VSBC(Vec vd, Vec vs2, Vec vs1) noexcept {805EmitVectorOPIVV(m_buffer, 0b010010, VecMask::Yes, vs2, vs1, vd);806}807808void Assembler::VSBC(Vec vd, Vec vs2, GPR rs1) noexcept {809EmitVectorOPIVX(m_buffer, 0b010010, VecMask::Yes, vs2, rs1, vd);810}811812void Assembler::VSEXTVF2(Vec vd, Vec vs, VecMask mask) noexcept {813EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v7, vd);814}815816void Assembler::VSEXTVF4(Vec vd, Vec vs, VecMask mask) noexcept {817EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v5, vd);818}819820void Assembler::VSEXTVF8(Vec vd, Vec vs, VecMask mask) noexcept {821EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v3, vd);822}823824void Assembler::VSLIDE1DOWN(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {825EmitVectorOPMVX(m_buffer, 0b001111, mask, vs2, rs1, vd);826}827828void Assembler::VSLIDEDOWN(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {829EmitVectorOPIVX(m_buffer, 0b001111, mask, vs2, rs1, vd);830}831832void Assembler::VSLIDEDOWN(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {833EmitVectorOPIVUI(m_buffer, 0b001111, mask, vs2, uimm, vd);834}835836void Assembler::VSLIDE1UP(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {837EmitVectorOPMVX(m_buffer, 0b001110, mask, vs2, rs1, vd);838}839840void Assembler::VSLIDEUP(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {841EmitVectorOPIVX(m_buffer, 0b001110, mask, vs2, rs1, vd);842}843844void Assembler::VSLIDEUP(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {845EmitVectorOPIVUI(m_buffer, 0b001110, mask, vs2, uimm, vd);846}847848void Assembler::VSLL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {849EmitVectorOPIVV(m_buffer, 0b100101, mask, vs2, vs1, vd);850}851852void Assembler::VSLL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {853EmitVectorOPIVX(m_buffer, 0b100101, mask, vs2, rs1, vd);854}855856void Assembler::VSLL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {857EmitVectorOPIVUI(m_buffer, 0b100101, mask, vs2, uimm, vd);858}859860void Assembler::VSMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {861EmitVectorOPIVV(m_buffer, 0b100111, mask, vs2, vs1, vd);862}863864void Assembler::VSMUL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {865EmitVectorOPIVX(m_buffer, 0b100111, mask, vs2, rs1, vd);866}867868void Assembler::VSRA(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {869EmitVectorOPIVV(m_buffer, 0b101001, mask, vs2, vs1, vd);870}871872void Assembler::VSRA(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {873EmitVectorOPIVX(m_buffer, 0b101001, mask, vs2, rs1, vd);874}875876void Assembler::VSRA(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {877EmitVectorOPIVUI(m_buffer, 0b101001, mask, vs2, uimm, vd);878}879880void Assembler::VSRL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {881EmitVectorOPIVV(m_buffer, 0b101000, mask, vs2, vs1, vd);882}883884void Assembler::VSRL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {885EmitVectorOPIVX(m_buffer, 0b101000, mask, vs2, rs1, vd);886}887888void Assembler::VSRL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {889EmitVectorOPIVUI(m_buffer, 0b101000, mask, vs2, uimm, vd);890}891892void Assembler::VSSRA(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {893EmitVectorOPIVV(m_buffer, 0b101011, mask, vs2, vs1, vd);894}895896void Assembler::VSSRA(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {897EmitVectorOPIVX(m_buffer, 0b101011, mask, vs2, rs1, vd);898}899900void Assembler::VSSRA(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {901EmitVectorOPIVUI(m_buffer, 0b101011, mask, vs2, uimm, vd);902}903904void Assembler::VSSRL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {905EmitVectorOPIVV(m_buffer, 0b101010, mask, vs2, vs1, vd);906}907908void Assembler::VSSRL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {909EmitVectorOPIVX(m_buffer, 0b101010, mask, vs2, rs1, vd);910}911912void Assembler::VSSRL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {913EmitVectorOPIVUI(m_buffer, 0b101010, mask, vs2, uimm, vd);914}915916void Assembler::VSSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {917EmitVectorOPIVV(m_buffer, 0b100011, mask, vs2, vs1, vd);918}919920void Assembler::VSSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {921EmitVectorOPIVX(m_buffer, 0b100011, mask, vs2, rs1, vd);922}923924void Assembler::VSSUBU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {925EmitVectorOPIVV(m_buffer, 0b100010, mask, vs2, vs1, vd);926}927928void Assembler::VSSUBU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {929EmitVectorOPIVX(m_buffer, 0b100010, mask, vs2, rs1, vd);930}931932void Assembler::VSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {933EmitVectorOPIVV(m_buffer, 0b000010, mask, vs2, vs1, vd);934}935936void Assembler::VSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {937EmitVectorOPIVX(m_buffer, 0b000010, mask, vs2, rs1, vd);938}939940void Assembler::VWADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {941EmitVectorOPMVV(m_buffer, 0b110001, mask, vs2, vs1, vd);942}943944void Assembler::VWADD(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {945EmitVectorOPMVX(m_buffer, 0b110001, mask, vs2, rs1, vd);946}947948void Assembler::VWADDW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {949EmitVectorOPMVV(m_buffer, 0b110101, mask, vs2, vs1, vd);950}951952void Assembler::VWADDW(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {953EmitVectorOPMVX(m_buffer, 0b110101, mask, vs2, rs1, vd);954}955956void Assembler::VWADDU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {957EmitVectorOPMVV(m_buffer, 0b110000, mask, vs2, vs1, vd);958}959960void Assembler::VWADDU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {961EmitVectorOPMVX(m_buffer, 0b110000, mask, vs2, rs1, vd);962}963964void Assembler::VWADDUW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {965EmitVectorOPMVV(m_buffer, 0b110100, mask, vs2, vs1, vd);966}967968void Assembler::VWADDUW(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {969EmitVectorOPMVX(m_buffer, 0b110100, mask, vs2, rs1, vd);970}971972void Assembler::VWMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {973EmitVectorOPMVV(m_buffer, 0b111101, mask, vs2, vs1, vd);974}975976void Assembler::VWMACC(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {977EmitVectorOPMVX(m_buffer, 0b111101, mask, vs2, rs1, vd);978}979980void Assembler::VWMACCSU(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {981EmitVectorOPMVV(m_buffer, 0b111111, mask, vs2, vs1, vd);982}983984void Assembler::VWMACCSU(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {985EmitVectorOPMVX(m_buffer, 0b111111, mask, vs2, rs1, vd);986}987988void Assembler::VWMACCU(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {989EmitVectorOPMVV(m_buffer, 0b111100, mask, vs2, vs1, vd);990}991992void Assembler::VWMACCU(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {993EmitVectorOPMVX(m_buffer, 0b111100, mask, vs2, rs1, vd);994}995996void Assembler::VWMACCUS(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {997EmitVectorOPMVX(m_buffer, 0b111110, mask, vs2, rs1, vd);998}9991000void Assembler::VWMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1001EmitVectorOPMVV(m_buffer, 0b111011, mask, vs2, vs1, vd);1002}10031004void Assembler::VWMUL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {1005EmitVectorOPMVX(m_buffer, 0b111011, mask, vs2, rs1, vd);1006}10071008void Assembler::VWMULSU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1009EmitVectorOPMVV(m_buffer, 0b111010, mask, vs2, vs1, vd);1010}10111012void Assembler::VWMULSU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {1013EmitVectorOPMVX(m_buffer, 0b111010, mask, vs2, rs1, vd);1014}10151016void Assembler::VWMULU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1017EmitVectorOPMVV(m_buffer, 0b111000, mask, vs2, vs1, vd);1018}10191020void Assembler::VWMULU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {1021EmitVectorOPMVX(m_buffer, 0b111000, mask, vs2, rs1, vd);1022}10231024void Assembler::VWREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1025EmitVectorOPIVV(m_buffer, 0b110001, mask, vs2, vs1, vd);1026}10271028void Assembler::VWREDSUMU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1029EmitVectorOPIVV(m_buffer, 0b110000, mask, vs2, vs1, vd);1030}10311032void Assembler::VWSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1033EmitVectorOPMVV(m_buffer, 0b110011, mask, vs2, vs1, vd);1034}10351036void Assembler::VWSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {1037EmitVectorOPMVX(m_buffer, 0b110011, mask, vs2, rs1, vd);1038}10391040void Assembler::VWSUBW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1041EmitVectorOPMVV(m_buffer, 0b110111, mask, vs2, vs1, vd);1042}10431044void Assembler::VWSUBW(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {1045EmitVectorOPMVX(m_buffer, 0b110111, mask, vs2, rs1, vd);1046}10471048void Assembler::VWSUBU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1049EmitVectorOPMVV(m_buffer, 0b110010, mask, vs2, vs1, vd);1050}10511052void Assembler::VWSUBU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {1053EmitVectorOPMVX(m_buffer, 0b110010, mask, vs2, rs1, vd);1054}10551056void Assembler::VWSUBUW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1057EmitVectorOPMVV(m_buffer, 0b110110, mask, vs2, vs1, vd);1058}10591060void Assembler::VWSUBUW(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {1061EmitVectorOPMVX(m_buffer, 0b110110, mask, vs2, rs1, vd);1062}10631064void Assembler::VXOR(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1065EmitVectorOPIVV(m_buffer, 0b001011, mask, vs2, vs1, vd);1066}10671068void Assembler::VXOR(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {1069EmitVectorOPIVX(m_buffer, 0b001011, mask, vs2, rs1, vd);1070}10711072void Assembler::VXOR(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {1073EmitVectorOPIVI(m_buffer, 0b001011, mask, vs2, simm, vd);1074}10751076void Assembler::VZEXTVF2(Vec vd, Vec vs, VecMask mask) noexcept {1077EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v6, vd);1078}10791080void Assembler::VZEXTVF4(Vec vd, Vec vs, VecMask mask) noexcept {1081EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v4, vd);1082}10831084void Assembler::VZEXTVF8(Vec vd, Vec vs, VecMask mask) noexcept {1085EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v2, vd);1086}10871088// Vector Floating-Point Instructions10891090void Assembler::VFADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1091EmitVectorOPFVV(m_buffer, 0b000000, mask, vs2, vs1, vd);1092}10931094void Assembler::VFADD(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1095EmitVectorOPFVF(m_buffer, 0b000000, mask, vs2, rs1, vd);1096}10971098void Assembler::VFCLASS(Vec vd, Vec vs, VecMask mask) noexcept {1099EmitVectorOPFVV(m_buffer, 0b010011, mask, vs, v16, vd);1100}11011102void Assembler::VFCVT_F_X(Vec vd, Vec vs, VecMask mask) noexcept {1103EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v3, vd);1104}11051106void Assembler::VFCVT_F_XU(Vec vd, Vec vs, VecMask mask) noexcept {1107EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v2, vd);1108}11091110void Assembler::VFCVT_RTZ_X_F(Vec vd, Vec vs, VecMask mask) noexcept {1111EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v7, vd);1112}11131114void Assembler::VFCVT_RTZ_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {1115EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v6, vd);1116}11171118void Assembler::VFCVT_X_F(Vec vd, Vec vs, VecMask mask) noexcept {1119EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v1, vd);1120}11211122void Assembler::VFCVT_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {1123EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v0, vd);1124}11251126void Assembler::VFNCVT_F_F(Vec vd, Vec vs, VecMask mask) noexcept {1127EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v20, vd);1128}11291130void Assembler::VFNCVT_F_X(Vec vd, Vec vs, VecMask mask) noexcept {1131EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v19, vd);1132}11331134void Assembler::VFNCVT_F_XU(Vec vd, Vec vs, VecMask mask) noexcept {1135EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v18, vd);1136}11371138void Assembler::VFNCVT_ROD_F_F(Vec vd, Vec vs, VecMask mask) noexcept {1139EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v21, vd);1140}11411142void Assembler::VFNCVT_RTZ_X_F(Vec vd, Vec vs, VecMask mask) noexcept {1143EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v23, vd);1144}11451146void Assembler::VFNCVT_RTZ_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {1147EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v22, vd);1148}11491150void Assembler::VFNCVT_X_F(Vec vd, Vec vs, VecMask mask) noexcept {1151EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v17, vd);1152}11531154void Assembler::VFNCVT_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {1155EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v16, vd);1156}11571158void Assembler::VFWCVT_F_F(Vec vd, Vec vs, VecMask mask) noexcept {1159EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v12, vd);1160}11611162void Assembler::VFWCVT_F_X(Vec vd, Vec vs, VecMask mask) noexcept {1163EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v11, vd);1164}11651166void Assembler::VFWCVT_F_XU(Vec vd, Vec vs, VecMask mask) noexcept {1167EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v10, vd);1168}11691170void Assembler::VFWCVT_RTZ_X_F(Vec vd, Vec vs, VecMask mask) noexcept {1171EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v15, vd);1172}11731174void Assembler::VFWCVT_RTZ_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {1175EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v14, vd);1176}11771178void Assembler::VFWCVT_X_F(Vec vd, Vec vs, VecMask mask) noexcept {1179EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v9, vd);1180}11811182void Assembler::VFWCVT_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {1183EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v8, vd);1184}11851186void Assembler::VFDIV(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1187EmitVectorOPFVV(m_buffer, 0b100000, mask, vs2, vs1, vd);1188}11891190void Assembler::VFDIV(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1191EmitVectorOPFVF(m_buffer, 0b100000, mask, vs2, rs1, vd);1192}11931194void Assembler::VFRDIV(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1195EmitVectorOPFVF(m_buffer, 0b100001, mask, vs2, rs1, vd);1196}11971198void Assembler::VFREDMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1199EmitVectorOPFVV(m_buffer, 0b000111, mask, vs2, vs1, vd);1200}12011202void Assembler::VFREDMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1203EmitVectorOPFVV(m_buffer, 0b000101, mask, vs2, vs1, vd);1204}12051206void Assembler::VFREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1207EmitVectorOPFVV(m_buffer, 0b000001, mask, vs2, vs1, vd);1208}12091210void Assembler::VFREDOSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1211EmitVectorOPFVV(m_buffer, 0b000011, mask, vs2, vs1, vd);1212}12131214void Assembler::VFMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1215EmitVectorOPFVV(m_buffer, 0b101100, mask, vs2, vs1, vd);1216}12171218void Assembler::VFMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1219EmitVectorOPFVF(m_buffer, 0b101100, mask, vs2, rs1, vd);1220}12211222void Assembler::VFMADD(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1223EmitVectorOPFVV(m_buffer, 0b101000, mask, vs2, vs1, vd);1224}12251226void Assembler::VFMADD(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1227EmitVectorOPFVF(m_buffer, 0b101000, mask, vs2, rs1, vd);1228}12291230void Assembler::VFMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1231EmitVectorOPFVV(m_buffer, 0b000110, mask, vs2, vs1, vd);1232}12331234void Assembler::VFMAX(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1235EmitVectorOPFVF(m_buffer, 0b000110, mask, vs2, rs1, vd);1236}12371238void Assembler::VFMERGE(Vec vd, Vec vs2, FPR rs1) noexcept {1239EmitVectorOPFVF(m_buffer, 0b010111, VecMask::Yes, vs2, rs1, vd);1240}12411242void Assembler::VFMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1243EmitVectorOPFVV(m_buffer, 0b000100, mask, vs2, vs1, vd);1244}12451246void Assembler::VFMIN(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1247EmitVectorOPFVF(m_buffer, 0b000100, mask, vs2, rs1, vd);1248}12491250void Assembler::VFMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1251EmitVectorOPFVV(m_buffer, 0b101110, mask, vs2, vs1, vd);1252}12531254void Assembler::VFMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1255EmitVectorOPFVF(m_buffer, 0b101110, mask, vs2, rs1, vd);1256}12571258void Assembler::VFMSUB(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1259EmitVectorOPFVV(m_buffer, 0b101010, mask, vs2, vs1, vd);1260}12611262void Assembler::VFMSUB(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1263EmitVectorOPFVF(m_buffer, 0b101010, mask, vs2, rs1, vd);1264}12651266void Assembler::VFMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1267EmitVectorOPFVV(m_buffer, 0b100100, mask, vs2, vs1, vd);1268}12691270void Assembler::VFMUL(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1271EmitVectorOPFVF(m_buffer, 0b100100, mask, vs2, rs1, vd);1272}12731274void Assembler::VFMV(Vec vd, FPR rs) noexcept {1275EmitVectorOPFVF(m_buffer, 0b010111, VecMask::No, v0, rs, vd);1276}12771278void Assembler::VFMV_FS(FPR rd, Vec vs) noexcept {1279EmitVectorOPFVV(m_buffer, 0b010000, VecMask::No, vs, v0, Vec{rd.Index()});1280}12811282void Assembler::VFMV_SF(Vec vd, FPR rs) noexcept {1283EmitVectorOPFVF(m_buffer, 0b010000, VecMask::No, v0, rs, vd);1284}12851286void Assembler::VFNMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1287EmitVectorOPFVV(m_buffer, 0b101101, mask, vs2, vs1, vd);1288}12891290void Assembler::VFNMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1291EmitVectorOPFVF(m_buffer, 0b101101, mask, vs2, rs1, vd);1292}12931294void Assembler::VFNMADD(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1295EmitVectorOPFVV(m_buffer, 0b101001, mask, vs2, vs1, vd);1296}12971298void Assembler::VFNMADD(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1299EmitVectorOPFVF(m_buffer, 0b101001, mask, vs2, rs1, vd);1300}13011302void Assembler::VFNMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1303EmitVectorOPFVV(m_buffer, 0b101111, mask, vs2, vs1, vd);1304}13051306void Assembler::VFNMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1307EmitVectorOPFVF(m_buffer, 0b101111, mask, vs2, rs1, vd);1308}13091310void Assembler::VFNMSUB(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1311EmitVectorOPFVV(m_buffer, 0b101011, mask, vs2, vs1, vd);1312}13131314void Assembler::VFNMSUB(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1315EmitVectorOPFVF(m_buffer, 0b101011, mask, vs2, rs1, vd);1316}13171318void Assembler::VFREC7(Vec vd, Vec vs, VecMask mask) noexcept {1319EmitVectorOPFVV(m_buffer, 0b010011, mask, vs, v5, vd);1320}13211322void Assembler::VFSGNJ(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1323EmitVectorOPFVV(m_buffer, 0b001000, mask, vs2, vs1, vd);1324}13251326void Assembler::VFSGNJ(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1327EmitVectorOPFVF(m_buffer, 0b001000, mask, vs2, rs1, vd);1328}13291330void Assembler::VFSGNJN(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1331EmitVectorOPFVV(m_buffer, 0b001001, mask, vs2, vs1, vd);1332}13331334void Assembler::VFSGNJN(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1335EmitVectorOPFVF(m_buffer, 0b001001, mask, vs2, rs1, vd);1336}13371338void Assembler::VFSGNJX(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1339EmitVectorOPFVV(m_buffer, 0b001010, mask, vs2, vs1, vd);1340}13411342void Assembler::VFSGNJX(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1343EmitVectorOPFVF(m_buffer, 0b001010, mask, vs2, rs1, vd);1344}13451346void Assembler::VFSQRT(Vec vd, Vec vs, VecMask mask) noexcept {1347EmitVectorOPFVV(m_buffer, 0b010011, mask, vs, v0, vd);1348}13491350void Assembler::VFRSQRT7(Vec vd, Vec vs, VecMask mask) noexcept {1351EmitVectorOPFVV(m_buffer, 0b010011, mask, vs, v4, vd);1352}13531354void Assembler::VFSLIDE1DOWN(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1355EmitVectorOPFVF(m_buffer, 0b001111, mask, vs2, rs1, vd);1356}13571358void Assembler::VFSLIDE1UP(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1359EmitVectorOPFVF(m_buffer, 0b001110, mask, vs2, rs1, vd);1360}13611362void Assembler::VFSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1363EmitVectorOPFVV(m_buffer, 0b000010, mask, vs2, vs1, vd);1364}13651366void Assembler::VFSUB(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1367EmitVectorOPFVF(m_buffer, 0b000010, mask, vs2, rs1, vd);1368}13691370void Assembler::VFRSUB(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1371EmitVectorOPFVF(m_buffer, 0b100111, mask, vs2, rs1, vd);1372}13731374void Assembler::VFWADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1375EmitVectorOPFVV(m_buffer, 0b110000, mask, vs2, vs1, vd);1376}13771378void Assembler::VFWADD(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1379EmitVectorOPFVF(m_buffer, 0b110000, mask, vs2, rs1, vd);1380}13811382void Assembler::VFWADDW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1383EmitVectorOPFVV(m_buffer, 0b110100, mask, vs2, vs1, vd);1384}13851386void Assembler::VFWADDW(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1387EmitVectorOPFVF(m_buffer, 0b110100, mask, vs2, rs1, vd);1388}13891390void Assembler::VFWMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1391EmitVectorOPFVV(m_buffer, 0b111100, mask, vs2, vs1, vd);1392}13931394void Assembler::VFWMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1395EmitVectorOPFVF(m_buffer, 0b111100, mask, vs2, rs1, vd);1396}13971398void Assembler::VFWMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1399EmitVectorOPFVV(m_buffer, 0b111000, mask, vs2, vs1, vd);1400}14011402void Assembler::VFWMUL(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1403EmitVectorOPFVF(m_buffer, 0b111000, mask, vs2, rs1, vd);1404}14051406void Assembler::VFWNMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1407EmitVectorOPFVV(m_buffer, 0b111101, mask, vs2, vs1, vd);1408}14091410void Assembler::VFWNMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1411EmitVectorOPFVF(m_buffer, 0b111101, mask, vs2, rs1, vd);1412}14131414void Assembler::VFWNMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1415EmitVectorOPFVV(m_buffer, 0b111111, mask, vs2, vs1, vd);1416}14171418void Assembler::VFWNMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1419EmitVectorOPFVF(m_buffer, 0b111111, mask, vs2, rs1, vd);1420}14211422void Assembler::VFWREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1423EmitVectorOPFVV(m_buffer, 0b110001, mask, vs2, vs1, vd);1424}14251426void Assembler::VFWREDOSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1427EmitVectorOPFVV(m_buffer, 0b110011, mask, vs2, vs1, vd);1428}14291430void Assembler::VFWMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {1431EmitVectorOPFVV(m_buffer, 0b111110, mask, vs2, vs1, vd);1432}14331434void Assembler::VFWMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {1435EmitVectorOPFVF(m_buffer, 0b111110, mask, vs2, rs1, vd);1436}14371438void Assembler::VFWSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1439EmitVectorOPFVV(m_buffer, 0b110010, mask, vs2, vs1, vd);1440}14411442void Assembler::VFWSUB(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1443EmitVectorOPFVF(m_buffer, 0b110010, mask, vs2, rs1, vd);1444}14451446void Assembler::VFWSUBW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1447EmitVectorOPFVV(m_buffer, 0b110110, mask, vs2, vs1, vd);1448}14491450void Assembler::VFWSUBW(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1451EmitVectorOPFVF(m_buffer, 0b110110, mask, vs2, rs1, vd);1452}14531454void Assembler::VMFEQ(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1455EmitVectorOPFVV(m_buffer, 0b011000, mask, vs2, vs1, vd);1456}14571458void Assembler::VMFEQ(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1459EmitVectorOPFVF(m_buffer, 0b011000, mask, vs2, rs1, vd);1460}14611462void Assembler::VMFGE(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1463EmitVectorOPFVF(m_buffer, 0b011111, mask, vs2, rs1, vd);1464}14651466void Assembler::VMFGT(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1467EmitVectorOPFVF(m_buffer, 0b011101, mask, vs2, rs1, vd);1468}14691470void Assembler::VMFLE(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1471EmitVectorOPFVV(m_buffer, 0b011001, mask, vs2, vs1, vd);1472}14731474void Assembler::VMFLE(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1475EmitVectorOPFVF(m_buffer, 0b011001, mask, vs2, rs1, vd);1476}14771478void Assembler::VMFLT(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1479EmitVectorOPFVV(m_buffer, 0b011011, mask, vs2, vs1, vd);1480}14811482void Assembler::VMFLT(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1483EmitVectorOPFVF(m_buffer, 0b011011, mask, vs2, rs1, vd);1484}14851486void Assembler::VMFNE(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {1487EmitVectorOPFVV(m_buffer, 0b011100, mask, vs2, vs1, vd);1488}14891490void Assembler::VMFNE(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {1491EmitVectorOPFVF(m_buffer, 0b011100, mask, vs2, rs1, vd);1492}14931494// Vector Load/Store Instructions14951496void Assembler::VLE8(Vec vd, GPR rs, VecMask mask) noexcept {1497VLSEGE8(1, vd, rs, mask);1498}14991500void Assembler::VLE16(Vec vd, GPR rs, VecMask mask) noexcept {1501VLSEGE16(1, vd, rs, mask);1502}15031504void Assembler::VLE32(Vec vd, GPR rs, VecMask mask) noexcept {1505VLSEGE32(1, vd, rs, mask);1506}15071508void Assembler::VLE64(Vec vd, GPR rs, VecMask mask) noexcept {1509VLSEGE64(1, vd, rs, mask);1510}15111512void Assembler::VLM(Vec vd, GPR rs) noexcept {1513EmitVectorLoad(m_buffer, 0b000, false, AddressingMode::UnitStride, VecMask::No,1514UnitStrideLoadAddressingMode::MaskLoad, rs, WidthEncoding::E8, vd);1515}15161517void Assembler::VLSE8(Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {1518VLSSEGE8(1, vd, rs1, rs2, mask);1519}15201521void Assembler::VLSE16(Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {1522VLSSEGE16(1, vd, rs1, rs2, mask);1523}15241525void Assembler::VLSE32(Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {1526VLSSEGE32(1, vd, rs1, rs2, mask);1527}15281529void Assembler::VLSE64(Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {1530VLSSEGE64(1, vd, rs1, rs2, mask);1531}15321533void Assembler::VLOXEI8(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1534VLOXSEGEI8(1, vd, rs, vs, mask);1535}15361537void Assembler::VLOXEI16(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1538VLOXSEGEI16(1, vd, rs, vs, mask);1539}15401541void Assembler::VLOXEI32(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1542VLOXSEGEI32(1, vd, rs, vs, mask);1543}15441545void Assembler::VLOXEI64(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1546VLOXSEGEI64(1, vd, rs, vs, mask);1547}15481549void Assembler::VLUXEI8(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1550VLUXSEGEI8(1, vd, rs, vs, mask);1551}15521553void Assembler::VLUXEI16(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1554VLUXSEGEI16(1, vd, rs, vs, mask);1555}15561557void Assembler::VLUXEI32(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1558VLUXSEGEI32(1, vd, rs, vs, mask);1559}15601561void Assembler::VLUXEI64(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1562VLUXSEGEI64(1, vd, rs, vs, mask);1563}15641565void Assembler::VLE8FF(Vec vd, GPR rs, VecMask mask) noexcept {1566EmitVectorLoad(m_buffer, 0b000, false, AddressingMode::UnitStride, mask,1567UnitStrideLoadAddressingMode::LoadFaultOnlyFirst, rs, WidthEncoding::E8, vd);1568}15691570void Assembler::VLE16FF(Vec vd, GPR rs, VecMask mask) noexcept {1571EmitVectorLoad(m_buffer, 0b000, false, AddressingMode::UnitStride, mask,1572UnitStrideLoadAddressingMode::LoadFaultOnlyFirst, rs, WidthEncoding::E16, vd);1573}15741575void Assembler::VLE32FF(Vec vd, GPR rs, VecMask mask) noexcept {1576EmitVectorLoad(m_buffer, 0b000, false, AddressingMode::UnitStride, mask,1577UnitStrideLoadAddressingMode::LoadFaultOnlyFirst, rs, WidthEncoding::E32, vd);1578}15791580void Assembler::VLE64FF(Vec vd, GPR rs, VecMask mask) noexcept {1581EmitVectorLoad(m_buffer, 0b000, false, AddressingMode::UnitStride, mask,1582UnitStrideLoadAddressingMode::LoadFaultOnlyFirst, rs, WidthEncoding::E64, vd);1583}15841585void Assembler::VLSEGE8(uint32_t num_segments, Vec vd, GPR rs, VecMask mask) noexcept {1586EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,1587UnitStrideLoadAddressingMode::Load, rs, WidthEncoding::E8, vd);1588}15891590void Assembler::VLSEGE16(uint32_t num_segments, Vec vd, GPR rs, VecMask mask) noexcept {1591EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,1592UnitStrideLoadAddressingMode::Load, rs, WidthEncoding::E16, vd);1593}15941595void Assembler::VLSEGE32(uint32_t num_segments, Vec vd, GPR rs, VecMask mask) noexcept {1596EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,1597UnitStrideLoadAddressingMode::Load, rs, WidthEncoding::E32, vd);1598}15991600void Assembler::VLSEGE64(uint32_t num_segments, Vec vd, GPR rs, VecMask mask) noexcept {1601EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,1602UnitStrideLoadAddressingMode::Load, rs, WidthEncoding::E64, vd);1603}16041605void Assembler::VLSSEGE8(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {1606EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::Strided, mask,1607rs2, rs1, WidthEncoding::E8, vd);1608}16091610void Assembler::VLSSEGE16(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {1611EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::Strided, mask,1612rs2, rs1, WidthEncoding::E16, vd);1613}16141615void Assembler::VLSSEGE32(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {1616EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::Strided, mask,1617rs2, rs1, WidthEncoding::E32, vd);1618}16191620void Assembler::VLSSEGE64(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {1621EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::Strided, mask,1622rs2, rs1, WidthEncoding::E64, vd);1623}16241625void Assembler::VLOXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1626EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,1627vs, rs, WidthEncoding::E8, vd);1628}16291630void Assembler::VLOXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1631EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,1632vs, rs, WidthEncoding::E16, vd);1633}16341635void Assembler::VLOXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1636EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,1637vs, rs, WidthEncoding::E32, vd);1638}16391640void Assembler::VLOXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1641EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,1642vs, rs, WidthEncoding::E64, vd);1643}16441645void Assembler::VLUXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1646EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,1647vs, rs, WidthEncoding::E8, vd);1648}16491650void Assembler::VLUXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1651EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,1652vs, rs, WidthEncoding::E16, vd);1653}16541655void Assembler::VLUXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1656EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,1657vs, rs, WidthEncoding::E32, vd);1658}16591660void Assembler::VLUXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1661EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,1662vs, rs, WidthEncoding::E64, vd);1663}16641665void Assembler::VLRE8(uint32_t num_registers, Vec vd, GPR rs) noexcept {1666BISCUIT_ASSERT(vd.Index() % num_registers == 0);1667EmitVectorLoadWholeReg(m_buffer, num_registers, false, rs, WidthEncoding::E8, vd);1668}16691670void Assembler::VL1RE8(Vec vd, GPR rs) noexcept {1671VLRE8(1, vd, rs);1672}16731674void Assembler::VL2RE8(Vec vd, GPR rs) noexcept {1675VLRE8(2, vd, rs);1676}16771678void Assembler::VL4RE8(Vec vd, GPR rs) noexcept {1679VLRE8(4, vd, rs);1680}16811682void Assembler::VL8RE8(Vec vd, GPR rs) noexcept {1683VLRE8(8, vd, rs);1684}16851686void Assembler::VLRE16(uint32_t num_registers, Vec vd, GPR rs) noexcept {1687BISCUIT_ASSERT(vd.Index() % num_registers == 0);1688EmitVectorLoadWholeReg(m_buffer, num_registers, false, rs, WidthEncoding::E16, vd);1689}16901691void Assembler::VL1RE16(Vec vd, GPR rs) noexcept {1692VLRE16(1, vd, rs);1693}16941695void Assembler::VL2RE16(Vec vd, GPR rs) noexcept {1696VLRE16(2, vd, rs);1697}16981699void Assembler::VL4RE16(Vec vd, GPR rs) noexcept {1700VLRE16(4, vd, rs);1701}17021703void Assembler::VL8RE16(Vec vd, GPR rs) noexcept {1704VLRE16(8, vd, rs);1705}17061707void Assembler::VLRE32(uint32_t num_registers, Vec vd, GPR rs) noexcept {1708BISCUIT_ASSERT(vd.Index() % num_registers == 0);1709EmitVectorLoadWholeReg(m_buffer, num_registers, false, rs, WidthEncoding::E32, vd);1710}17111712void Assembler::VL1RE32(Vec vd, GPR rs) noexcept {1713VLRE32(1, vd, rs);1714}17151716void Assembler::VL2RE32(Vec vd, GPR rs) noexcept {1717VLRE32(2, vd, rs);1718}17191720void Assembler::VL4RE32(Vec vd, GPR rs) noexcept {1721VLRE32(4, vd, rs);1722}17231724void Assembler::VL8RE32(Vec vd, GPR rs) noexcept {1725VLRE32(8, vd, rs);1726}17271728void Assembler::VLRE64(uint32_t num_registers, Vec vd, GPR rs) noexcept {1729BISCUIT_ASSERT(vd.Index() % num_registers == 0);1730EmitVectorLoadWholeReg(m_buffer, num_registers, false, rs, WidthEncoding::E64, vd);1731}17321733void Assembler::VL1RE64(Vec vd, GPR rs) noexcept {1734VLRE64(1, vd, rs);1735}17361737void Assembler::VL2RE64(Vec vd, GPR rs) noexcept {1738VLRE64(2, vd, rs);1739}17401741void Assembler::VL4RE64(Vec vd, GPR rs) noexcept {1742VLRE64(4, vd, rs);1743}17441745void Assembler::VL8RE64(Vec vd, GPR rs) noexcept {1746VLRE64(8, vd, rs);1747}17481749void Assembler::VSE8(Vec vs, GPR rs, VecMask mask) noexcept {1750VSSEGE8(1, vs, rs, mask);1751}17521753void Assembler::VSE16(Vec vs, GPR rs, VecMask mask) noexcept {1754VSSEGE16(1, vs, rs, mask);1755}17561757void Assembler::VSE32(Vec vs, GPR rs, VecMask mask) noexcept {1758VSSEGE32(1, vs, rs, mask);1759}17601761void Assembler::VSE64(Vec vs, GPR rs, VecMask mask) noexcept {1762VSSEGE64(1, vs, rs, mask);1763}17641765void Assembler::VSM(Vec vs, GPR rs) noexcept {1766EmitVectorStore(m_buffer, 0b000, false, AddressingMode::UnitStride, VecMask::No,1767UnitStrideStoreAddressingMode::MaskStore, rs, WidthEncoding::E8, vs);1768}17691770void Assembler::VSSE8(Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {1771VSSSEGE8(1, vs, rs1, rs2, mask);1772}17731774void Assembler::VSSE16(Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {1775VSSSEGE16(1, vs, rs1, rs2, mask);1776}17771778void Assembler::VSSE32(Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {1779VSSSEGE32(1, vs, rs1, rs2, mask);1780}17811782void Assembler::VSSE64(Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {1783VSSSEGE64(1, vs, rs1, rs2, mask);1784}17851786void Assembler::VSOXEI8(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1787VSOXSEGEI8(1, vd, rs, vs, mask);1788}17891790void Assembler::VSOXEI16(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1791VSOXSEGEI16(1, vd, rs, vs, mask);1792}17931794void Assembler::VSOXEI32(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1795VSOXSEGEI32(1, vd, rs, vs, mask);1796}17971798void Assembler::VSOXEI64(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1799VSOXSEGEI64(1, vd, rs, vs, mask);1800}18011802void Assembler::VSUXEI8(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1803VSUXSEGEI8(1, vd, rs, vs, mask);1804}18051806void Assembler::VSUXEI16(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1807VSUXSEGEI16(1, vd, rs, vs, mask);1808}18091810void Assembler::VSUXEI32(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1811VSUXSEGEI32(1, vd, rs, vs, mask);1812}18131814void Assembler::VSUXEI64(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1815VSUXSEGEI64(1, vd, rs, vs, mask);1816}18171818void Assembler::VSSEGE8(uint32_t num_segments, Vec vs, GPR rs, VecMask mask) noexcept {1819EmitVectorStore(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,1820UnitStrideStoreAddressingMode::Store, rs, WidthEncoding::E8, vs);1821}18221823void Assembler::VSSEGE16(uint32_t num_segments, Vec vs, GPR rs, VecMask mask) noexcept {1824EmitVectorStore(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,1825UnitStrideStoreAddressingMode::Store, rs, WidthEncoding::E16, vs);1826}18271828void Assembler::VSSEGE32(uint32_t num_segments, Vec vs, GPR rs, VecMask mask) noexcept {1829EmitVectorStore(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,1830UnitStrideStoreAddressingMode::Store, rs, WidthEncoding::E32, vs);1831}18321833void Assembler::VSSEGE64(uint32_t num_segments, Vec vs, GPR rs, VecMask mask) noexcept {1834EmitVectorStore(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,1835UnitStrideStoreAddressingMode::Store, rs, WidthEncoding::E64, vs);1836}18371838void Assembler::VSSSEGE8(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {1839EmitVectorStore(m_buffer, num_segments, false, AddressingMode::Strided, mask,1840rs2, rs1, WidthEncoding::E8, vs);1841}18421843void Assembler::VSSSEGE16(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {1844EmitVectorStore(m_buffer, num_segments, false, AddressingMode::Strided, mask,1845rs2, rs1, WidthEncoding::E16, vs);1846}18471848void Assembler::VSSSEGE32(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {1849EmitVectorStore(m_buffer, num_segments, false, AddressingMode::Strided, mask,1850rs2, rs1, WidthEncoding::E32, vs);1851}18521853void Assembler::VSSSEGE64(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {1854EmitVectorStore(m_buffer, num_segments, false, AddressingMode::Strided, mask,1855rs2, rs1, WidthEncoding::E64, vs);1856}18571858void Assembler::VSOXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1859EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,1860vs, rs, WidthEncoding::E8, vd);1861}18621863void Assembler::VSOXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1864EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,1865vs, rs, WidthEncoding::E16, vd);1866}18671868void Assembler::VSOXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1869EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,1870vs, rs, WidthEncoding::E32, vd);1871}18721873void Assembler::VSOXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1874EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,1875vs, rs, WidthEncoding::E64, vd);1876}18771878void Assembler::VSUXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1879EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,1880vs, rs, WidthEncoding::E8, vd);1881}18821883void Assembler::VSUXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1884EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,1885vs, rs, WidthEncoding::E16, vd);1886}18871888void Assembler::VSUXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1889EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,1890vs, rs, WidthEncoding::E32, vd);1891}18921893void Assembler::VSUXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {1894EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,1895vs, rs, WidthEncoding::E64, vd);1896}18971898void Assembler::VSR(uint32_t num_registers, Vec vs, GPR rs) noexcept {1899EmitVectorStoreWholeReg(m_buffer, num_registers, rs, vs);1900}19011902void Assembler::VS1R(Vec vs, GPR rs) noexcept {1903VSR(1, vs, rs);1904}19051906void Assembler::VS2R(Vec vs, GPR rs) noexcept {1907BISCUIT_ASSERT(vs.Index() % 2 == 0);1908VSR(2, vs, rs);1909}19101911void Assembler::VS4R(Vec vs, GPR rs) noexcept {1912BISCUIT_ASSERT(vs.Index() % 4 == 0);1913VSR(4, vs, rs);1914}19151916void Assembler::VS8R(Vec vs, GPR rs) noexcept {1917BISCUIT_ASSERT(vs.Index() % 8 == 0);1918VSR(8, vs, rs);1919}19201921void Assembler::VSETIVLI(GPR rd, uint32_t imm, SEW sew, LMUL lmul, VTA vta, VMA vma) noexcept {1922// Immediate must be able to fit in 5 bits.1923BISCUIT_ASSERT(imm <= 31);19241925// clang-format off1926const auto zimm = static_cast<uint32_t>(lmul) |1927(static_cast<uint32_t>(sew) << 3) |1928(static_cast<uint32_t>(vta) << 6) |1929(static_cast<uint32_t>(vma) << 7);1930// clang-format on19311932m_buffer.Emit32(0xC0007057U | (zimm << 20) | (imm << 15) | (rd.Index() << 7));1933}19341935void Assembler::VSETVL(GPR rd, GPR rs1, GPR rs2) noexcept {1936m_buffer.Emit32(0x80007057U | (rs2.Index() << 20) | (rs1.Index() << 15) | (rd.Index() << 7));1937}19381939void Assembler::VSETVLI(GPR rd, GPR rs, SEW sew, LMUL lmul, VTA vta, VMA vma) noexcept {1940// clang-format off1941const auto zimm = static_cast<uint32_t>(lmul) |1942(static_cast<uint32_t>(sew) << 3) |1943(static_cast<uint32_t>(vta) << 6) |1944(static_cast<uint32_t>(vma) << 7);1945// clang-format on19461947m_buffer.Emit32(0x00007057U | (zimm << 20) | (rs.Index() << 15) | (rd.Index() << 7));1948}19491950} // namespace biscuit195119521953