Refactor Kelvin isa file Split the kelvin.isa file into groups based on func1 encoding to improve the readability PiperOrigin-RevId: 553513487
diff --git a/sim/BUILD b/sim/BUILD index fdf1818..47c560d 100644 --- a/sim/BUILD +++ b/sim/BUILD
@@ -52,7 +52,13 @@ mpact_isa_decoder( name = "kelvin_isa", src = "kelvin.isa", - includes = [], + includes = [ + "kelvin_arith.isa", + "kelvin_base.isa", + "kelvin_memory.isa", + "kelvin_mul.isa", + "kelvin_shift.isa", + ], isa_name = "Kelvin", deps = [ ":kelvin_instructions",
diff --git a/sim/kelvin.isa b/sim/kelvin.isa index 6cf7aaa..db1a680 100644 --- a/sim/kelvin.isa +++ b/sim/kelvin.isa
@@ -11,3779 +11,15 @@ slots { kelvin; } } -// Basic integer ALU instructions, part of the RiscV 32i subset. -slot riscv32i { - includes { - #include "riscv/riscv_i_instructions.h" - } - default size = 4; - default latency = global_latency; - resources TwoOp = { next_pc, rs1 : rd[..rd]}; - resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]}; - opcodes { - addi{: rs1, I_imm12 : rd}, - resources: TwoOp, - disasm: "addi", "%rd, %rs1, %I_imm12", - semfunc: "&mpact::sim::riscv::RV32::RiscVIAdd"; - slti{: rs1, I_imm12 : rd}, - resources: TwoOp, - disasm: "slti", "%rd, %rs1, %I_imm12", - semfunc: "&mpact::sim::riscv::RV32::RiscVISlt"; - sltiu{: rs1, I_imm12 : rd}, - resources: TwoOp, - disasm: "sltiu", "%rd, %rs1, %I_imm12", - semfunc: "&mpact::sim::riscv::RV32::RiscVISltu"; - andi{: rs1, I_imm12 : rd}, - resources: TwoOp, - disasm: "andi", "%rd, %rs1, %I_imm12", - semfunc: "&mpact::sim::riscv::RV32::RiscVIAnd"; - ori{: rs1, I_imm12 : rd}, - resources: TwoOp, - disasm: "ori", "%rd, %rs1, %I_imm12", - semfunc: "&mpact::sim::riscv::RV32::RiscVIOr"; - xori{: rs1, I_imm12 : rd}, - resources: TwoOp, - disasm: "xori", "%rd, %rs1, %I_imm12", - semfunc: "&mpact::sim::riscv::RV32::RiscVIXor"; - slli{: rs1, I_uimm5 : rd}, - resources: TwoOp, - disasm: "slli", "%rd, %rs1, 0x%(I_uimm5:x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVISll"; - srli{: rs1, I_uimm5 : rd}, - resources: TwoOp, - disasm: "srli", "%rd %rs1, 0x%(I_uimm5:x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVISrl"; - srai{: rs1, I_uimm5 : rd}, - resources: TwoOp, - disasm: "srai", "%rd, %rs1, 0x%(I_uimm5:x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVISra"; - lui{: U_imm20 : rd}, - resources: { next_pc : rd[0..]}, - disasm: "lui", "%rd, 0x%(U_imm20:08x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVILui"; - auipc{: U_imm20 : rd}, - resources: { next_pc : rd[0..]}, - disasm: "auipc", "%rd, 0x%(U_imm20:08x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVIAuipc"; - add{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "add", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::RiscVIAdd"; - slt{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "slt", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::RiscVISlt"; - sltu{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "sltu", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::RiscVISltu"; - and{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "and", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::RiscVIAnd"; - or{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "or", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::RiscVIOr"; - xor{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "xor", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::RiscVIXor"; - sll{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "sll", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::RiscVISll"; - srl{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "srl", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::RiscVISrl"; - sub{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "sub", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::RiscVISub"; - sra{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "sra", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::RiscVISra"; - nop{}, - disasm: "nop", - semfunc: "&mpact::sim::riscv::RiscVINop"; - hint{}, - disasm: "hint", - semfunc: "&mpact::sim::riscv::RiscVINop"; - jal{: J_imm20 : next_pc, rd}, - resources: { next_pc : next_pc[0..], rd[0..]}, - disasm: "jal", "%rd, %(@+J_imm20:08x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVIJal"; - jalr{: rs1, J_imm12 : next_pc, rd}, - resources: { next_pc, rs1 : next_pc[0..], rd[0..]}, - disasm: "jalr", "%rd, %rs1, %J_imm12", - semfunc: "&mpact::sim::riscv::RV32::RiscVIJalr"; - j{: J_imm20 : next_pc, rd}, - resources: { next_pc : next_pc[0..], rd[0..]}, - disasm: "j", "%(@+J_imm20:08x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVIJal"; - jr{: rs1, J_imm12 : next_pc, rd}, - resources: { next_pc, rs1 : next_pc[0..], rd[0..]}, - disasm: "jr", "%rs1, %J_imm12", - semfunc: "&mpact::sim::riscv::RV32::RiscVIJalr"; - beq{: rs1, rs2, B_imm12 : next_pc}, - resources: { next_pc, rs1, rs2 : next_pc[0..]}, - disasm: "beq", "%rs1, %rs2, %(@+B_imm12:08x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVIBeq"; - bne{: rs1, rs2, B_imm12 : next_pc}, - resources: { next_pc, rs1, rs2 : next_pc[0..]}, - disasm: "bne", "%rs1, %rs2, %(@+B_imm12:08x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVIBne"; - blt{: rs1, rs2, B_imm12 : next_pc}, - resources: { next_pc, rs1, rs2 : next_pc[0..]}, - disasm: "blt", "%rs1, %rs2, %(@+B_imm12:08x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVIBlt"; - bltu{: rs1, rs2, B_imm12 : next_pc}, - resources: { next_pc, rs1, rs2 : next_pc[0..]}, - disasm: "bltu", "%rs1, %rs2, %(@+B_imm12:08x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVIBltu"; - bge{: rs1, rs2, B_imm12 : next_pc}, - resources: { next_pc, rs1, rs2 : next_pc[0..]}, - disasm: "bge", "%rs1, %rs2, %(@+B_imm12:08x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVIBge"; - bgeu{: rs1, rs2, B_imm12 : next_pc}, - resources: { next_pc, rs1, rs2 : next_pc[0..]}, - disasm: "bgeu", "%rs1, %rs2, %(@+B_imm12:08x)", - semfunc: "&mpact::sim::riscv::RV32::RiscVIBgeu"; - lw{(: rs1, I_imm12), (: : rd)}, - resources: { next_pc, rs1 : rd[0..]}, - disasm: "lw", "%rd, %I_imm12(%rs1)", - semfunc: "&mpact::sim::riscv::RV32::RiscVILw", "&mpact::sim::riscv::RV32::RiscVILwChild"; - lh{(: rs1, I_imm12 :), (: : rd)}, - resources: { next_pc, rs1 : rd[0..]}, - disasm: "lh", "%rd, %I_imm12(%rs1)", - semfunc: "&mpact::sim::riscv::RV32::RiscVILh", "&mpact::sim::riscv::RV32::RiscVILhChild"; - lhu{(: rs1, I_imm12 :), (: : rd)}, - resources: { next_pc, rs1 : rd[0..]}, - disasm: "lhu", "%rd, %I_imm12(%rs1)", - semfunc: "&mpact::sim::riscv::RV32::RiscVILhu", "&mpact::sim::riscv::RV32::RiscVILhuChild"; - lb{(: rs1, I_imm12 :), (: : rd)}, - resources: { next_pc, rs1 : rd[0..]}, - disasm: "lb", "%rd, %I_imm12(%rs1)", - semfunc: "&mpact::sim::riscv::RV32::RiscVILb", "&mpact::sim::riscv::RV32::RiscVILbChild"; - lbu{(: rs1, I_imm12 :), (: : rd)}, - resources: { next_pc, rs1 : rd[0..]}, - disasm: "lbu", "%rd, %I_imm12(%rs1)", - semfunc: "&mpact::sim::riscv::RV32::RiscVILbu", "&mpact::sim::riscv::RV32::RiscVILbuChild"; - sw{: rs1, S_imm12, rs2 : }, - resources: { next_pc, rs1, rs2 : }, - disasm: "sw", "%rs2, %S_imm12(%rs1)", - semfunc: "&mpact::sim::riscv::RV32::RiscVISw"; - sh{: rs1, S_imm12, rs2 : }, - resources: { next_pc, rs1, rs2 : }, - disasm: "sh", "%rs2, %S_imm12(%rs1)", - semfunc: "&mpact::sim::riscv::RV32::RiscVISh"; - sb{: rs1, S_imm12, rs2 : }, - resources: { next_pc, rs1, rs2 : }, - disasm: "sb", "%rs2, %S_imm12(%rs1)", - semfunc: "&mpact::sim::riscv::RV32::RiscVISb"; - fence{: I_imm12 : }, - disasm: "fence", - semfunc: "&mpact::sim::riscv::RiscVIFence"; - ecall{}, - disasm: "ecall", - semfunc: "&mpact::sim::riscv::RiscVIEcall"; - ebreak{}, - disasm: "ebreak", - semfunc: "&mpact::sim::riscv::RiscVIEbreak"; - } -} - -// RiscV32 multiply/divide instructions. -slot riscv32m { - includes { - #include "riscv/riscv_m_instructions.h" - } - default size = 4; - default latency = global_latency; - resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]}; - opcodes { - mul{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "mul", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::MMul"; - mulh{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "mulh", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::MMulh"; - mulhu{: rs1, rs2: rd}, - resources: ThreeOp, - disasm: "mulhu", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::MMulhu"; - mulhsu{: rs1, rs2: rd}, - resources: ThreeOp, - disasm: "mulhsu", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::MMulhsu"; - div{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "div", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::MDiv"; - divu{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "divu", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::MDivu"; - rem{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "rem", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::MRem"; - remu{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "remu", "%rd, %rs1, %rs2", - semfunc: "&mpact::sim::riscv::RV32::MRemu"; - } -} - -// RiscV32 CSR manipulation instructions. -slot zicsr { - includes { - #include "riscv/riscv_zicsr_instructions.h" - } - default size = 4; - default latency = global_latency; - opcodes { - csrrw{: rs1, csr : rd, csr}, - resources: { next_pc, rs1, csr : rd[0..], csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrw", - disasm: "csrw", "%rd, %csr, %rs1"; - csrrs{: rs1, csr : rd, csr}, - resources: { next_pc, rs1, csr : rd[0..], csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrs", - disasm: "csrs", "%rd, %csr, %rs1"; - csrrc{: rs1, csr : rd, csr}, - resources: { next_pc, rs1, csr : rd[0..], csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrc", - disasm: "csrc", "%rd, %csr, %rs1"; - csrrs_nr{: rs1, csr : rd, csr}, - resources: { next_pc, rs1, csr : rd[0..], csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrs", - disasm: "csrs", "%csr, %rs1"; - csrrc_nr{: rs1, csr : rd, csr}, - resources: { next_pc, rs1, csr : rd[0..], csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrc", - disasm: "csrc", "%csr, %rs1"; - csrrw_nr{: rs1, csr : csr}, - resources: { next_pc, rs1: csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrwNr", // rd == 0 (x0). - disasm: "csrw", "%csr, %rs1"; - csrrs_nw{: csr : rd}, - resources: { next_pc, csr: rd[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrNw", // rs1 == 0 (x0). - disasm: "csrs", "%rd, %csr"; - csrrc_nw{: csr : rd}, - resources: { next_pc, csr: rd[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrNw", // rs1 == 0 (x0). - disasm: "csrc", "%rd, %csr"; - csrrwi{: CSR_uimm5, csr : rd, csr}, - resources: { next_pc, csr: rd[0..], csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrw", - disasm: "csrwi", "%rd, %csr, %CSR_uimm5"; - csrrsi{: CSR_uimm5, csr : rd, csr}, - resources: { next_pc, csr: rd[0..], csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrs", - disasm: "csrsi", "%rd, %csr, %CSR_uimm5"; - csrrci{: CSR_uimm5, csr : rd, csr}, - resources: { next_pc, csr: rd[0..], csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrc", - disasm: "csrci", "%rd, %csr, %CSR_uimm5"; - csrrsi_nr{: CSR_uimm5, csr : rd, csr}, - resources: { next_pc, csr: rd[0..], csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrs", - disasm: "csrsi", "%csr, %CSR_uimm5"; - csrrci_nr{: CSR_uimm5, csr : rd, csr}, - resources: { next_pc, csr: rd[0..], csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrc", - disasm: "csrci", "%csr, %CSR_uimm5"; - csrrwi_nr{: CSR_uimm5, csr : csr}, - resources: { next_pc : csr[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrwNr", // rd == 0 (x0). - disasm: "csrrwi", "%csr, %CSR_uimm5"; - csrrsi_nw{: csr : rd}, - resources: { next_pc, csr : rd[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrNw", // uimm5 == 0. - disasm: "csrsi", "%rd, %csr, 0"; - csrrci_nw{: csr : rd}, - resources: { next_pc, csr : rd[0..]}, - semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrNw", // uimm5 == 0. - disasm: "csrwi", "%rd, %csr, 0"; - } -} - -// Instruction fence. -slot zfencei { - includes { - #include "riscv/riscv_zfencei_instructions.h" - } - default size = 4; - default latency = global_latency; - opcodes { - fencei{: I_imm12 : }, - disasm: "fence.i", - semfunc: "&mpact::sim::riscv::RiscVZFencei"; - } -} - -// Privileged instructions. -slot privileged { - includes { - #include "riscv/riscv_priv_instructions.h" - } - default size = 4; - default latency = global_latency; - opcodes { - uret{: : next_pc}, - disasm: "uret", - semfunc: "&mpact::sim::riscv::RV32::RiscVPrivURet"; - sret{: : next_pc}, - disasm: "sret", - semfunc: "&mpact::sim::riscv::RV32::RiscVPrivSRet"; - mret{: : next_pc}, - disasm: "mret", - semfunc: "&mpact::sim::riscv::RV32::RiscVPrivMRet"; - wfi{}, - disasm: "wfi", - semfunc: "&mpact::sim::riscv::RiscVPrivWfi"; - mpause{}, - disasm: "mpause", - // mpause is the software breakpoint to terminate the program. - semfunc: "&KelvinIMpause"; - // The sfence instruction has 4 behaviors depending on if rs1 and/or rs2 - // are 0. These behaviors are split into 4 instructions. - sfence_vma_zz{: rs1, rs2}, - resources: {}, - disasm: "sfence.vma", "%rs1, %rs2", - semfunc: "&mpact::sim::riscv::RiscVPrivSFenceVmaZZ"; - sfence_vma_zn{: rs1, rs2}, - resources: {rs2}, - disasm: "sfence.vma", "%rs1, %rs2", - semfunc: "&mpact::sim::riscv::RiscVPrivSFenceVmaZN"; - sfence_vma_nz{: rs1, rs2}, - resources: { rs1 }, - disasm: "sfence.vma", "%rs1, %rs2", - semfunc: "&mpact::sim::riscv::RiscVPrivSFenceVmaNZ"; - sfence_vma_nn{: rs1, rs2}, - resources: {rs1, rs2}, - disasm: "sfence.vma", "%rs1, %rs2", - semfunc: "&mpact::sim::riscv::RiscVPrivSFenceVmaNN"; - // Skipping hypervisor memory management instructions for now. - } -} - -// Kelvin simd instructions: -// https://spacebeaker.googlesource.com/shodan/sw/kelvin/+/refs/heads/master/docs/kelvin_isa.md -slot kelvin_arith { - includes { - #include "sim/kelvin_instructions.h" - #include "sim/kelvin_vector_instructions.h" - #include "sim/kelvin_vector_memory_instructions.h" - #include "absl/functional/bind_front.h" - } - default size = 4; - default latency = global_latency; - opcodes { - // vadd - vadd_b_vv{: vs1, vs2 : vd}, - disasm: "vadd.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadd_b_vv_m{: vs1, vs2 : vd}, - disasm: "vadd.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadd_h_vv{: vs1, vs2 : vd}, - disasm: "vadd.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadd_h_vv_m{: vs1, vs2 : vd}, - disasm: "vadd.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadd_w_vv{: vs1, vs2 : vd}, - disasm: "vadd.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadd_w_vv_m{: vs1, vs2 : vd}, - disasm: "vadd.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadd_b_vx{: vs1, vs2 : vd}, - disasm: "vadd.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadd_b_vx_m{: vs1, vs2 : vd}, - disasm: "vadd.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vadd_h_vx{: vs1, vs2 : vd}, - disasm: "vadd.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadd_h_vx_m{: vs1, vs2 : vd}, - disasm: "vadd.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vadd_w_vx{: vs1, vs2 : vd}, - disasm: "vadd.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadd_w_vx_m{: vs1, vs2 : vd}, - disasm: "vadd.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vsub - vsub_b_vv{: vs1, vs2 : vd}, - disasm: "vsub.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsub_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsub.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsub_h_vv{: vs1, vs2 : vd}, - disasm: "vsub.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsub_h_vv_m{: vs1, vs2 : vd}, - disasm: "vsub.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsub_w_vv{: vs1, vs2 : vd}, - disasm: "vsub.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsub_w_vv_m{: vs1, vs2 : vd}, - disasm: "vsub.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsub_b_vx{: vs1, vs2 : vd}, - disasm: "vsub.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsub_b_vx_m{: vs1, vs2 : vd}, - disasm: "vsub.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsub_h_vx{: vs1, vs2 : vd}, - disasm: "vsub.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsub_h_vx_m{: vs1, vs2 : vd}, - disasm: "vsub.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsub_w_vx{: vs1, vs2 : vd}, - disasm: "vsub.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsub_w_vx_m{: vs1, vs2 : vd}, - disasm: "vsub.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSub<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vrsub - vrsub_b_vv{: vs1, vs2 : vd}, - disasm: "vrsub.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vrsub_b_vv_m{: vs1, vs2 : vd}, - disasm: "vrsub.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vrsub_h_vv{: vs1, vs2 : vd}, - disasm: "vrsub.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vrsub_h_vv_m{: vs1, vs2 : vd}, - disasm: "vrsub.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vrsub_w_vv{: vs1, vs2 : vd}, - disasm: "vrsub.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vrsub_w_vv_m{: vs1, vs2 : vd}, - disasm: "vrsub.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vrsub_b_vx{: vs1, vs2 : vd}, - disasm: "vrsub.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vrsub_b_vx_m{: vs1, vs2 : vd}, - disasm: "vrsub.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vrsub_h_vx{: vs1, vs2 : vd}, - disasm: "vrsub.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vrsub_h_vx_m{: vs1, vs2 : vd}, - disasm: "vrsub.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vrsub_w_vx{: vs1, vs2 : vd}, - disasm: "vrsub.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vrsub_w_vx_m{: vs1, vs2 : vd}, - disasm: "vrsub.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRSub<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // veq - veq_b_vv{: vs1, vs2 : vd}, - disasm: "veq.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - veq_b_vv_m{: vs1, vs2 : vd}, - disasm: "veq.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - veq_h_vv{: vs1, vs2 : vd}, - disasm: "veq.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - veq_h_vv_m{: vs1, vs2 : vd}, - disasm: "veq.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - veq_w_vv{: vs1, vs2 : vd}, - disasm: "veq.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - veq_w_vv_m{: vs1, vs2 : vd}, - disasm: "veq.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - veq_b_vx{: vs1, vs2 : vd}, - disasm: "veq.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - veq_b_vx_m{: vs1, vs2 : vd}, - disasm: "veq.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - veq_h_vx{: vs1, vs2 : vd}, - disasm: "veq.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - veq_h_vx_m{: vs1, vs2 : vd}, - disasm: "veq.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - veq_w_vx{: vs1, vs2 : vd}, - disasm: "veq.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - veq_w_vx_m{: vs1, vs2 : vd}, - disasm: "veq.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEq<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vne - vne_b_vv{: vs1, vs2 : vd}, - disasm: "vne.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vne_b_vv_m{: vs1, vs2 : vd}, - disasm: "vne.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vne_h_vv{: vs1, vs2 : vd}, - disasm: "vne.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vne_h_vv_m{: vs1, vs2 : vd}, - disasm: "vne.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vne_w_vv{: vs1, vs2 : vd}, - disasm: "vne.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vne_w_vv_m{: vs1, vs2 : vd}, - disasm: "vne.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vne_b_vx{: vs1, vs2 : vd}, - disasm: "vne.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vne_b_vx_m{: vs1, vs2 : vd}, - disasm: "vne.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vne_h_vx{: vs1, vs2 : vd}, - disasm: "vne.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vne_h_vx_m{: vs1, vs2 : vd}, - disasm: "vne.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vne_w_vx{: vs1, vs2 : vd}, - disasm: "vne.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vne_w_vx_m{: vs1, vs2 : vd}, - disasm: "vne.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVNe<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vlt - vlt_b_vv{: vs1, vs2 : vd}, - disasm: "vlt.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vlt_b_vv_m{: vs1, vs2 : vd}, - disasm: "vlt.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vlt_h_vv{: vs1, vs2 : vd}, - disasm: "vlt.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vlt_h_vv_m{: vs1, vs2 : vd}, - disasm: "vlt.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vlt_w_vv{: vs1, vs2 : vd}, - disasm: "vlt.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vlt_w_vv_m{: vs1, vs2 : vd}, - disasm: "vlt.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vlt_b_vx{: vs1, vs2 : vd}, - disasm: "vlt.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vlt_b_vx_m{: vs1, vs2 : vd}, - disasm: "vlt.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vlt_h_vx{: vs1, vs2 : vd}, - disasm: "vlt.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vlt_h_vx_m{: vs1, vs2 : vd}, - disasm: "vlt.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vlt_w_vx{: vs1, vs2 : vd}, - disasm: "vlt.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vlt_w_vx_m{: vs1, vs2 : vd}, - disasm: "vlt.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vltu - vlt_u_b_vv{: vs1, vs2 : vd}, - disasm: "vlt.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vlt_u_b_vv_m{: vs1, vs2 : vd}, - disasm: "vlt.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vlt_u_h_vv{: vs1, vs2 : vd}, - disasm: "vlt.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vlt_u_h_vv_m{: vs1, vs2 : vd}, - disasm: "vlt.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vlt_u_w_vv{: vs1, vs2 : vd}, - disasm: "vlt.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vlt_u_w_vv_m{: vs1, vs2 : vd}, - disasm: "vlt.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vlt_u_b_vx{: vs1, vs2 : vd}, - disasm: "vlt.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vlt_u_b_vx_m{: vs1, vs2 : vd}, - disasm: "vlt.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vlt_u_h_vx{: vs1, vs2 : vd}, - disasm: "vlt.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vlt_u_h_vx_m{: vs1, vs2 : vd}, - disasm: "vlt.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vlt_u_w_vx{: vs1, vs2 : vd}, - disasm: "vlt.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vlt_u_w_vx_m{: vs1, vs2 : vd}, - disasm: "vlt.w.u.vx.m", "%vd, %vs1,V %vs2", - semfunc: "absl::bind_front(&KelvinVLt<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vle - vle_b_vv{: vs1, vs2 : vd}, - disasm: "vle.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vle_b_vv_m{: vs1, vs2 : vd}, - disasm: "vle.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vle_h_vv{: vs1, vs2 : vd}, - disasm: "vle.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vle_h_vv_m{: vs1, vs2 : vd}, - disasm: "vle.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vle_w_vv{: vs1, vs2 : vd}, - disasm: "vle.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vle_w_vv_m{: vs1, vs2 : vd}, - disasm: "vle.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vle_b_vx{: vs1, vs2 : vd}, - disasm: "vle.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vle_b_vx_m{: vs1, vs2 : vd}, - disasm: "vle.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vle_h_vx{: vs1, vs2 : vd}, - disasm: "vle.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vle_h_vx_m{: vs1, vs2 : vd}, - disasm: "vle.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vle_w_vx{: vs1, vs2 : vd}, - disasm: "vle.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vle_w_vx_m{: vs1, vs2 : vd}, - disasm: "vle.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vleu - vle_u_b_vv{: vs1, vs2 : vd}, - disasm: "vle.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vle_u_b_vv_m{: vs1, vs2 : vd}, - disasm: "vle.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vle_u_h_vv{: vs1, vs2 : vd}, - disasm: "vle.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vle_u_h_vv_m{: vs1, vs2 : vd}, - disasm: "vle.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vle_u_w_vv{: vs1, vs2 : vd}, - disasm: "vle.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vle_u_w_vv_m{: vs1, vs2 : vd}, - disasm: "vle.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vle_u_b_vx{: vs1, vs2 : vd}, - disasm: "vle.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vle_u_b_vx_m{: vs1, vs2 : vd}, - disasm: "vle.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vle_u_h_vx{: vs1, vs2 : vd}, - disasm: "vle.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vle_u_h_vx_m{: vs1, vs2 : vd}, - disasm: "vle.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vle_u_w_vx{: vs1, vs2 : vd}, - disasm: "vle.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vle_u_w_vx_m{: vs1, vs2 : vd}, - disasm: "vle.w.u.vx.m", "%vd, %vs1,V %vs2", - semfunc: "absl::bind_front(&KelvinVLe<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vgt - vgt_b_vv{: vs1, vs2 : vd}, - disasm: "vgt.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vgt_b_vv_m{: vs1, vs2 : vd}, - disasm: "vgt.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vgt_h_vv{: vs1, vs2 : vd}, - disasm: "vgt.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vgt_h_vv_m{: vs1, vs2 : vd}, - disasm: "vgt.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vgt_w_vv{: vs1, vs2 : vd}, - disasm: "vgt.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vgt_w_vv_m{: vs1, vs2 : vd}, - disasm: "vgt.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vgt_b_vx{: vs1, vs2 : vd}, - disasm: "vgt.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vgt_b_vx_m{: vs1, vs2 : vd}, - disasm: "vgt.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vgt_h_vx{: vs1, vs2 : vd}, - disasm: "vgt.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vgt_h_vx_m{: vs1, vs2 : vd}, - disasm: "vgt.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vgt_w_vx{: vs1, vs2 : vd}, - disasm: "vgt.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vgt_w_vx_m{: vs1, vs2 : vd}, - disasm: "vgt.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vgtu - vgt_u_b_vv{: vs1, vs2 : vd}, - disasm: "vgt.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vgt_u_b_vv_m{: vs1, vs2 : vd}, - disasm: "vgt.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vgt_u_h_vv{: vs1, vs2 : vd}, - disasm: "vgt.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vgt_u_h_vv_m{: vs1, vs2 : vd}, - disasm: "vgt.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vgt_u_w_vv{: vs1, vs2 : vd}, - disasm: "vgt.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vgt_u_w_vv_m{: vs1, vs2 : vd}, - disasm: "vgt.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vgt_u_b_vx{: vs1, vs2 : vd}, - disasm: "vgt.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vgt_u_b_vx_m{: vs1, vs2 : vd}, - disasm: "vgt.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vgt_u_h_vx{: vs1, vs2 : vd}, - disasm: "vgt.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vgt_u_h_vx_m{: vs1, vs2 : vd}, - disasm: "vgt.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vgt_u_w_vx{: vs1, vs2 : vd}, - disasm: "vgt.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vgt_u_w_vx_m{: vs1, vs2 : vd}, - disasm: "vgt.w.u.vx.m", "%vd, %vs1,V %vs2", - semfunc: "absl::bind_front(&KelvinVGt<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vge - vge_b_vv{: vs1, vs2 : vd}, - disasm: "vge.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vge_b_vv_m{: vs1, vs2 : vd}, - disasm: "vge.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vge_h_vv{: vs1, vs2 : vd}, - disasm: "vge.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vge_h_vv_m{: vs1, vs2 : vd}, - disasm: "vge.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vge_w_vv{: vs1, vs2 : vd}, - disasm: "vge.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vge_w_vv_m{: vs1, vs2 : vd}, - disasm: "vge.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vge_b_vx{: vs1, vs2 : vd}, - disasm: "vge.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vge_b_vx_m{: vs1, vs2 : vd}, - disasm: "vge.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vge_h_vx{: vs1, vs2 : vd}, - disasm: "vge.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vge_h_vx_m{: vs1, vs2 : vd}, - disasm: "vge.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vge_w_vx{: vs1, vs2 : vd}, - disasm: "vge.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vge_w_vx_m{: vs1, vs2 : vd}, - disasm: "vge.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vgeu - vge_u_b_vv{: vs1, vs2 : vd}, - disasm: "vge.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vge_u_b_vv_m{: vs1, vs2 : vd}, - disasm: "vge.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vge_u_h_vv{: vs1, vs2 : vd}, - disasm: "vge.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vge_u_h_vv_m{: vs1, vs2 : vd}, - disasm: "vge.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vge_u_w_vv{: vs1, vs2 : vd}, - disasm: "vge.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vge_u_w_vv_m{: vs1, vs2 : vd}, - disasm: "vge.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vge_u_b_vx{: vs1, vs2 : vd}, - disasm: "vge.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vge_u_b_vx_m{: vs1, vs2 : vd}, - disasm: "vge.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vge_u_h_vx{: vs1, vs2 : vd}, - disasm: "vge.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vge_u_h_vx_m{: vs1, vs2 : vd}, - disasm: "vge.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vge_u_w_vx{: vs1, vs2 : vd}, - disasm: "vge.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vge_u_w_vx_m{: vs1, vs2 : vd}, - disasm: "vge.w.u.vx.m", "%vd, %vs1,V %vs2", - semfunc: "absl::bind_front(&KelvinVGe<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vabsd - vabsd_b_vv{: vs1, vs2 : vd}, - disasm: "vabsd.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vabsd_b_vv_m{: vs1, vs2 : vd}, - disasm: "vabsd.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vabsd_h_vv{: vs1, vs2 : vd}, - disasm: "vabsd.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vabsd_h_vv_m{: vs1, vs2 : vd}, - disasm: "vabsd.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vabsd_w_vv{: vs1, vs2 : vd}, - disasm: "vabsd.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vabsd_w_vv_m{: vs1, vs2 : vd}, - disasm: "vabsd.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vabsd_b_vx{: vs1, vs2 : vd}, - disasm: "vabsd.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vabsd_b_vx_m{: vs1, vs2 : vd}, - disasm: "vabsd.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vabsd_h_vx{: vs1, vs2 : vd}, - disasm: "vabsd.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vabsd_h_vx_m{: vs1, vs2 : vd}, - disasm: "vabsd.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vabsd_w_vx{: vs1, vs2 : vd}, - disasm: "vabsd.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vabsd_w_vx_m{: vs1, vs2 : vd}, - disasm: "vabsd.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vabsdu - vabsd_u_b_vv{: vs1, vs2 : vd}, - disasm: "vabsd.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vabsd_u_b_vv_m{: vs1, vs2 : vd}, - disasm: "vabsd.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vabsd_u_h_vv{: vs1, vs2 : vd}, - disasm: "vabsd.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vabsd_u_h_vv_m{: vs1, vs2 : vd}, - disasm: "vabsd.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vabsd_u_w_vv{: vs1, vs2 : vd}, - disasm: "vabsd.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vabsd_u_w_vv_m{: vs1, vs2 : vd}, - disasm: "vabsd.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vabsd_u_b_vx{: vs1, vs2 : vd}, - disasm: "vabsd.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vabsd_u_b_vx_m{: vs1, vs2 : vd}, - disasm: "vabsd.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vabsd_u_h_vx{: vs1, vs2 : vd}, - disasm: "vabsd.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vabsd_u_h_vx_m{: vs1, vs2 : vd}, - disasm: "vabsd.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vabsd_u_w_vx{: vs1, vs2 : vd}, - disasm: "vabsd.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vabsd_u_w_vx_m{: vs1, vs2 : vd}, - disasm: "vabsd.w.u.vx.m", "%vd, %vs1,V %vs2", - semfunc: "absl::bind_front(&KelvinVAbsd<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vmax - vmax_b_vv{: vs1, vs2 : vd}, - disasm: "vmax.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmax_b_vv_m{: vs1, vs2 : vd}, - disasm: "vmax.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmax_h_vv{: vs1, vs2 : vd}, - disasm: "vmax.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmax_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmax.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmax_w_vv{: vs1, vs2 : vd}, - disasm: "vmax.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmax_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmax.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmax_b_vx{: vs1, vs2 : vd}, - disasm: "vmax.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmax_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmax.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmax_h_vx{: vs1, vs2 : vd}, - disasm: "vmax.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmax_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmax.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmax_w_vx{: vs1, vs2 : vd}, - disasm: "vmax.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmax_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmax.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vmaxu - vmax_u_b_vv{: vs1, vs2 : vd}, - disasm: "vmax.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmax_u_b_vv_m{: vs1, vs2 : vd}, - disasm: "vmax.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmax_u_h_vv{: vs1, vs2 : vd}, - disasm: "vmax.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmax_u_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmax.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmax_u_w_vv{: vs1, vs2 : vd}, - disasm: "vmax.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmax_u_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmax.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmax_u_b_vx{: vs1, vs2 : vd}, - disasm: "vmax.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmax_u_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmax.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmax_u_h_vx{: vs1, vs2 : vd}, - disasm: "vmax.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmax_u_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmax.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmax_u_w_vx{: vs1, vs2 : vd}, - disasm: "vmax.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmax_u_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmax.w.u.vx.m", "%vd, %vs1,V %vs2", - semfunc: "absl::bind_front(&KelvinVMax<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vmin - vmin_b_vv{: vs1, vs2 : vd}, - disasm: "vmin.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmin_b_vv_m{: vs1, vs2 : vd}, - disasm: "vmin.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmin_h_vv{: vs1, vs2 : vd}, - disasm: "vmin.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmin_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmin.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmin_w_vv{: vs1, vs2 : vd}, - disasm: "vmin.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmin_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmin.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmin_b_vx{: vs1, vs2 : vd}, - disasm: "vmin.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmin_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmin.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmin_h_vx{: vs1, vs2 : vd}, - disasm: "vmin.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmin_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmin.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmin_w_vx{: vs1, vs2 : vd}, - disasm: "vmin.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmin_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmin.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vminu - vmin_u_b_vv{: vs1, vs2 : vd}, - disasm: "vmin.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmin_u_b_vv_m{: vs1, vs2 : vd}, - disasm: "vmin.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmin_u_h_vv{: vs1, vs2 : vd}, - disasm: "vmin.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmin_u_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmin.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmin_u_w_vv{: vs1, vs2 : vd}, - disasm: "vmin.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmin_u_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmin.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmin_u_b_vx{: vs1, vs2 : vd}, - disasm: "vmin.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmin_u_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmin.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmin_u_h_vx{: vs1, vs2 : vd}, - disasm: "vmin.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmin_u_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmin.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmin_u_w_vx{: vs1, vs2 : vd}, - disasm: "vmin.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmin_u_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmin.w.u.vx.m", "%vd, %vs1,V %vs2", - semfunc: "absl::bind_front(&KelvinVMin<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - // vadd3 - vadd3_b_vv{: vs1, vs2, vd : vd}, - disasm: "vadd3.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadd3_b_vv_m{: vs1, vs2, vd : vd}, - disasm: "vadd3.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadd3_h_vv{: vs1, vs2, vd : vd}, - disasm: "vadd3.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadd3_h_vv_m{: vs1, vs2, vd : vd}, - disasm: "vadd3.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadd3_w_vv{: vs1, vs2, vd : vd}, - disasm: "vadd3.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadd3_w_vv_m{: vs1, vs2, vd : vd}, - disasm: "vadd3.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadd3_b_vx{: vs1, vs2, vd : vd}, - disasm: "vadd3.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadd3_b_vx_m{: vs1, vs2, vd : vd}, - disasm: "vadd3.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vadd3_h_vx{: vs1, vs2, vd : vd}, - disasm: "vadd3.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadd3_h_vx_m{: vs1, vs2, vd : vd}, - disasm: "vadd3.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vadd3_w_vx{: vs1, vs2, vd : vd}, - disasm: "vadd3.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadd3_w_vx_m{: vs1, vs2, vd : vd}, - disasm: "vadd3.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdd3<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vadds - vadds_b_vv{: vs1, vs2 : vd}, - disasm: "vadds.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadds_b_vv_m{: vs1, vs2 : vd}, - disasm: "vadds.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadds_h_vv{: vs1, vs2 : vd}, - disasm: "vadds.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadds_h_vv_m{: vs1, vs2 : vd}, - disasm: "vadds.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadds_w_vv{: vs1, vs2 : vd}, - disasm: "vadds.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadds_w_vv_m{: vs1, vs2 : vd}, - disasm: "vadds.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadds_b_vx{: vs1, vs2 : vd}, - disasm: "vadds.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadds_b_vx_m{: vs1, vs2 : vd}, - disasm: "vadds.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vadds_h_vx{: vs1, vs2 : vd}, - disasm: "vadds.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadds_h_vx_m{: vs1, vs2 : vd}, - disasm: "vadds.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vadds_w_vx{: vs1, vs2 : vd}, - disasm: "vadds.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadds_w_vx_m{: vs1, vs2 : vd}, - disasm: "vadds.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAdds<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vaddsu - vadds_u_b_vv{: vs1, vs2 : vd}, - disasm: "vadds.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadds_u_b_vv_m{: vs1, vs2 : vd}, - disasm: "vadds.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadds_u_h_vv{: vs1, vs2 : vd}, - disasm: "vadds.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadds_u_h_vv_m{: vs1, vs2 : vd}, - disasm: "vadds.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadds_u_w_vv{: vs1, vs2 : vd}, - disasm: "vadds.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vadds_u_w_vv_m{: vs1, vs2 : vd}, - disasm: "vadds.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vadds_u_b_vx{: vs1, vs2 : vd}, - disasm: "vadds.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadds_u_b_vx_m{: vs1, vs2 : vd}, - disasm: "vadds.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vadds_u_h_vx{: vs1, vs2 : vd}, - disasm: "vadds.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadds_u_h_vx_m{: vs1, vs2 : vd}, - disasm: "vadds.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vadds_u_w_vx{: vs1, vs2 : vd}, - disasm: "vadds.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vadds_u_w_vx_m{: vs1, vs2 : vd}, - disasm: "vadds.w.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddsu<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsubs - vsubs_b_vv{: vs1, vs2 : vd}, - disasm: "vsubs.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsubs_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsubs.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsubs_h_vv{: vs1, vs2 : vd}, - disasm: "vsubs.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsubs_h_vv_m{: vs1, vs2 : vd}, - disasm: "vsubs.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsubs_w_vv{: vs1, vs2 : vd}, - disasm: "vsubs.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsubs_w_vv_m{: vs1, vs2 : vd}, - disasm: "vsubs.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsubs_b_vx{: vs1, vs2 : vd}, - disasm: "vsubs.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsubs_b_vx_m{: vs1, vs2 : vd}, - disasm: "vsubs.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsubs_h_vx{: vs1, vs2 : vd}, - disasm: "vsubs.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsubs_h_vx_m{: vs1, vs2 : vd}, - disasm: "vsubs.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsubs_w_vx{: vs1, vs2 : vd}, - disasm: "vsubs.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsubs_w_vx_m{: vs1, vs2 : vd}, - disasm: "vsubs.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubs<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsubsu - vsubs_u_b_vv{: vs1, vs2 : vd}, - disasm: "vsubs.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsubs_u_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsubs.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsubs_u_h_vv{: vs1, vs2 : vd}, - disasm: "vsubs.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsubs_u_h_vv_m{: vs1, vs2 : vd}, - disasm: "vsubs.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsubs_u_w_vv{: vs1, vs2 : vd}, - disasm: "vsubs.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsubs_u_w_vv_m{: vs1, vs2 : vd}, - disasm: "vsubs.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsubs_u_b_vx{: vs1, vs2 : vd}, - disasm: "vsubs.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsubs_u_b_vx_m{: vs1, vs2 : vd}, - disasm: "vsubs.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsubs_u_h_vx{: vs1, vs2 : vd}, - disasm: "vsubs.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsubs_u_h_vx_m{: vs1, vs2 : vd}, - disasm: "vsubs.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsubs_u_w_vx{: vs1, vs2 : vd}, - disasm: "vsubs.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsubs_u_w_vx_m{: vs1, vs2 : vd}, - disasm: "vsubs.w.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubsu<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vaddw - vaddw_h_vv{: vs1, vs2 : vd}, - disasm: "vaddw.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vaddw_h_vv_m{: vs1, vs2 : vd}, - disasm: "vaddw.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vaddw_w_vv{: vs1, vs2 : vd}, - disasm: "vaddw.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vaddw_w_vv_m{: vs1, vs2 : vd}, - disasm: "vaddw.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vaddw_h_vx{: vs1, vs2 : vd}, - disasm: "vaddw.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vaddw_h_vx_m{: vs1, vs2 : vd}, - disasm: "vaddw.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vaddw_w_vx{: vs1, vs2 : vd}, - disasm: "vaddw.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vaddw_w_vx_m{: vs1, vs2 : vd}, - disasm: "vaddw.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vaddwu - vaddw_h_u_vv{: vs1, vs2 : vd}, - disasm: "vaddw.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vaddw_h_u_vv_m{: vs1, vs2 : vd}, - disasm: "vaddw.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vaddw_w_u_vv{: vs1, vs2 : vd}, - disasm: "vaddw.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vaddw_w_u_vv_m{: vs1, vs2 : vd}, - disasm: "vaddw.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vaddw_h_u_vx{: vs1, vs2 : vd}, - disasm: "vaddw.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vaddw_h_u_vx_m{: vs1, vs2 : vd}, - disasm: "vaddw.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vaddw_w_u_vx{: vs1, vs2 : vd}, - disasm: "vaddw.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vaddw_w_u_vx_m{: vs1, vs2 : vd}, - disasm: "vaddw.w.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAddw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsubw - vsubw_h_vv{: vs1, vs2 : vd}, - disasm: "vsubw.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsubw_h_vv_m{: vs1, vs2 : vd}, - disasm: "vsubw.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsubw_w_vv{: vs1, vs2 : vd}, - disasm: "vsubw.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsubw_w_vv_m{: vs1, vs2 : vd}, - disasm: "vsubw.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsubw_h_vx{: vs1, vs2 : vd}, - disasm: "vsubw.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsubw_h_vx_m{: vs1, vs2 : vd}, - disasm: "vsubw.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsubw_w_vx{: vs1, vs2 : vd}, - disasm: "vsubw.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsubw_w_vx_m{: vs1, vs2 : vd}, - disasm: "vsubw.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsubwu - vsubw_h_u_vv{: vs1, vs2 : vd}, - disasm: "vsubw.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsubw_h_u_vv_m{: vs1, vs2 : vd}, - disasm: "vsubw.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsubw_w_u_vv{: vs1, vs2 : vd}, - disasm: "vsubw.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsubw_w_u_vv_m{: vs1, vs2 : vd}, - disasm: "vsubw.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsubw_h_u_vx{: vs1, vs2 : vd}, - disasm: "vsubw.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsubw_h_u_vx_m{: vs1, vs2 : vd}, - disasm: "vsubw.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsubw_w_u_vx{: vs1, vs2 : vd}, - disasm: "vsubw.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsubw_w_u_vx_m{: vs1, vs2 : vd}, - disasm: "vsubw.w.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSubw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vacc - vacc_h_vv{: vs1, vs2 : vd}, - disasm: "vacc.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vacc_h_vv_m{: vs1, vs2 : vd}, - disasm: "vacc.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vacc_w_vv{: vs1, vs2 : vd}, - disasm: "vacc.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vacc_w_vv_m{: vs1, vs2 : vd}, - disasm: "vacc.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vacc_h_vx{: vs1, vs2 : vd}, - disasm: "vacc.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vacc_h_vx_m{: vs1, vs2 : vd}, - disasm: "vacc.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vacc_w_vx{: vs1, vs2 : vd}, - disasm: "vacc.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vacc_w_vx_m{: vs1, vs2 : vd}, - disasm: "vacc.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vaccu - vacc_h_u_vv{: vs1, vs2 : vd}, - disasm: "vacc.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vacc_h_u_vv_m{: vs1, vs2 : vd}, - disasm: "vacc.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vacc_w_u_vv{: vs1, vs2 : vd}, - disasm: "vacc.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vacc_w_u_vv_m{: vs1, vs2 : vd}, - disasm: "vacc.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vacc_h_u_vx{: vs1, vs2 : vd}, - disasm: "vacc.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vacc_h_u_vx_m{: vs1, vs2 : vd}, - disasm: "vacc.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vacc_w_u_vx{: vs1, vs2 : vd}, - disasm: "vacc.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vacc_w_u_vx_m{: vs1, vs2 : vd}, - disasm: "vacc.w.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAcc<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vpadd - vpadd_h_v{: vs1 : vd}, - disasm: "vpadd.h.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPadd<int16_t, int8_t>, /*strip_mine*/ false)"; - vpadd_h_v_m{: vs1 : vd}, - disasm: "vpadd.h.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPadd<int16_t, int8_t>, /*strip_mine*/ true)"; - vpadd_w_v{: vs1 : vd}, - disasm: "vpadd.w.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPadd<int32_t, int16_t>, /*strip_mine*/ false)"; - vpadd_w_v_m{: vs1 : vd}, - disasm: "vpadd.w.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPadd<int32_t, int16_t>, /*strip_mine*/ true)"; - - //vpaddu - vpadd_h_u_v{: vs1 : vd}, - disasm: "vpadd.h.u.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPadd<int16_t, int8_t>, /*strip_mine*/ false)"; - vpadd_h_u_v_m{: vs1 : vd}, - disasm: "vpadd.h.u.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPadd<int16_t, int8_t>, /*strip_mine*/ true)"; - vpadd_w_u_v{: vs1 : vd}, - disasm: "vpadd.w.u.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPadd<int32_t, int16_t>, /*strip_mine*/ false)"; - vpadd_w_u_v_m{: vs1 : vd}, - disasm: "vpadd.w.u.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPadd<int32_t, int16_t>, /*strip_mine*/ true)"; - - //vpsub - vpsub_h_v{: vs1 : vd}, - disasm: "vpsub.h.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPsub<int16_t, int8_t>, /*strip_mine*/ false)"; - vpsub_h_v_m{: vs1 : vd}, - disasm: "vpsub.h.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPsub<int16_t, int8_t>, /*strip_mine*/ true)"; - vpsub_w_v{: vs1 : vd}, - disasm: "vpsub.w.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPsub<int32_t, int16_t>, /*strip_mine*/ false)"; - vpsub_w_v_m{: vs1 : vd}, - disasm: "vpsub.w.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPsub<int32_t, int16_t>, /*strip_mine*/ true)"; - - //vpsubu - vpsub_h_u_v{: vs1 : vd}, - disasm: "vpsub.h.u.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPsub<int16_t, int8_t>, /*strip_mine*/ false)"; - vpsub_h_u_v_m{: vs1 : vd}, - disasm: "vpsub.h.u.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPsub<int16_t, int8_t>, /*strip_mine*/ true)"; - vpsub_w_u_v{: vs1 : vd}, - disasm: "vpsub.w.u.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPsub<int32_t, int16_t>, /*strip_mine*/ false)"; - vpsub_w_u_v_m{: vs1 : vd}, - disasm: "vpsub.w.u.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVPsub<int32_t, int16_t>, /*strip_mine*/ true)"; - - //vhadd - vhadd_b_vv{: vs1, vs2 : vd}, - disasm: "vhadd.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhadd_b_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhadd_h_vv{: vs1, vs2 : vd}, - disasm: "vhadd.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhadd_h_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhadd_w_vv{: vs1, vs2 : vd}, - disasm: "vhadd.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhadd_w_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhadd_b_vx{: vs1, vs2 : vd}, - disasm: "vhadd.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhadd_b_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vhadd_h_vx{: vs1, vs2 : vd}, - disasm: "vhadd.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhadd_h_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vhadd_w_vx{: vs1, vs2 : vd}, - disasm: "vhadd.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhadd_w_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - - //vhadd.r - vhadd_b_r_vv{: vs1, vs2 : vd}, - disasm: "vhadd.b.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhadd_b_r_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.b.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhadd_h_r_vv{: vs1, vs2 : vd}, - disasm: "vhadd.h.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhadd_h_r_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.h.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhadd_w_r_vv{: vs1, vs2 : vd}, - disasm: "vhadd.w.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhadd_w_r_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.w.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhadd_b_r_vx{: vs1, vs2 : vd}, - disasm: "vhadd.b.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhadd_b_r_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.b.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vhadd_h_r_vx{: vs1, vs2 : vd}, - disasm: "vhadd.h.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhadd_h_r_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.h.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vhadd_w_r_vx{: vs1, vs2 : vd}, - disasm: "vhadd.w.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhadd_w_r_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.w.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - - //vhadd.u - vhadd_b_u_vv{: vs1, vs2 : vd}, - disasm: "vhadd.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhadd_b_u_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhadd_h_u_vv{: vs1, vs2 : vd}, - disasm: "vhadd.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhadd_h_u_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhadd_w_u_vv{: vs1, vs2 : vd}, - disasm: "vhadd.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhadd_w_u_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhadd_b_u_vx{: vs1, vs2 : vd}, - disasm: "vhadd.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhadd_b_u_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vhadd_h_u_vx{: vs1, vs2 : vd}, - disasm: "vhadd.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhadd_h_u_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vhadd_w_u_vx{: vs1, vs2 : vd}, - disasm: "vhadd.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhadd_w_u_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.w.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - - //vhadd.ru - vhadd_b_ur_vv{: vs1, vs2 : vd}, - disasm: "vhadd.b.ur.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhadd_b_ur_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.b.ur.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhadd_h_ur_vv{: vs1, vs2 : vd}, - disasm: "vhadd.h.ur.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhadd_h_ur_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.h.ur.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhadd_w_ur_vv{: vs1, vs2 : vd}, - disasm: "vhadd.w.ur.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhadd_w_ur_vv_m{: vs1, vs2 : vd}, - disasm: "vhadd.w.ur.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhadd_b_ur_vx{: vs1, vs2 : vd}, - disasm: "vhadd.b.ur.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhadd_b_ur_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.b.ur.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vhadd_h_ur_vx{: vs1, vs2 : vd}, - disasm: "vhadd.h.ur.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhadd_h_ur_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.h.ur.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vhadd_w_ur_vx{: vs1, vs2 : vd}, - disasm: "vhadd.w.ur.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhadd_w_ur_vx_m{: vs1, vs2 : vd}, - disasm: "vhadd.w.ur.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - - //vhsub - vhsub_b_vv{: vs1, vs2 : vd}, - disasm: "vhsub.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhsub_b_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhsub_h_vv{: vs1, vs2 : vd}, - disasm: "vhsub.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhsub_h_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhsub_w_vv{: vs1, vs2 : vd}, - disasm: "vhsub.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhsub_w_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhsub_b_vx{: vs1, vs2 : vd}, - disasm: "vhsub.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhsub_b_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vhsub_h_vx{: vs1, vs2 : vd}, - disasm: "vhsub.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhsub_h_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vhsub_w_vx{: vs1, vs2 : vd}, - disasm: "vhsub.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhsub_w_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - - //vhsub.r - vhsub_b_r_vv{: vs1, vs2 : vd}, - disasm: "vhsub.b.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhsub_b_r_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.b.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhsub_h_r_vv{: vs1, vs2 : vd}, - disasm: "vhsub.h.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhsub_h_r_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.h.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhsub_w_r_vv{: vs1, vs2 : vd}, - disasm: "vhsub.w.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhsub_w_r_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.w.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhsub_b_r_vx{: vs1, vs2 : vd}, - disasm: "vhsub.b.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhsub_b_r_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.b.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vhsub_h_r_vx{: vs1, vs2 : vd}, - disasm: "vhsub.h.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhsub_h_r_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.h.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vhsub_w_r_vx{: vs1, vs2 : vd}, - disasm: "vhsub.w.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhsub_w_r_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.w.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - - //vhsub.u - vhsub_b_u_vv{: vs1, vs2 : vd}, - disasm: "vhsub.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhsub_b_u_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhsub_h_u_vv{: vs1, vs2 : vd}, - disasm: "vhsub.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhsub_h_u_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhsub_w_u_vv{: vs1, vs2 : vd}, - disasm: "vhsub.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vhsub_w_u_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vhsub_b_u_vx{: vs1, vs2 : vd}, - disasm: "vhsub.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhsub_b_u_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vhsub_h_u_vx{: vs1, vs2 : vd}, - disasm: "vhsub.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhsub_h_u_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vhsub_w_u_vx{: vs1, vs2 : vd}, - disasm: "vhsub.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vhsub_w_u_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.w.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - - //vhsub.ru - vhsub_b_ur_vv{: vs1, vs2 : vd}, - disasm: "vhsub.b.ur.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhsub_b_ur_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.b.ur.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhsub_h_ur_vv{: vs1, vs2 : vd}, - disasm: "vhsub.h.ur.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhsub_h_ur_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.h.ur.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhsub_w_ur_vv{: vs1, vs2 : vd}, - disasm: "vhsub.w.ur.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vhsub_w_ur_vv_m{: vs1, vs2 : vd}, - disasm: "vhsub.w.ur.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vhsub_b_ur_vx{: vs1, vs2 : vd}, - disasm: "vhsub.b.ur.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhsub_b_ur_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.b.ur.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vhsub_h_ur_vx{: vs1, vs2 : vd}, - disasm: "vhsub.h.ur.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhsub_h_ur_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.h.ur.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vhsub_w_ur_vx{: vs1, vs2 : vd}, - disasm: "vhsub.w.ur.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vhsub_w_ur_vx_m{: vs1, vs2 : vd}, - disasm: "vhsub.w.ur.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - - //vand - vand_vv{: vs1, vs2 : vd}, - disasm: "vand.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAnd<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vand_vv_m{: vs1, vs2 : vd}, - disasm: "vand.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAnd<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vand_b_vx{: vs1, vs2 : vd}, - disasm: "vand.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAnd<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vand_b_vx_m{: vs1, vs2 : vd}, - disasm: "vand.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAnd<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vand_h_vx{: vs1, vs2 : vd}, - disasm: "vand.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAnd<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vand_h_vx_m{: vs1, vs2 : vd}, - disasm: "vand.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAnd<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vand_w_vx{: vs1, vs2 : vd}, - disasm: "vand.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAnd<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vand_w_vx_m{: vs1, vs2 : vd}, - disasm: "vand.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVAnd<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vor - vor_vv{: vs1, vs2 : vd}, - disasm: "vor.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOr<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vor_vv_m{: vs1, vs2 : vd}, - disasm: "vor.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOr<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vor_b_vx{: vs1, vs2 : vd}, - disasm: "vor.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOr<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vor_b_vx_m{: vs1, vs2 : vd}, - disasm: "vor.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOr<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vor_h_vx{: vs1, vs2 : vd}, - disasm: "vor.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOr<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vor_h_vx_m{: vs1, vs2 : vd}, - disasm: "vor.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOr<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vor_w_vx{: vs1, vs2 : vd}, - disasm: "vor.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOr<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vor_w_vx_m{: vs1, vs2 : vd}, - disasm: "vor.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOr<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vxor - vxor_vv{: vs1, vs2 : vd}, - disasm: "vxor.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVXor<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vxor_vv_m{: vs1, vs2 : vd}, - disasm: "vxor.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVXor<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vxor_b_vx{: vs1, vs2 : vd}, - disasm: "vxor.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVXor<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vxor_b_vx_m{: vs1, vs2 : vd}, - disasm: "vxor.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVXor<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vxor_h_vx{: vs1, vs2 : vd}, - disasm: "vxor.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVXor<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vxor_h_vx_m{: vs1, vs2 : vd}, - disasm: "vxor.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVXor<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vxor_w_vx{: vs1, vs2 : vd}, - disasm: "vxor.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVXor<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vxor_w_vx_m{: vs1, vs2 : vd}, - disasm: "vxor.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVXor<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vrev - vrev_b_vx{: vs1, vs2 : vd}, - disasm: "vrev.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRev<uint8_t>, /*strip_mine*/ false)"; - vrev_b_vx_m{: vs1, vs2 : vd}, - disasm: "vrev.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRev<uint8_t>, /*strip_mine*/ true)"; - vrev_h_vx{: vs1, vs2 : vd}, - disasm: "vrev.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRev<uint16_t>, /*strip_mine*/ false)"; - vrev_h_vx_m{: vs1, vs2 : vd}, - disasm: "vrev.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRev<uint16_t>, /*strip_mine*/ true)"; - vrev_w_vx{: vs1, vs2 : vd}, - disasm: "vrev.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRev<uint32_t>, /*strip_mine*/ false)"; - vrev_w_vx_m{: vs1, vs2 : vd}, - disasm: "vrev.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRev<uint32_t>, /*strip_mine*/ true)"; - - //vror - vror_b_vx{: vs1, vs2 : vd}, - disasm: "vror.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRor<uint8_t>, /*strip_mine*/ false)"; - vror_b_vx_m{: vs1, vs2 : vd}, - disasm: "vror.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRor<uint8_t>, /*strip_mine*/ true)"; - vror_h_vx{: vs1, vs2 : vd}, - disasm: "vror.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRor<uint16_t>, /*strip_mine*/ false)"; - vror_h_vx_m{: vs1, vs2 : vd}, - disasm: "vror.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRor<uint16_t>, /*strip_mine*/ true)"; - vror_w_vx{: vs1, vs2 : vd}, - disasm: "vror.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRor<uint32_t>, /*strip_mine*/ false)"; - vror_w_vx_m{: vs1, vs2 : vd}, - disasm: "vror.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVRor<uint32_t>, /*strip_mine*/ true)"; - - //vmvp - vmvp_vv{: vs1, vs2 : vd}, - disasm: "vmvp.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMvp<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmvp_vv_m{: vs1, vs2 : vd}, - disasm: "vmvp.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMvp<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmvp_b_vx{: vs1, vs2 : vd}, - disasm: "vmvp.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMvp<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmvp_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmvp.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMvp<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmvp_h_vx{: vs1, vs2 : vd}, - disasm: "vmvp.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMvp<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmvp_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmvp.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMvp<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmvp_w_vx{: vs1, vs2 : vd}, - disasm: "vmvp.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMvp<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmvp_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmvp.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMvp<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsll - vsll_b_vv{: vs1, vs2 : vd}, - disasm: "vsll.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsll_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsll.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsll_h_vv{: vs1, vs2 : vd}, - disasm: "vsll.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsll_h_vv_m{: vs1, vs2 : vd}, - disasm: "vsll.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsll_w_vv{: vs1, vs2 : vd}, - disasm: "vsll.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsll_w_vv_m{: vs1, vs2 : vd}, - disasm: "vsll.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsll_b_vx{: vs1, vs2 : vd}, - disasm: "vsll.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsll_b_vx_m{: vs1, vs2 : vd}, - disasm: "vsll.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsll_h_vx{: vs1, vs2 : vd}, - disasm: "vsll.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsll_h_vx_m{: vs1, vs2 : vd}, - disasm: "vsll.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsll_w_vx{: vs1, vs2 : vd}, - disasm: "vsll.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsll_w_vx_m{: vs1, vs2 : vd}, - disasm: "vsll.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSll<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsra - vsra_b_vv{: vs1, vs2 : vd}, - disasm: "vsra.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsra_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsra.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsra_h_vv{: vs1, vs2 : vd}, - disasm: "vsra.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsra_h_vv_m{: vs1, vs2 : vd}, - disasm: "vsra.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsra_w_vv{: vs1, vs2 : vd}, - disasm: "vsra.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsra_w_vv_m{: vs1, vs2 : vd}, - disasm: "vsra.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsra_b_vx{: vs1, vs2 : vd}, - disasm: "vsra.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsra_b_vx_m{: vs1, vs2 : vd}, - disasm: "vsra.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsra_h_vx{: vs1, vs2 : vd}, - disasm: "vsra.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsra_h_vx_m{: vs1, vs2 : vd}, - disasm: "vsra.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsra_w_vx{: vs1, vs2 : vd}, - disasm: "vsra.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsra_w_vx_m{: vs1, vs2 : vd}, - disasm: "vsra.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSra<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsrl - vsrl_b_vv{: vs1, vs2 : vd}, - disasm: "vsrl.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsrl_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsrl.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsrl_h_vv{: vs1, vs2 : vd}, - disasm: "vsrl.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsrl_h_vv_m{: vs1, vs2 : vd}, - disasm: "vsrl.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsrl_w_vv{: vs1, vs2 : vd}, - disasm: "vsrl.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsrl_w_vv_m{: vs1, vs2 : vd}, - disasm: "vsrl.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsrl_b_vx{: vs1, vs2 : vd}, - disasm: "vsrl.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsrl_b_vx_m{: vs1, vs2 : vd}, - disasm: "vsrl.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsrl_h_vx{: vs1, vs2 : vd}, - disasm: "vsrl.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsrl_h_vx_m{: vs1, vs2 : vd}, - disasm: "vsrl.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsrl_w_vx{: vs1, vs2 : vd}, - disasm: "vsrl.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsrl_w_vx_m{: vs1, vs2 : vd}, - disasm: "vsrl.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrl<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsha - vsha_b_vv{: vs1, vs2 : vd}, - disasm: "vsha.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ false, /*strip_mine*/ false)"; - vsha_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsha.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ false, /*strip_mine*/ true)"; - vsha_h_vv{: vs1, vs2 : vd}, - disasm: "vsha.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ false, /*strip_mine*/ false)"; - vsha_h_vv_m{: vs1, vs2 : vd}, - disasm: "vsha.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ false, /*strip_mine*/ true)"; - vsha_w_vv{: vs1, vs2 : vd}, - disasm: "vsha.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ false, /*strip_mine*/ false)"; - vsha_w_vv_m{: vs1, vs2 : vd}, - disasm: "vsha.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ false, /*strip_mine*/ true)"; - vsha_b_r_vv{: vs1, vs2 : vd}, - disasm: "vsha.b.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ true, /*strip_mine*/ false)"; - vsha_b_r_vv_m{: vs1, vs2 : vd}, - disasm: "vsha.b.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ true, /*strip_mine*/ true)"; - vsha_h_r_vv{: vs1, vs2 : vd}, - disasm: "vsha.h.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ true, /*strip_mine*/ false)"; - vsha_h_r_vv_m{: vs1, vs2 : vd}, - disasm: "vsha.h.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ true, /*strip_mine*/ true)"; - vsha_w_r_vv{: vs1, vs2 : vd}, - disasm: "vsha.w.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ true, /*strip_mine*/ false)"; - vsha_w_r_vv_m{: vs1, vs2 : vd}, - disasm: "vsha.w.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ true, /*strip_mine*/ true)"; - - //vshl - vshl_b_vv{: vs1, vs2 : vd}, - disasm: "vshl.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ false, /*strip_mine*/ false)"; - vshl_b_vv_m{: vs1, vs2 : vd}, - disasm: "vshl.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ false, /*strip_mine*/ true)"; - vshl_h_vv{: vs1, vs2 : vd}, - disasm: "vshl.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ false, /*strip_mine*/ false)"; - vshl_h_vv_m{: vs1, vs2 : vd}, - disasm: "vshl.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ false, /*strip_mine*/ true)"; - vshl_w_vv{: vs1, vs2 : vd}, - disasm: "vshl.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ false, /*strip_mine*/ false)"; - vshl_w_vv_m{: vs1, vs2 : vd}, - disasm: "vshl.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ false, /*strip_mine*/ true)"; - vshl_b_r_vv{: vs1, vs2 : vd}, - disasm: "vshl.b.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ true, /*strip_mine*/ false)"; - vshl_b_r_vv_m{: vs1, vs2 : vd}, - disasm: "vshl.b.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ true, /*strip_mine*/ true)"; - vshl_h_r_vv{: vs1, vs2 : vd}, - disasm: "vshl.h.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ true, /*strip_mine*/ false)"; - vshl_h_r_vv_m{: vs1, vs2 : vd}, - disasm: "vshl.h.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ true, /*strip_mine*/ true)"; - vshl_w_r_vv{: vs1, vs2 : vd}, - disasm: "vshl.w.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ true, /*strip_mine*/ false)"; - vshl_w_r_vv_m{: vs1, vs2 : vd}, - disasm: "vshl.w.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ true, /*strip_mine*/ true)"; - - //vnot - vnot_v{: vs1 : vd}, - disasm: "vnot.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVNot<int32_t>, /*strip_mine*/ false)"; - vnot_v_m{: vs1 : vd}, - disasm: "vnot.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVNot<int32_t>, /*strip_mine*/ true)"; - - //vclb - vclb_b_v{: vs1 : vd}, - disasm: "vclb.b.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClb<uint8_t>, /*strip_mine*/ false)"; - vclb_b_v_m{: vs1 : vd}, - disasm: "vclb.b.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClb<uint8_t>, /*strip_mine*/ true)"; - vclb_h_v{: vs1 : vd}, - disasm: "vclb.h.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClb<uint16_t>, /*strip_mine*/ false)"; - vclb_h_v_m{: vs1 : vd}, - disasm: "vclb.h.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClb<uint16_t>, /*strip_mine*/ true)"; - vclb_w_v{: vs1 : vd}, - disasm: "vclb.w.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClb<uint32_t>, /*strip_mine*/ false)"; - vclb_w_v_m{: vs1 : vd}, - disasm: "vclb.w.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClb<uint32_t>, /*strip_mine*/ true)"; - - //vclz - vclz_b_v{: vs1 : vd}, - disasm: "vclz.b.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClz<uint8_t>, /*strip_mine*/ false)"; - vclz_b_v_m{: vs1 : vd}, - disasm: "vclz.b.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClz<uint8_t>, /*strip_mine*/ true)"; - vclz_h_v{: vs1 : vd}, - disasm: "vclz.h.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClz<uint16_t>, /*strip_mine*/ false)"; - vclz_h_v_m{: vs1 : vd}, - disasm: "vclz.h.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClz<uint16_t>, /*strip_mine*/ true)"; - vclz_w_v{: vs1 : vd}, - disasm: "vclz.w.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClz<uint32_t>, /*strip_mine*/ false)"; - vclz_w_v_m{: vs1 : vd}, - disasm: "vclz.w.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVClz<uint32_t>, /*strip_mine*/ true)"; - - //vcpop - vcpop_b_v{: vs1 : vd}, - disasm: "vcpop.b.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVCpop<uint8_t>, /*strip_mine*/ false)"; - vcpop_b_v_m{: vs1 : vd}, - disasm: "vcpop.b.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVCpop<uint8_t>, /*strip_mine*/ true)"; - vcpop_h_v{: vs1 : vd}, - disasm: "vcpop.h.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVCpop<uint16_t>, /*strip_mine*/ false)"; - vcpop_h_v_m{: vs1 : vd}, - disasm: "vcpop.h.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVCpop<uint16_t>, /*strip_mine*/ true)"; - vcpop_w_v{: vs1 : vd}, - disasm: "vcpop.w.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVCpop<uint32_t>, /*strip_mine*/ false)"; - vcpop_w_v_m{: vs1 : vd}, - disasm: "vcpop.w.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVCpop<uint32_t>, /*strip_mine*/ true)"; - - //vmv - vmv_v{: vs1 : vd}, - disasm: "vmv.v", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVMv<int32_t>, /*strip_mine*/ false)"; - vmv_v_m{: vs1 : vd}, - disasm: "vmv.v.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVMv<int32_t>, /*strip_mine*/ true)"; - - //vsrans - vsrans_b_vv{: vs1, vs2 : vd}, - disasm: "vsrans.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; - vsrans_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsrans.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; - vsrans_h_vv{: vs1, vs2 : vd}, - disasm: "vsrans.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; - vsrans_h_vv_m{: vs1, vs2 : vd}, - disasm: "vsrans.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; - vsrans_b_vx{: vs1, vs2 : vd}, - disasm: "vsrans.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; - vsrans_b_vx_m{: vs1, vs2 : vd}, - disasm: "vsrans.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; - vsrans_h_vx{: vs1, vs2 : vd}, - disasm: "vsrans.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; - vsrans_h_vx_m{: vs1, vs2 : vd}, - disasm: "vsrans.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; - vsrans_b_r_vv{: vs1, vs2 : vd}, - disasm: "vsrans.b.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; - vsrans_b_r_vv_m{: vs1, vs2 : vd}, - disasm: "vsrans.b.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; - vsrans_h_r_vv{: vs1, vs2 : vd}, - disasm: "vsrans.h.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; - vsrans_h_r_vv_m{: vs1, vs2 : vd}, - disasm: "vsrans.h.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; - vsrans_b_r_vx{: vs1, vs2 : vd}, - disasm: "vsrans.b.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; - vsrans_b_r_vx_m{: vs1, vs2 : vd}, - disasm: "vsrans.b.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; - vsrans_h_r_vx{: vs1, vs2 : vd}, - disasm: "vsrans.h.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; - vsrans_h_r_vx_m{: vs1, vs2 : vd}, - disasm: "vsrans.h.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsransu - vsransu_b_vv{: vs1, vs2 : vd}, - disasm: "vsransu.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; - vsransu_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsransu.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; - vsransu_h_vv{: vs1, vs2 : vd}, - disasm: "vsransu.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; - vsransu_h_vv_m{: vs1, vs2 : vd}, - disasm: "vsransu.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; - vsransu_b_vx{: vs1, vs2 : vd}, - disasm: "vsransu.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; - vsransu_b_vx_m{: vs1, vs2 : vd}, - disasm: "vsransu.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; - vsransu_h_vx{: vs1, vs2 : vd}, - disasm: "vsransu.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; - vsransu_h_vx_m{: vs1, vs2 : vd}, - disasm: "vsransu.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; - vsransu_b_r_vv{: vs1, vs2 : vd}, - disasm: "vsransu.b.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; - vsransu_b_r_vv_m{: vs1, vs2 : vd}, - disasm: "vsransu.b.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; - vsransu_h_r_vv{: vs1, vs2 : vd}, - disasm: "vsransu.h.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; - vsransu_h_r_vv_m{: vs1, vs2 : vd}, - disasm: "vsransu.h.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; - vsransu_b_r_vx{: vs1, vs2 : vd}, - disasm: "vsransu.b.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; - vsransu_b_r_vx_m{: vs1, vs2 : vd}, - disasm: "vsransu.b.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; - vsransu_h_r_vx{: vs1, vs2 : vd}, - disasm: "vsransu.h.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; - vsransu_h_r_vx_m{: vs1, vs2 : vd}, - disasm: "vsransu.h.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsraqs - vsraqs_b_vv{: vs1, vs2 : vd}, - disasm: "vsraqs.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; - vsraqs_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsraqs.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; - vsraqs_b_vx{: vs1, vs2 : vd}, - disasm: "vsraqs.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; - vsraqs_b_vx_m{: vs1, vs2 : vd}, - disasm: "vsraqs.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; - vsraqs_b_r_vv{: vs1, vs2 : vd}, - disasm: "vsraqs.b.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; - vsraqs_b_r_vv_m{: vs1, vs2 : vd}, - disasm: "vsraqs.b.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; - vsraqs_b_r_vx{: vs1, vs2 : vd}, - disasm: "vsraqs.b.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; - vsraqs_b_r_vx_m{: vs1, vs2 : vd}, - disasm: "vsraqs.b.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; - - //vsraqsu - vsraqsu_b_vv{: vs1, vs2 : vd}, - disasm: "vsraqsu.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; - vsraqsu_b_vv_m{: vs1, vs2 : vd}, - disasm: "vsraqsu.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; - vsraqsu_b_vx{: vs1, vs2 : vd}, - disasm: "vsraqsu.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; - vsraqsu_b_vx_m{: vs1, vs2 : vd}, - disasm: "vsraqsu.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; - vsraqsu_b_r_vv{: vs1, vs2 : vd}, - disasm: "vsraqsu.b.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; - vsraqsu_b_r_vv_m{: vs1, vs2 : vd}, - disasm: "vsraqsu.b.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; - vsraqsu_b_r_vx{: vs1, vs2 : vd}, - disasm: "vsraqsu.b.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; - vsraqsu_b_r_vx_m{: vs1, vs2 : vd}, - disasm: "vsraqsu.b.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; - - //vmul - vmul_b_vv{: vs1, vs2 : vd}, - disasm: "vmul.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmul_b_vv_m{: vs1, vs2 : vd}, - disasm: "vmul.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmul_h_vv{: vs1, vs2 : vd}, - disasm: "vmul.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmul_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmul.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmul_w_vv{: vs1, vs2 : vd}, - disasm: "vmul.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmul_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmul.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmul_b_vx{: vs1, vs2 : vd}, - disasm: "vmul.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmul_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmul.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmul_h_vx{: vs1, vs2 : vd}, - disasm: "vmul.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmul_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmul.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmul_w_vx{: vs1, vs2 : vd}, - disasm: "vmul.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmul_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmul.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMul<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vmuls - vmuls_b_vv{: vs1, vs2 : vd}, - disasm: "vmuls.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmuls_b_vv_m{: vs1, vs2 : vd}, - disasm: "vmuls.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmuls_h_vv{: vs1, vs2 : vd}, - disasm: "vmuls.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmuls_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmuls.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmuls_w_vv{: vs1, vs2 : vd}, - disasm: "vmuls.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmuls_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmuls.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmuls_b_vx{: vs1, vs2 : vd}, - disasm: "vmuls.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmuls_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmuls.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmuls_h_vx{: vs1, vs2 : vd}, - disasm: "vmuls.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmuls_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmuls.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmuls_w_vx{: vs1, vs2 : vd}, - disasm: "vmuls.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmuls_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmuls.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vmulsu - vmulsu_b_vv{: vs1, vs2 : vd}, - disasm: "vmulsu.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmulsu_b_vv_m{: vs1, vs2 : vd}, - disasm: "vmulsu.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmulsu_h_vv{: vs1, vs2 : vd}, - disasm: "vmulsu.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmulsu_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmulsu.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmulsu_w_vv{: vs1, vs2 : vd}, - disasm: "vmulsu.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmulsu_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmulsu.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmulsu_b_vx{: vs1, vs2 : vd}, - disasm: "vmulsu.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmulsu_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmulsu.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmulsu_h_vx{: vs1, vs2 : vd}, - disasm: "vmulsu.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmulsu_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmulsu.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmulsu_w_vx{: vs1, vs2 : vd}, - disasm: "vmulsu.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmulsu_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmulsu.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMuls<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vmulw - vmulw_h_vv{: vs1, vs2 : vd}, - disasm: "vmulw.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmulw_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmulw.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmulw_w_vv{: vs1, vs2 : vd}, - disasm: "vmulw.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmulw_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmulw.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmulw_h_vx{: vs1, vs2 : vd}, - disasm: "vmulw.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmulw_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmulw.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmulw_w_vx{: vs1, vs2 : vd}, - disasm: "vmulw.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmulw_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmulw.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vmulwu - vmulw_h_u_vv{: vs1, vs2 : vd}, - disasm: "vmulw.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmulw_h_u_vv_m{: vs1, vs2 : vd}, - disasm: "vmulw.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmulw_w_u_vv{: vs1, vs2 : vd}, - disasm: "vmulw.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmulw_w_u_vv_m{: vs1, vs2 : vd}, - disasm: "vmulw.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmulw_h_u_vx{: vs1, vs2 : vd}, - disasm: "vmulw.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmulw_h_u_vx_m{: vs1, vs2 : vd}, - disasm: "vmulw.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmulw_w_u_vx{: vs1, vs2 : vd}, - disasm: "vmulw.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmulw_w_u_vx_m{: vs1, vs2 : vd}, - disasm: "vmulw.w.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vmulh - vmulh_b_vv{: vs1, vs2 : vd}, - disasm: "vmulh.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vmulh_b_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vmulh_h_vv{: vs1, vs2 : vd}, - disasm: "vmulh.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vmulh_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vmulh_w_vv{: vs1, vs2 : vd}, - disasm: "vmulh.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vmulh_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vmulh_b_vx{: vs1, vs2 : vd}, - disasm: "vmulh.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vmulh_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vmulh_h_vx{: vs1, vs2 : vd}, - disasm: "vmulh.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vmulh_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vmulh_w_vx{: vs1, vs2 : vd}, - disasm: "vmulh.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vmulh_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - - //vmulh.r - vmulh_b_r_vv{: vs1, vs2 : vd}, - disasm: "vmulh.b.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vmulh_b_r_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.b.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vmulh_h_r_vv{: vs1, vs2 : vd}, - disasm: "vmulh.h.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vmulh_h_r_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.h.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vmulh_w_r_vv{: vs1, vs2 : vd}, - disasm: "vmulh.w.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vmulh_w_r_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.w.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vmulh_b_r_vx{: vs1, vs2 : vd}, - disasm: "vmulh.b.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vmulh_b_r_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.b.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vmulh_h_r_vx{: vs1, vs2 : vd}, - disasm: "vmulh.h.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vmulh_h_r_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.h.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vmulh_w_r_vx{: vs1, vs2 : vd}, - disasm: "vmulh.w.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vmulh_w_r_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.w.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - - //vmulh.u - vmulh_b_u_vv{: vs1, vs2 : vd}, - disasm: "vmulh.b.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vmulh_b_u_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.b.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vmulh_h_u_vv{: vs1, vs2 : vd}, - disasm: "vmulh.h.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vmulh_h_u_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.h.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vmulh_w_u_vv{: vs1, vs2 : vd}, - disasm: "vmulh.w.u.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; - vmulh_w_u_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.w.u.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; - vmulh_b_u_vx{: vs1, vs2 : vd}, - disasm: "vmulh.b.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vmulh_b_u_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.b.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vmulh_h_u_vx{: vs1, vs2 : vd}, - disasm: "vmulh.h.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vmulh_h_u_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.h.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - vmulh_w_u_vx{: vs1, vs2 : vd}, - disasm: "vmulh.w.u.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; - vmulh_w_u_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.w.u.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; - - //vmulh.ru - vmulh_b_ur_vv{: vs1, vs2 : vd}, - disasm: "vmulh.b.ur.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vmulh_b_ur_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.b.ur.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vmulh_h_ur_vv{: vs1, vs2 : vd}, - disasm: "vmulh.h.ur.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vmulh_h_ur_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.h.ur.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vmulh_w_ur_vv{: vs1, vs2 : vd}, - disasm: "vmulh.w.ur.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; - vmulh_w_ur_vv_m{: vs1, vs2 : vd}, - disasm: "vmulh.w.ur.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; - vmulh_b_ur_vx{: vs1, vs2 : vd}, - disasm: "vmulh.b.ur.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vmulh_b_ur_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.b.ur.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vmulh_h_ur_vx{: vs1, vs2 : vd}, - disasm: "vmulh.h.ur.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vmulh_h_ur_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.h.ur.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - vmulh_w_ur_vx{: vs1, vs2 : vd}, - disasm: "vmulh.w.ur.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; - vmulh_w_ur_vx_m{: vs1, vs2 : vd}, - disasm: "vmulh.w.ur.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; - - //vdmulh - vdmulh_b_vv{: vs1, vs2 : vd}, - disasm: "vdmulh.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; - vdmulh_b_vv_m{: vs1, vs2 : vd}, - disasm: "vdmulh.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; - vdmulh_h_vv{: vs1, vs2 : vd}, - disasm: "vdmulh.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; - vdmulh_h_vv_m{: vs1, vs2 : vd}, - disasm: "vdmulh.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; - vdmulh_w_vv{: vs1, vs2 : vd}, - disasm: "vdmulh.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; - vdmulh_w_vv_m{: vs1, vs2 : vd}, - disasm: "vdmulh.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; - vdmulh_b_vx{: vs1, vs2 : vd}, - disasm: "vdmulh.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; - vdmulh_b_vx_m{: vs1, vs2 : vd}, - disasm: "vdmulh.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; - vdmulh_h_vx{: vs1, vs2 : vd}, - disasm: "vdmulh.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; - vdmulh_h_vx_m{: vs1, vs2 : vd}, - disasm: "vdmulh.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; - vdmulh_w_vx{: vs1, vs2 : vd}, - disasm: "vdmulh.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; - vdmulh_w_vx_m{: vs1, vs2 : vd}, - disasm: "vdmulh.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; - - //vdmulh.r - vdmulh_b_r_vv{: vs1, vs2 : vd}, - disasm: "vdmulh.b.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; - vdmulh_b_r_vv_m{: vs1, vs2 : vd}, - disasm: "vdmulh.b.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; - vdmulh_h_r_vv{: vs1, vs2 : vd}, - disasm: "vdmulh.h.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; - vdmulh_h_r_vv_m{: vs1, vs2 : vd}, - disasm: "vdmulh.h.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; - vdmulh_w_r_vv{: vs1, vs2 : vd}, - disasm: "vdmulh.w.r.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; - vdmulh_w_r_vv_m{: vs1, vs2 : vd}, - disasm: "vdmulh.w.r.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; - vdmulh_b_r_vx{: vs1, vs2 : vd}, - disasm: "vdmulh.b.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; - vdmulh_b_r_vx_m{: vs1, vs2 : vd}, - disasm: "vdmulh.b.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; - vdmulh_h_r_vx{: vs1, vs2 : vd}, - disasm: "vdmulh.h.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; - vdmulh_h_r_vx_m{: vs1, vs2 : vd}, - disasm: "vdmulh.h.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; - vdmulh_w_r_vx{: vs1, vs2 : vd}, - disasm: "vdmulh.w.r.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; - vdmulh_w_r_vx_m{: vs1, vs2 : vd}, - disasm: "vdmulh.w.r.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; - - //vdmulh.rn - vdmulh_b_rn_vv{: vs1, vs2 : vd}, - disasm: "vdmulh.b.rn.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; - vdmulh_b_rn_vv_m{: vs1, vs2 : vd}, - disasm: "vdmulh.b.rn.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; - vdmulh_h_rn_vv{: vs1, vs2 : vd}, - disasm: "vdmulh.h.rn.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; - vdmulh_h_rn_vv_m{: vs1, vs2 : vd}, - disasm: "vdmulh.h.rn.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; - vdmulh_w_rn_vv{: vs1, vs2 : vd}, - disasm: "vdmulh.w.rn.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; - vdmulh_w_rn_vv_m{: vs1, vs2 : vd}, - disasm: "vdmulh.w.rn.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; - vdmulh_b_rn_vx{: vs1, vs2 : vd}, - disasm: "vdmulh.b.rn.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; - vdmulh_b_rn_vx_m{: vs1, vs2 : vd}, - disasm: "vdmulh.b.rn.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; - vdmulh_h_rn_vx{: vs1, vs2 : vd}, - disasm: "vdmulh.h.rn.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; - vdmulh_h_rn_vx_m{: vs1, vs2 : vd}, - disasm: "vdmulh.h.rn.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; - vdmulh_w_rn_vx{: vs1, vs2 : vd}, - disasm: "vdmulh.w.rn.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; - vdmulh_w_rn_vx_m{: vs1, vs2 : vd}, - disasm: "vdmulh.w.rn.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; - - //vmacc - vmacc_b_vv{: vs1, vs2 : vd}, - disasm: "vmacc.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmacc_b_vv_m{: vs1, vs2 : vd}, - disasm: "vmacc.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmacc_h_vv{: vs1, vs2 : vd}, - disasm: "vmacc.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmacc_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmacc.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmacc_w_vv{: vs1, vs2 : vd}, - disasm: "vmacc.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmacc_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmacc.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmacc_b_vx{: vs1, vs2 : vd}, - disasm: "vmacc.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmacc_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmacc.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmacc_h_vx{: vs1, vs2 : vd}, - disasm: "vmacc.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmacc_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmacc.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmacc_w_vx{: vs1, vs2 : vd}, - disasm: "vmacc.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmacc_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmacc.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMacc<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vmadd - vmadd_b_vv{: vs1, vs2 : vd}, - disasm: "vmadd.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmadd_b_vv_m{: vs1, vs2 : vd}, - disasm: "vmadd.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmadd_h_vv{: vs1, vs2 : vd}, - disasm: "vmadd.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmadd_h_vv_m{: vs1, vs2 : vd}, - disasm: "vmadd.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmadd_w_vv{: vs1, vs2 : vd}, - disasm: "vmadd.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vmadd_w_vv_m{: vs1, vs2 : vd}, - disasm: "vmadd.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vmadd_b_vx{: vs1, vs2 : vd}, - disasm: "vmadd.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmadd_b_vx_m{: vs1, vs2 : vd}, - disasm: "vmadd.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmadd_h_vx{: vs1, vs2 : vd}, - disasm: "vmadd.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmadd_h_vx_m{: vs1, vs2 : vd}, - disasm: "vmadd.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vmadd_w_vx{: vs1, vs2 : vd}, - disasm: "vmadd.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vmadd_w_vx_m{: vs1, vs2 : vd}, - disasm: "vmadd.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVMadd<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vslidevn - vsliden_b_1_vv{: vs1, vs2 : vd}, - disasm: "vsliden.b.1.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 1 /* index */, false /* strip_mine */)"; - vsliden_b_2_vv{: vs1, vs2 : vd}, - disasm: "vsliden.b.2.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 2 /* index */, false /* strip_mine */)"; - vsliden_b_3_vv{: vs1, vs2 : vd}, - disasm: "vsliden.b.3.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 3 /* index */, false /* strip_mine */)"; - vsliden_b_4_vv{: vs1, vs2 : vd}, - disasm: "vsliden.b.4.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 4 /* index */, false /* strip_mine */)"; - vsliden_h_1_vv{: vs1, vs2 : vd}, - disasm: "vsliden.h.1.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 1 /* index */, false /* strip_mine */)"; - vsliden_h_2_vv{: vs1, vs2 : vd}, - disasm: "vsliden.h.2.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 2 /* index */, false /* strip_mine */)"; - vsliden_h_3_vv{: vs1, vs2 : vd}, - disasm: "vsliden.h.3.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 3 /* index */, false /* strip_mine */)"; - vsliden_h_4_vv{: vs1, vs2 : vd}, - disasm: "vsliden.h.4.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 4 /* index */, false /* strip_mine */)"; - vsliden_w_1_vv{: vs1, vs2 : vd}, - disasm: "vsliden.w.1.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 1 /* index */, false /* strip_mine */)"; - vsliden_w_2_vv{: vs1, vs2 : vd}, - disasm: "vsliden.w.2.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 2 /* index */, false /* strip_mine */)"; - vsliden_w_3_vv{: vs1, vs2 : vd}, - disasm: "vsliden.w.3.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 3 /* index */, false /* strip_mine */)"; - vsliden_w_4_vv{: vs1, vs2 : vd}, - disasm: "vsliden.w.4.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 4 /* index */, false /* strip_mine */)"; - vslidevn_b_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.b.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 1 /* index */, true /* strip_mine */)"; - vslidevn_b_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.b.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 2 /* index */, true /* strip_mine */)"; - vslidevn_b_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.b.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 3 /* index */, true /* strip_mine */)"; - vslidevn_b_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.b.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 4 /* index */, true /* strip_mine */)"; - vslidevn_h_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.h.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 1 /* index */, true /* strip_mine */)"; - vslidevn_h_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.h.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 2 /* index */, true /* strip_mine */)"; - vslidevn_h_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.h.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 3 /* index */, true /* strip_mine */)"; - vslidevn_h_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.h.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 4 /* index */, true /* strip_mine */)"; - vslidevn_w_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.w.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 1 /* index */, true /* strip_mine */)"; - vslidevn_w_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.w.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 2 /* index */, true /* strip_mine */)"; - vslidevn_w_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.w.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 3 /* index */, true /* strip_mine */)"; - vslidevn_w_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevn.w.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 4 /* index */, true /* strip_mine */)"; - - //vslidehn - vslidehn_b_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.b.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int8_t>, 1 /* index */)"; - vslidehn_b_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.b.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int8_t>, 2 /* index */)"; - vslidehn_b_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.b.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int8_t>, 3 /* index */)"; - vslidehn_b_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.b.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int8_t>, 4 /* index */)"; - vslidehn_h_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.h.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int16_t>, 1 /* index */)"; - vslidehn_h_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.h.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int16_t>, 2 /* index */)"; - vslidehn_h_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.h.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int16_t>, 3 /* index */)"; - vslidehn_h_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.h.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int16_t>, 4 /* index */)"; - vslidehn_w_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.w.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int32_t>, 1 /* index */)"; - vslidehn_w_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.w.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int32_t>, 2 /* index */)"; - vslidehn_w_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.w.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int32_t>, 3 /* index */)"; - vslidehn_w_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehn.w.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehn<int32_t>, 4 /* index */)"; - - //vslidevp - vslidep_b_1_vv{: vs1, vs2 : vd}, - disasm: "vslidep.b.1.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 1 /* index */, false /* strip_mine */)"; - vslidep_b_2_vv{: vs1, vs2 : vd}, - disasm: "vslidep.b.2.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 2 /* index */, false /* strip_mine */)"; - vslidep_b_3_vv{: vs1, vs2 : vd}, - disasm: "vslidep.b.3.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 3 /* index */, false /* strip_mine */)"; - vslidep_b_4_vv{: vs1, vs2 : vd}, - disasm: "vslidep.b.4.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 4 /* index */, false /* strip_mine */)"; - vslidep_h_1_vv{: vs1, vs2 : vd}, - disasm: "vslidep.h.1.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 1 /* index */, false /* strip_mine */)"; - vslidep_h_2_vv{: vs1, vs2 : vd}, - disasm: "vslidep.h.2.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 2 /* index */, false /* strip_mine */)"; - vslidep_h_3_vv{: vs1, vs2 : vd}, - disasm: "vslidep.h.3.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 3 /* index */, false /* strip_mine */)"; - vslidep_h_4_vv{: vs1, vs2 : vd}, - disasm: "vslidep.h.4.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 4 /* index */, false /* strip_mine */)"; - vslidep_w_1_vv{: vs1, vs2 : vd}, - disasm: "vslidep.w.1.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 1 /* index */, false /* strip_mine */)"; - vslidep_w_2_vv{: vs1, vs2 : vd}, - disasm: "vslidep.w.2.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 2 /* index */, false /* strip_mine */)"; - vslidep_w_3_vv{: vs1, vs2 : vd}, - disasm: "vslidep.w.3.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 3 /* index */, false /* strip_mine */)"; - vslidep_w_4_vv{: vs1, vs2 : vd}, - disasm: "vslidep.w.4.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 4 /* index */, false /* strip_mine */)"; - vslidevp_b_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.b.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 1 /* index */, true /* strip_mine */)"; - vslidevp_b_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.b.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 2 /* index */, true /* strip_mine */)"; - vslidevp_b_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.b.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 3 /* index */, true /* strip_mine */)"; - vslidevp_b_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.b.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 4 /* index */, true /* strip_mine */)"; - vslidevp_h_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.h.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 1 /* index */, true /* strip_mine */)"; - vslidevp_h_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.h.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 2 /* index */, true /* strip_mine */)"; - vslidevp_h_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.h.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 3 /* index */, true /* strip_mine */)"; - vslidevp_h_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.h.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 4 /* index */, true /* strip_mine */)"; - vslidevp_w_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.w.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 1 /* index */, true /* strip_mine */)"; - vslidevp_w_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.w.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 2 /* index */, true /* strip_mine */)"; - vslidevp_w_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.w.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 3 /* index */, true /* strip_mine */)"; - vslidevp_w_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidevp.w.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 4 /* index */, true /* strip_mine */)"; - - //vslidehp - vslidehp_b_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.b.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int8_t>, 1 /* index */)"; - vslidehp_b_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.b.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int8_t>, 2 /* index */)"; - vslidehp_b_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.b.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int8_t>, 3 /* index */)"; - vslidehp_b_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.b.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int8_t>, 4 /* index */)"; - vslidehp_h_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.h.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int16_t>, 1 /* index */)"; - vslidehp_h_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.h.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int16_t>, 2 /* index */)"; - vslidehp_h_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.h.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int16_t>, 3 /* index */)"; - vslidehp_h_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.h.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int16_t>, 4 /* index */)"; - vslidehp_w_1_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.w.1.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int32_t>, 1 /* index */)"; - vslidehp_w_2_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.w.2.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int32_t>, 2 /* index */)"; - vslidehp_w_3_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.w.3.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int32_t>, 3 /* index */)"; - vslidehp_w_4_vv_m{: vs1, vs2 : vd}, - disasm: "vslidehp.w.4.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSlidehp<int32_t>, 4 /* index */)"; - - //vsel - vsel_b_vv{: vs1, vs2, vd : vd}, - disasm: "vsel.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsel_b_vv_m{: vs1, vs2, vd : vd}, - disasm: "vsel.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsel_h_vv{: vs1, vs2, vd : vd}, - disasm: "vsel.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsel_h_vv_m{: vs1, vs2, vd : vd}, - disasm: "vsel.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsel_w_vv{: vs1, vs2, vd : vd}, - disasm: "vsel.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vsel_w_vv_m{: vs1, vs2, vd : vd}, - disasm: "vsel.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vsel_b_vx{: vs1, vs2, vd : vd}, - disasm: "vsel.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsel_b_vx_m{: vs1, vs2, vd : vd}, - disasm: "vsel.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsel_h_vx{: vs1, vs2, vd : vd}, - disasm: "vsel.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsel_h_vx_m{: vs1, vs2, vd : vd}, - disasm: "vsel.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vsel_w_vx{: vs1, vs2, vd : vd}, - disasm: "vsel.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vsel_w_vx_m{: vs1, vs2, vd : vd}, - disasm: "vsel.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSel<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vevn - vevn_b_vv{: vs1, vs2 : vd}, - disasm: "vevn.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vevn_b_vv_m{: vs1, vs2 : vd}, - disasm: "vevn.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vevn_h_vv{: vs1, vs2 : vd}, - disasm: "vevn.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vevn_h_vv_m{: vs1, vs2 : vd}, - disasm: "vevn.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vevn_w_vv{: vs1, vs2 : vd}, - disasm: "vevn.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vevn_w_vv_m{: vs1, vs2 : vd}, - disasm: "vevn.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vevn_b_vx{: vs1, vs2 : vd}, - disasm: "vevn.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vevn_b_vx_m{: vs1, vs2 : vd}, - disasm: "vevn.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vevn_h_vx{: vs1, vs2 : vd}, - disasm: "vevn.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vevn_h_vx_m{: vs1, vs2 : vd}, - disasm: "vevn.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vevn_w_vx{: vs1, vs2 : vd}, - disasm: "vevn.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vevn_w_vx_m{: vs1, vs2 : vd}, - disasm: "vevn.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvn<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vodd - vodd_b_vv{: vs1, vs2 : vd}, - disasm: "vodd.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vodd_b_vv_m{: vs1, vs2 : vd}, - disasm: "vodd.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vodd_h_vv{: vs1, vs2 : vd}, - disasm: "vodd.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vodd_h_vv_m{: vs1, vs2 : vd}, - disasm: "vodd.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vodd_w_vv{: vs1, vs2 : vd}, - disasm: "vodd.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vodd_w_vv_m{: vs1, vs2 : vd}, - disasm: "vodd.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vodd_b_vx{: vs1, vs2 : vd}, - disasm: "vodd.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vodd_b_vx_m{: vs1, vs2 : vd}, - disasm: "vodd.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vodd_h_vx{: vs1, vs2 : vd}, - disasm: "vodd.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vodd_h_vx_m{: vs1, vs2 : vd}, - disasm: "vodd.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vodd_w_vx{: vs1, vs2 : vd}, - disasm: "vodd.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vodd_w_vx_m{: vs1, vs2 : vd}, - disasm: "vodd.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVOdd<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vevnodd - vevnodd_b_vv{: vs1, vs2 : vd}, - disasm: "vevnodd.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vevnodd_b_vv_m{: vs1, vs2 : vd}, - disasm: "vevnodd.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vevnodd_h_vv{: vs1, vs2 : vd}, - disasm: "vevnodd.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vevnodd_h_vv_m{: vs1, vs2 : vd}, - disasm: "vevnodd.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vevnodd_w_vv{: vs1, vs2 : vd}, - disasm: "vevnodd.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vevnodd_w_vv_m{: vs1, vs2 : vd}, - disasm: "vevnodd.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vevnodd_b_vx{: vs1, vs2 : vd}, - disasm: "vevnodd.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vevnodd_b_vx_m{: vs1, vs2 : vd}, - disasm: "vevnodd.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vevnodd_h_vx{: vs1, vs2 : vd}, - disasm: "vevnodd.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vevnodd_h_vx_m{: vs1, vs2 : vd}, - disasm: "vevnodd.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vevnodd_w_vx{: vs1, vs2 : vd}, - disasm: "vevnodd.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vevnodd_w_vx_m{: vs1, vs2 : vd}, - disasm: "vevnodd.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVEvnodd<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vzip - vzip_b_vv{: vs1, vs2 : vd}, - disasm: "vzip.b.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vzip_b_vv_m{: vs1, vs2 : vd}, - disasm: "vzip.b.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vzip_h_vv{: vs1, vs2 : vd}, - disasm: "vzip.h.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vzip_h_vv_m{: vs1, vs2 : vd}, - disasm: "vzip.h.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vzip_w_vv{: vs1, vs2 : vd}, - disasm: "vzip.w.vv", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; - vzip_w_vv_m{: vs1, vs2 : vd}, - disasm: "vzip.w.vv.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; - vzip_b_vx{: vs1, vs2 : vd}, - disasm: "vzip.b.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vzip_b_vx_m{: vs1, vs2 : vd}, - disasm: "vzip.b.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vzip_h_vx{: vs1, vs2 : vd}, - disasm: "vzip.h.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vzip_h_vx_m{: vs1, vs2 : vd}, - disasm: "vzip.h.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; - vzip_w_vx{: vs1, vs2 : vd}, - disasm: "vzip.w.vx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; - vzip_w_vx_m{: vs1, vs2 : vd}, - disasm: "vzip.w.vx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVZip<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; - - //vld - vld_b_x{(: vs1 :), (: : vd)}, - disasm: "vld.b.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>, /*strip_mine*/ false)"; - vld_h_x{(: vs1 :), (: : vd)}, - disasm: "vld.h.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; - vld_w_x{(: vs1 :), (: : vd)}, - disasm: "vld.w.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; - vld_b_x_m{(: vs1 :), (: : vd)}, - disasm: "vld.b.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; - vld_h_x_m{(: vs1 :), (: : vd)}, - disasm: "vld.h.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; - vld_w_x_m{(: vs1 :), (: : vd)}, - disasm: "vld.w.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; - vld_b_p_x{(: vs1 : vs1), (: : vd)}, - disasm: "vld.b.p.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; - vld_h_p_x{(: vs1 : vs1), (: : vd)}, - disasm: "vld.h.p.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; - vld_w_p_x{(: vs1 : vs1), (: : vd)}, - disasm: "vld.w.p.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; - vld_b_p_x_m{(: vs1 : vs1), (: : vd)}, - disasm: "vld.b.p.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; - vld_h_p_x_m{(: vs1 : vs1), (: : vd)}, - disasm: "vld.h.p.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; - vld_w_p_x_m{(: vs1 : vs1), (: : vd)}, - disasm: "vld.w.p.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; - vld_b_p_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.b.p.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; - vld_h_p_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.h.p.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; - vld_w_p_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.w.p.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; - vld_b_p_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.b.p.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; - vld_h_p_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.h.p.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; - vld_w_p_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.w.p.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; - vld_b_l_xx{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.b.l.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>, /*strip_mine*/ false)"; - vld_h_l_xx{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.h.l.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; - vld_w_l_xx{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.w.l.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; - vld_b_l_xx_m{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.b.l.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; - vld_h_l_xx_m{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.h.l.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; - vld_w_l_xx_m{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.w.l.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; - vld_b_lp_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.b.lp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; - vld_h_lp_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.h.lp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; - vld_w_lp_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.w.lp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; - vld_b_lp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.b.lp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; - vld_h_lp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.h.lp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; - vld_w_lp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.w.lp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; - vld_b_s_xx{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.b.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>, /*strip_mine*/ false)"; - vld_h_s_xx{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.h.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; - vld_w_s_xx{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.w.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; - vld_b_s_xx_m{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.b.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; - vld_h_s_xx_m{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.h.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; - vld_w_s_xx_m{(: vs1, vs2 :), (: : vd)}, - disasm: "vld.w.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; - vld_b_sp_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.b.sp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; - vld_h_sp_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.h.sp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; - vld_w_sp_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.w.sp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; - vld_b_sp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.b.sp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; - vld_h_sp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.h.sp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; - vld_w_sp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.w.sp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; - vld_b_tp_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.b.tp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; - vld_h_tp_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.h.tp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; - vld_w_tp_xx{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.w.tp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; - vld_b_tp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.b.tp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; - vld_h_tp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.h.tp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; - vld_w_tp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, - disasm: "vld.w.tp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)", - "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; - //vst, note `vd` is actually the source vector register, and `vs1` is actually the scaler register. - vst_b_x{: vd, vs1 :}, - disasm: "vst.b.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; - vst_h_x{: vd, vs1 :}, - disasm: "vst.h.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; - vst_w_x{: vd, vs1 :}, - disasm: "vst.w.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; - vst_b_x_m{: vd, vs1 :}, - disasm: "vst.b.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; - vst_h_x_m{: vd, vs1 :}, - disasm: "vst.h.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; - vst_w_x_m{: vd, vs1 :}, - disasm: "vst.w.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; - vst_b_p_x{: vd, vs1 : vs1}, - disasm: "vst.b.p.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; - vst_h_p_x{: vd, vs1 : vs1}, - disasm: "vst.h.p.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; - vst_w_p_x{: vd, vs1 : vs1}, - disasm: "vst.w.p.x", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; - vst_b_p_x_m{: vd, vs1 : vs1}, - disasm: "vst.b.p.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; - vst_h_p_x_m{: vd, vs1 : vs1}, - disasm: "vst.h.p.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; - vst_w_p_x_m{: vd, vs1 : vs1}, - disasm: "vst.w.p.x.m", "%vd, %vs1", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; - vst_b_p_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.b.p.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; - vst_h_p_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.h.p.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; - vst_w_p_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.w.p.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; - vst_b_p_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.b.p.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; - vst_h_p_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.h.p.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; - vst_w_p_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vld.w.p.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; - vst_b_l_xx{: vd, vs1, vs2 :}, - disasm: "vst.b.l.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; - vst_h_l_xx{: vd, vs1, vs2 :}, - disasm: "vst.h.l.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; - vst_w_l_xx{: vd, vs1, vs2 :}, - disasm: "vst.w.l.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; - vst_b_l_xx_m{: vd, vs1, vs2 :}, - disasm: "vst.b.l.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; - vst_h_l_xx_m{: vd, vs1, vs2 :}, - disasm: "vst.h.l.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; - vst_w_l_xx_m{: vd, vs1, vs2 :}, - disasm: "vst.w.l.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; - vst_b_lp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.b.lp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; - vst_h_lp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.h.lp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; - vst_w_lp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.w.lp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; - vst_b_lp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.b.lp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; - vst_h_lp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.h.lp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; - vst_w_lp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.w.lp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; - vst_b_s_xx{: vd, vs1, vs2 :}, - disasm: "vst.b.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; - vst_h_s_xx{: vd, vs1, vs2 :}, - disasm: "vst.h.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; - vst_w_s_xx{: vd, vs1, vs2 :}, - disasm: "vst.w.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; - vst_b_s_xx_m{: vd, vs1, vs2 :}, - disasm: "vst.b.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; - vst_h_s_xx_m{: vd, vs1, vs2 :}, - disasm: "vst.h.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; - vst_w_s_xx_m{: vd, vs1, vs2 :}, - disasm: "vst.w.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; - vst_b_sp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.b.sp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; - vst_h_sp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.h.sp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; - vst_w_sp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.w.sp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; - vst_b_sp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.b.sp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; - vst_h_sp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.h.sp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; - vst_w_sp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.w.sp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; - vst_b_tp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.b.tp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)"; - vst_h_tp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.h.tp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)"; - vst_w_tp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vst.w.tp.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)"; - vst_b_tp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.b.tp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)"; - vst_h_tp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.h.tp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)"; - vst_w_tp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vst.w.tp.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)"; - vstq_b_s_xx{: vd, vs1, vs2 :}, - disasm: "vstq.b.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ false)"; - vstq_h_s_xx{: vd, vs1, vs2 :}, - disasm: "vstq.h.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ false)"; - vstq_w_s_xx{: vd, vs1, vs2 :}, - disasm: "vstq.w.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ false)"; - vstq_b_sp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vstq.b.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ false)"; - vstq_h_sp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vstq.h.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ false)"; - vstq_w_sp_xx{: vd, vs1, vs2 : vs1}, - disasm: "vstq.w.s.xx", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ false)"; - vstq_b_s_xx_m{: vd, vs1, vs2 :}, - disasm: "vstq.b.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ true)"; - vstq_h_s_xx_m{: vd, vs1, vs2 :}, - disasm: "vstq.h.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ true)"; - vstq_w_s_xx_m{: vd, vs1, vs2 :}, - disasm: "vstq.w.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ true)"; - vstq_b_sp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vstq.b.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ true)"; - vstq_h_sp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vstq.h.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ true)"; - vstq_w_sp_xx_m{: vd, vs1, vs2 : vs1}, - disasm: "vstq.w.s.xx.m", "%vd, %vs1, %vs2", - semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ true)"; - } -} - -slot kelvin_memory { - includes { - #include "sim/kelvin_instructions.h" - } - default size = 4; - default latency = global_latency; - opcodes { - flushall{}, - disasm: "flushall", - semfunc: "&KelvinNopInstruction"; - flushat{: rs1 :}, - disasm: "flushat", "%rs1", - semfunc: "&KelvinNopInstruction"; - } -} - -slot kelvin_system { - includes { - #include "sim/kelvin_vector_memory_instructions.h" - } - default size = 4; - default latency = global_latency; - resources TwoOp = { next_pc, rs1 : rd[..rd]}; - resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]}; - opcodes { - getmaxvl_b{: : rd}, - resources: { next_pc : rd[0..]}, - disasm: "getmaxvl.b", "%rd", - semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ false, /*is_rs1*/ false, /*is_rs2*/ false)"; - getmaxvl_h{: : rd}, - resources: { next_pc : rd[0..]}, - disasm: "getmaxvl.h", "%rd", - semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ false, /*is_rs1*/ false, /*is_rs2*/ false)"; - getmaxvl_w{: : rd}, - resources: { next_pc : rd[0..]}, - disasm: "getmaxvl.w", "%rd", - semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ false, /*is_rs1*/ false, /*is_rs2*/ false)"; - getvl_b_x{: rs1 : rd}, - resources: TwoOp, - disasm: "getvl.b.x", "%rd, %rs1", - semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ false)"; - getvl_h_x{: rs1 : rd}, - resources: TwoOp, - disasm: "getvl.h.x", "%rd, %rs1", - semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ false)"; - getvl_w_x{: rs1 : rd}, - resources: TwoOp, - disasm: "getvl.w.x", "%rd, %rs1", - semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ false)"; - getvl_b_xx{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "getvl.b.xx", "%rd, %rs1, %rs2", - semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ true)"; - getvl_h_xx{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "getvl.h.xx", "%rd, %rs1, %rs2", - semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ true)"; - getvl_w_xx{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "getvl.w.xx", "%rd, %rs1, %rs2", - semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ true)"; - getmaxvl_b_m{: : rd}, - resources: { next_pc : rd[0..]}, - disasm: "getmaxvl.b.m", "%rd", - semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ true, /*is_rs1*/ false, /*is_rs2*/ false)"; - getmaxvl_h_m{: : rd}, - resources: { next_pc : rd[0..]}, - disasm: "getmaxvl.h.m", "%rd", - semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ true, /*is_rs1*/ false, /*is_rs2*/ false)"; - getmaxvl_w_m{: : rd}, - resources: { next_pc : rd[0..]}, - disasm: "getmaxvl.w.m", "%rd", - semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ true, /*is_rs1*/ false, /*is_rs2*/ false)"; - getvl_b_x_m{: rs1 : rd}, - resources: TwoOp, - disasm: "getvl.b.x.m", "%rd, %rs1", - semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ false)"; - getvl_h_x_m{: rs1 : rd}, - resources: TwoOp, - disasm: "getvl.h.x.m", "%rd, %rs1", - semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ false)"; - getvl_w_x_m{: rs1 : rd}, - resources: TwoOp, - disasm: "getvl.w.x.m", "%rd, %rs1", - semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ false)"; - getvl_b_xx_m{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "getvl.b.xx.m", "%rd, %rs1, %rs2", - semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ true)"; - getvl_h_xx_m{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "getvl.h.xx.m", "%rd, %rs1, %rs2", - semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ true)"; - getvl_w_xx_m{: rs1, rs2 : rd}, - resources: ThreeOp, - disasm: "getvl.w.xx.m", "%rd, %rs1, %rs2", - semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ true)"; - } -} - -slot kelvin_log { - includes { - #include "sim/kelvin_instructions.h" - } - default size = 4; - default latency = global_latency; - opcodes { - flog{: rs1 :}, - resources: { next_pc : rs1[0..]}, - disasm: "flog", "%rs1", - semfunc: "absl::bind_front(&KelvinLogInstruction, /*log_mode*/ 0)"; - slog{: rs1 :}, - resources: { next_pc : rs1[0..]}, - disasm: "slog", "%rs1", - semfunc: "absl::bind_front(&KelvinLogInstruction, /*log_mode*/ 1)"; - clog{: rs1 :}, - resources: { next_pc : rs1[0..]}, - disasm: "clog", "%rs1", - semfunc: "absl::bind_front(&KelvinLogInstruction, /*log_mode*/ 2)"; - klog{: rs1 :}, - resources: { next_pc : rs1[0..]}, - disasm: "klog", "%rs1", - semfunc: "absl::bind_front(&KelvinLogInstruction, /*log_mode*/ 3)"; - } -} +#include "sim/kelvin_base.isa" +#include "sim/kelvin_arith.isa" +#include "sim/kelvin_shift.isa" +#include "sim/kelvin_memory.isa" +#include "sim/kelvin_mul.isa" // Combining all kelvin instruction sets. -slot kelvin : riscv32i, riscv32m, zicsr, zfencei, privileged, kelvin_arith, kelvin_log, kelvin_memory, kelvin_system { +slot kelvin : riscv32i, riscv32m, zicsr, zfencei, privileged, kelvin_arith, + kelvin_log, kelvin_memory, kelvin_mul, kelvin_shift, kelvin_vector_memory { includes { #include "sim/kelvin_instructions.h" }
diff --git a/sim/kelvin_arith.isa b/sim/kelvin_arith.isa new file mode 100644 index 0000000..afb36ff --- /dev/null +++ b/sim/kelvin_arith.isa
@@ -0,0 +1,1572 @@ +// This file define the kelvin base isa for mpact-sim. For more info on mpact-sim +// isa format, check: go/mpact-sim-codelabs-riscv-instruction-decoder + +// First disasm field is 18 char wide and left justified. +disasm widths = {-18}; + +// Kelvin simd instructions: +// https://spacebeaker.googlesource.com/shodan/sw/kelvin/+/refs/heads/master/docs/kelvin_isa.md +// Arithmetics/Logical instructions (func1 000/100/001) +slot kelvin_arith { + includes { + #include "sim/kelvin_instructions.h" + #include "sim/kelvin_vector_instructions.h" + #include "absl/functional/bind_front.h" + } + default size = 4; + default latency = global_latency; + opcodes { + // vadd + vadd_b_vv{: vs1, vs2 : vd}, + disasm: "vadd.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadd_b_vv_m{: vs1, vs2 : vd}, + disasm: "vadd.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadd_h_vv{: vs1, vs2 : vd}, + disasm: "vadd.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadd_h_vv_m{: vs1, vs2 : vd}, + disasm: "vadd.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadd_w_vv{: vs1, vs2 : vd}, + disasm: "vadd.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadd_w_vv_m{: vs1, vs2 : vd}, + disasm: "vadd.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadd_b_vx{: vs1, vs2 : vd}, + disasm: "vadd.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadd_b_vx_m{: vs1, vs2 : vd}, + disasm: "vadd.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vadd_h_vx{: vs1, vs2 : vd}, + disasm: "vadd.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadd_h_vx_m{: vs1, vs2 : vd}, + disasm: "vadd.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vadd_w_vx{: vs1, vs2 : vd}, + disasm: "vadd.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadd_w_vx_m{: vs1, vs2 : vd}, + disasm: "vadd.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vsub + vsub_b_vv{: vs1, vs2 : vd}, + disasm: "vsub.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsub_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsub.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsub_h_vv{: vs1, vs2 : vd}, + disasm: "vsub.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsub_h_vv_m{: vs1, vs2 : vd}, + disasm: "vsub.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsub_w_vv{: vs1, vs2 : vd}, + disasm: "vsub.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsub_w_vv_m{: vs1, vs2 : vd}, + disasm: "vsub.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsub_b_vx{: vs1, vs2 : vd}, + disasm: "vsub.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsub_b_vx_m{: vs1, vs2 : vd}, + disasm: "vsub.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsub_h_vx{: vs1, vs2 : vd}, + disasm: "vsub.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsub_h_vx_m{: vs1, vs2 : vd}, + disasm: "vsub.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsub_w_vx{: vs1, vs2 : vd}, + disasm: "vsub.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsub_w_vx_m{: vs1, vs2 : vd}, + disasm: "vsub.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSub<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vrsub + vrsub_b_vv{: vs1, vs2 : vd}, + disasm: "vrsub.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vrsub_b_vv_m{: vs1, vs2 : vd}, + disasm: "vrsub.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vrsub_h_vv{: vs1, vs2 : vd}, + disasm: "vrsub.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vrsub_h_vv_m{: vs1, vs2 : vd}, + disasm: "vrsub.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vrsub_w_vv{: vs1, vs2 : vd}, + disasm: "vrsub.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vrsub_w_vv_m{: vs1, vs2 : vd}, + disasm: "vrsub.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vrsub_b_vx{: vs1, vs2 : vd}, + disasm: "vrsub.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vrsub_b_vx_m{: vs1, vs2 : vd}, + disasm: "vrsub.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vrsub_h_vx{: vs1, vs2 : vd}, + disasm: "vrsub.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vrsub_h_vx_m{: vs1, vs2 : vd}, + disasm: "vrsub.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vrsub_w_vx{: vs1, vs2 : vd}, + disasm: "vrsub.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vrsub_w_vx_m{: vs1, vs2 : vd}, + disasm: "vrsub.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRSub<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // veq + veq_b_vv{: vs1, vs2 : vd}, + disasm: "veq.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + veq_b_vv_m{: vs1, vs2 : vd}, + disasm: "veq.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + veq_h_vv{: vs1, vs2 : vd}, + disasm: "veq.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + veq_h_vv_m{: vs1, vs2 : vd}, + disasm: "veq.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + veq_w_vv{: vs1, vs2 : vd}, + disasm: "veq.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + veq_w_vv_m{: vs1, vs2 : vd}, + disasm: "veq.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + veq_b_vx{: vs1, vs2 : vd}, + disasm: "veq.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + veq_b_vx_m{: vs1, vs2 : vd}, + disasm: "veq.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + veq_h_vx{: vs1, vs2 : vd}, + disasm: "veq.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + veq_h_vx_m{: vs1, vs2 : vd}, + disasm: "veq.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + veq_w_vx{: vs1, vs2 : vd}, + disasm: "veq.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + veq_w_vx_m{: vs1, vs2 : vd}, + disasm: "veq.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEq<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vne + vne_b_vv{: vs1, vs2 : vd}, + disasm: "vne.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vne_b_vv_m{: vs1, vs2 : vd}, + disasm: "vne.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vne_h_vv{: vs1, vs2 : vd}, + disasm: "vne.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vne_h_vv_m{: vs1, vs2 : vd}, + disasm: "vne.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vne_w_vv{: vs1, vs2 : vd}, + disasm: "vne.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vne_w_vv_m{: vs1, vs2 : vd}, + disasm: "vne.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vne_b_vx{: vs1, vs2 : vd}, + disasm: "vne.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vne_b_vx_m{: vs1, vs2 : vd}, + disasm: "vne.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vne_h_vx{: vs1, vs2 : vd}, + disasm: "vne.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vne_h_vx_m{: vs1, vs2 : vd}, + disasm: "vne.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vne_w_vx{: vs1, vs2 : vd}, + disasm: "vne.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vne_w_vx_m{: vs1, vs2 : vd}, + disasm: "vne.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVNe<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vlt + vlt_b_vv{: vs1, vs2 : vd}, + disasm: "vlt.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vlt_b_vv_m{: vs1, vs2 : vd}, + disasm: "vlt.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vlt_h_vv{: vs1, vs2 : vd}, + disasm: "vlt.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vlt_h_vv_m{: vs1, vs2 : vd}, + disasm: "vlt.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vlt_w_vv{: vs1, vs2 : vd}, + disasm: "vlt.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vlt_w_vv_m{: vs1, vs2 : vd}, + disasm: "vlt.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vlt_b_vx{: vs1, vs2 : vd}, + disasm: "vlt.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vlt_b_vx_m{: vs1, vs2 : vd}, + disasm: "vlt.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vlt_h_vx{: vs1, vs2 : vd}, + disasm: "vlt.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vlt_h_vx_m{: vs1, vs2 : vd}, + disasm: "vlt.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vlt_w_vx{: vs1, vs2 : vd}, + disasm: "vlt.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vlt_w_vx_m{: vs1, vs2 : vd}, + disasm: "vlt.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vltu + vlt_u_b_vv{: vs1, vs2 : vd}, + disasm: "vlt.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vlt_u_b_vv_m{: vs1, vs2 : vd}, + disasm: "vlt.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vlt_u_h_vv{: vs1, vs2 : vd}, + disasm: "vlt.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vlt_u_h_vv_m{: vs1, vs2 : vd}, + disasm: "vlt.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vlt_u_w_vv{: vs1, vs2 : vd}, + disasm: "vlt.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vlt_u_w_vv_m{: vs1, vs2 : vd}, + disasm: "vlt.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vlt_u_b_vx{: vs1, vs2 : vd}, + disasm: "vlt.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vlt_u_b_vx_m{: vs1, vs2 : vd}, + disasm: "vlt.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vlt_u_h_vx{: vs1, vs2 : vd}, + disasm: "vlt.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vlt_u_h_vx_m{: vs1, vs2 : vd}, + disasm: "vlt.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vlt_u_w_vx{: vs1, vs2 : vd}, + disasm: "vlt.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vlt_u_w_vx_m{: vs1, vs2 : vd}, + disasm: "vlt.w.u.vx.m", "%vd, %vs1,V %vs2", + semfunc: "absl::bind_front(&KelvinVLt<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vle + vle_b_vv{: vs1, vs2 : vd}, + disasm: "vle.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vle_b_vv_m{: vs1, vs2 : vd}, + disasm: "vle.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vle_h_vv{: vs1, vs2 : vd}, + disasm: "vle.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vle_h_vv_m{: vs1, vs2 : vd}, + disasm: "vle.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vle_w_vv{: vs1, vs2 : vd}, + disasm: "vle.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vle_w_vv_m{: vs1, vs2 : vd}, + disasm: "vle.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vle_b_vx{: vs1, vs2 : vd}, + disasm: "vle.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vle_b_vx_m{: vs1, vs2 : vd}, + disasm: "vle.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vle_h_vx{: vs1, vs2 : vd}, + disasm: "vle.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vle_h_vx_m{: vs1, vs2 : vd}, + disasm: "vle.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vle_w_vx{: vs1, vs2 : vd}, + disasm: "vle.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vle_w_vx_m{: vs1, vs2 : vd}, + disasm: "vle.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vleu + vle_u_b_vv{: vs1, vs2 : vd}, + disasm: "vle.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vle_u_b_vv_m{: vs1, vs2 : vd}, + disasm: "vle.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vle_u_h_vv{: vs1, vs2 : vd}, + disasm: "vle.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vle_u_h_vv_m{: vs1, vs2 : vd}, + disasm: "vle.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vle_u_w_vv{: vs1, vs2 : vd}, + disasm: "vle.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vle_u_w_vv_m{: vs1, vs2 : vd}, + disasm: "vle.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vle_u_b_vx{: vs1, vs2 : vd}, + disasm: "vle.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vle_u_b_vx_m{: vs1, vs2 : vd}, + disasm: "vle.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vle_u_h_vx{: vs1, vs2 : vd}, + disasm: "vle.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vle_u_h_vx_m{: vs1, vs2 : vd}, + disasm: "vle.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vle_u_w_vx{: vs1, vs2 : vd}, + disasm: "vle.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vle_u_w_vx_m{: vs1, vs2 : vd}, + disasm: "vle.w.u.vx.m", "%vd, %vs1,V %vs2", + semfunc: "absl::bind_front(&KelvinVLe<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vgt + vgt_b_vv{: vs1, vs2 : vd}, + disasm: "vgt.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vgt_b_vv_m{: vs1, vs2 : vd}, + disasm: "vgt.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vgt_h_vv{: vs1, vs2 : vd}, + disasm: "vgt.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vgt_h_vv_m{: vs1, vs2 : vd}, + disasm: "vgt.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vgt_w_vv{: vs1, vs2 : vd}, + disasm: "vgt.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vgt_w_vv_m{: vs1, vs2 : vd}, + disasm: "vgt.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vgt_b_vx{: vs1, vs2 : vd}, + disasm: "vgt.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vgt_b_vx_m{: vs1, vs2 : vd}, + disasm: "vgt.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vgt_h_vx{: vs1, vs2 : vd}, + disasm: "vgt.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vgt_h_vx_m{: vs1, vs2 : vd}, + disasm: "vgt.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vgt_w_vx{: vs1, vs2 : vd}, + disasm: "vgt.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vgt_w_vx_m{: vs1, vs2 : vd}, + disasm: "vgt.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vgtu + vgt_u_b_vv{: vs1, vs2 : vd}, + disasm: "vgt.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vgt_u_b_vv_m{: vs1, vs2 : vd}, + disasm: "vgt.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vgt_u_h_vv{: vs1, vs2 : vd}, + disasm: "vgt.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vgt_u_h_vv_m{: vs1, vs2 : vd}, + disasm: "vgt.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vgt_u_w_vv{: vs1, vs2 : vd}, + disasm: "vgt.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vgt_u_w_vv_m{: vs1, vs2 : vd}, + disasm: "vgt.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vgt_u_b_vx{: vs1, vs2 : vd}, + disasm: "vgt.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vgt_u_b_vx_m{: vs1, vs2 : vd}, + disasm: "vgt.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vgt_u_h_vx{: vs1, vs2 : vd}, + disasm: "vgt.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vgt_u_h_vx_m{: vs1, vs2 : vd}, + disasm: "vgt.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vgt_u_w_vx{: vs1, vs2 : vd}, + disasm: "vgt.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vgt_u_w_vx_m{: vs1, vs2 : vd}, + disasm: "vgt.w.u.vx.m", "%vd, %vs1,V %vs2", + semfunc: "absl::bind_front(&KelvinVGt<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vge + vge_b_vv{: vs1, vs2 : vd}, + disasm: "vge.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vge_b_vv_m{: vs1, vs2 : vd}, + disasm: "vge.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vge_h_vv{: vs1, vs2 : vd}, + disasm: "vge.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vge_h_vv_m{: vs1, vs2 : vd}, + disasm: "vge.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vge_w_vv{: vs1, vs2 : vd}, + disasm: "vge.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vge_w_vv_m{: vs1, vs2 : vd}, + disasm: "vge.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vge_b_vx{: vs1, vs2 : vd}, + disasm: "vge.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vge_b_vx_m{: vs1, vs2 : vd}, + disasm: "vge.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vge_h_vx{: vs1, vs2 : vd}, + disasm: "vge.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vge_h_vx_m{: vs1, vs2 : vd}, + disasm: "vge.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vge_w_vx{: vs1, vs2 : vd}, + disasm: "vge.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vge_w_vx_m{: vs1, vs2 : vd}, + disasm: "vge.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vgeu + vge_u_b_vv{: vs1, vs2 : vd}, + disasm: "vge.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vge_u_b_vv_m{: vs1, vs2 : vd}, + disasm: "vge.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vge_u_h_vv{: vs1, vs2 : vd}, + disasm: "vge.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vge_u_h_vv_m{: vs1, vs2 : vd}, + disasm: "vge.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vge_u_w_vv{: vs1, vs2 : vd}, + disasm: "vge.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vge_u_w_vv_m{: vs1, vs2 : vd}, + disasm: "vge.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vge_u_b_vx{: vs1, vs2 : vd}, + disasm: "vge.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vge_u_b_vx_m{: vs1, vs2 : vd}, + disasm: "vge.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vge_u_h_vx{: vs1, vs2 : vd}, + disasm: "vge.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vge_u_h_vx_m{: vs1, vs2 : vd}, + disasm: "vge.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vge_u_w_vx{: vs1, vs2 : vd}, + disasm: "vge.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vge_u_w_vx_m{: vs1, vs2 : vd}, + disasm: "vge.w.u.vx.m", "%vd, %vs1,V %vs2", + semfunc: "absl::bind_front(&KelvinVGe<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vabsd + vabsd_b_vv{: vs1, vs2 : vd}, + disasm: "vabsd.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vabsd_b_vv_m{: vs1, vs2 : vd}, + disasm: "vabsd.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vabsd_h_vv{: vs1, vs2 : vd}, + disasm: "vabsd.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vabsd_h_vv_m{: vs1, vs2 : vd}, + disasm: "vabsd.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vabsd_w_vv{: vs1, vs2 : vd}, + disasm: "vabsd.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vabsd_w_vv_m{: vs1, vs2 : vd}, + disasm: "vabsd.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vabsd_b_vx{: vs1, vs2 : vd}, + disasm: "vabsd.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vabsd_b_vx_m{: vs1, vs2 : vd}, + disasm: "vabsd.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vabsd_h_vx{: vs1, vs2 : vd}, + disasm: "vabsd.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vabsd_h_vx_m{: vs1, vs2 : vd}, + disasm: "vabsd.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vabsd_w_vx{: vs1, vs2 : vd}, + disasm: "vabsd.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vabsd_w_vx_m{: vs1, vs2 : vd}, + disasm: "vabsd.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vabsdu + vabsd_u_b_vv{: vs1, vs2 : vd}, + disasm: "vabsd.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vabsd_u_b_vv_m{: vs1, vs2 : vd}, + disasm: "vabsd.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vabsd_u_h_vv{: vs1, vs2 : vd}, + disasm: "vabsd.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vabsd_u_h_vv_m{: vs1, vs2 : vd}, + disasm: "vabsd.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vabsd_u_w_vv{: vs1, vs2 : vd}, + disasm: "vabsd.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vabsd_u_w_vv_m{: vs1, vs2 : vd}, + disasm: "vabsd.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vabsd_u_b_vx{: vs1, vs2 : vd}, + disasm: "vabsd.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vabsd_u_b_vx_m{: vs1, vs2 : vd}, + disasm: "vabsd.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vabsd_u_h_vx{: vs1, vs2 : vd}, + disasm: "vabsd.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vabsd_u_h_vx_m{: vs1, vs2 : vd}, + disasm: "vabsd.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vabsd_u_w_vx{: vs1, vs2 : vd}, + disasm: "vabsd.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vabsd_u_w_vx_m{: vs1, vs2 : vd}, + disasm: "vabsd.w.u.vx.m", "%vd, %vs1,V %vs2", + semfunc: "absl::bind_front(&KelvinVAbsd<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vmax + vmax_b_vv{: vs1, vs2 : vd}, + disasm: "vmax.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmax_b_vv_m{: vs1, vs2 : vd}, + disasm: "vmax.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmax_h_vv{: vs1, vs2 : vd}, + disasm: "vmax.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmax_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmax.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmax_w_vv{: vs1, vs2 : vd}, + disasm: "vmax.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmax_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmax.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmax_b_vx{: vs1, vs2 : vd}, + disasm: "vmax.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmax_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmax.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmax_h_vx{: vs1, vs2 : vd}, + disasm: "vmax.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmax_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmax.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmax_w_vx{: vs1, vs2 : vd}, + disasm: "vmax.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmax_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmax.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vmaxu + vmax_u_b_vv{: vs1, vs2 : vd}, + disasm: "vmax.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmax_u_b_vv_m{: vs1, vs2 : vd}, + disasm: "vmax.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmax_u_h_vv{: vs1, vs2 : vd}, + disasm: "vmax.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmax_u_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmax.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmax_u_w_vv{: vs1, vs2 : vd}, + disasm: "vmax.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmax_u_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmax.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmax_u_b_vx{: vs1, vs2 : vd}, + disasm: "vmax.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmax_u_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmax.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmax_u_h_vx{: vs1, vs2 : vd}, + disasm: "vmax.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmax_u_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmax.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmax_u_w_vx{: vs1, vs2 : vd}, + disasm: "vmax.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmax_u_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmax.w.u.vx.m", "%vd, %vs1,V %vs2", + semfunc: "absl::bind_front(&KelvinVMax<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vmin + vmin_b_vv{: vs1, vs2 : vd}, + disasm: "vmin.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmin_b_vv_m{: vs1, vs2 : vd}, + disasm: "vmin.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmin_h_vv{: vs1, vs2 : vd}, + disasm: "vmin.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmin_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmin.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmin_w_vv{: vs1, vs2 : vd}, + disasm: "vmin.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmin_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmin.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmin_b_vx{: vs1, vs2 : vd}, + disasm: "vmin.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmin_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmin.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmin_h_vx{: vs1, vs2 : vd}, + disasm: "vmin.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmin_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmin.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmin_w_vx{: vs1, vs2 : vd}, + disasm: "vmin.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmin_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmin.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vminu + vmin_u_b_vv{: vs1, vs2 : vd}, + disasm: "vmin.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmin_u_b_vv_m{: vs1, vs2 : vd}, + disasm: "vmin.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmin_u_h_vv{: vs1, vs2 : vd}, + disasm: "vmin.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmin_u_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmin.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmin_u_w_vv{: vs1, vs2 : vd}, + disasm: "vmin.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmin_u_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmin.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmin_u_b_vx{: vs1, vs2 : vd}, + disasm: "vmin.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmin_u_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmin.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmin_u_h_vx{: vs1, vs2 : vd}, + disasm: "vmin.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmin_u_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmin.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmin_u_w_vx{: vs1, vs2 : vd}, + disasm: "vmin.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmin_u_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmin.w.u.vx.m", "%vd, %vs1,V %vs2", + semfunc: "absl::bind_front(&KelvinVMin<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + // vadd3 + vadd3_b_vv{: vs1, vs2, vd : vd}, + disasm: "vadd3.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadd3_b_vv_m{: vs1, vs2, vd : vd}, + disasm: "vadd3.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadd3_h_vv{: vs1, vs2, vd : vd}, + disasm: "vadd3.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadd3_h_vv_m{: vs1, vs2, vd : vd}, + disasm: "vadd3.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadd3_w_vv{: vs1, vs2, vd : vd}, + disasm: "vadd3.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadd3_w_vv_m{: vs1, vs2, vd : vd}, + disasm: "vadd3.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadd3_b_vx{: vs1, vs2, vd : vd}, + disasm: "vadd3.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadd3_b_vx_m{: vs1, vs2, vd : vd}, + disasm: "vadd3.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vadd3_h_vx{: vs1, vs2, vd : vd}, + disasm: "vadd3.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadd3_h_vx_m{: vs1, vs2, vd : vd}, + disasm: "vadd3.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vadd3_w_vx{: vs1, vs2, vd : vd}, + disasm: "vadd3.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadd3_w_vx_m{: vs1, vs2, vd : vd}, + disasm: "vadd3.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdd3<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vadds + vadds_b_vv{: vs1, vs2 : vd}, + disasm: "vadds.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadds_b_vv_m{: vs1, vs2 : vd}, + disasm: "vadds.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadds_h_vv{: vs1, vs2 : vd}, + disasm: "vadds.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadds_h_vv_m{: vs1, vs2 : vd}, + disasm: "vadds.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadds_w_vv{: vs1, vs2 : vd}, + disasm: "vadds.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadds_w_vv_m{: vs1, vs2 : vd}, + disasm: "vadds.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadds_b_vx{: vs1, vs2 : vd}, + disasm: "vadds.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadds_b_vx_m{: vs1, vs2 : vd}, + disasm: "vadds.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vadds_h_vx{: vs1, vs2 : vd}, + disasm: "vadds.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadds_h_vx_m{: vs1, vs2 : vd}, + disasm: "vadds.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vadds_w_vx{: vs1, vs2 : vd}, + disasm: "vadds.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadds_w_vx_m{: vs1, vs2 : vd}, + disasm: "vadds.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAdds<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vaddsu + vadds_u_b_vv{: vs1, vs2 : vd}, + disasm: "vadds.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadds_u_b_vv_m{: vs1, vs2 : vd}, + disasm: "vadds.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadds_u_h_vv{: vs1, vs2 : vd}, + disasm: "vadds.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadds_u_h_vv_m{: vs1, vs2 : vd}, + disasm: "vadds.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadds_u_w_vv{: vs1, vs2 : vd}, + disasm: "vadds.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vadds_u_w_vv_m{: vs1, vs2 : vd}, + disasm: "vadds.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vadds_u_b_vx{: vs1, vs2 : vd}, + disasm: "vadds.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadds_u_b_vx_m{: vs1, vs2 : vd}, + disasm: "vadds.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vadds_u_h_vx{: vs1, vs2 : vd}, + disasm: "vadds.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadds_u_h_vx_m{: vs1, vs2 : vd}, + disasm: "vadds.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vadds_u_w_vx{: vs1, vs2 : vd}, + disasm: "vadds.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vadds_u_w_vx_m{: vs1, vs2 : vd}, + disasm: "vadds.w.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddsu<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vsubs + vsubs_b_vv{: vs1, vs2 : vd}, + disasm: "vsubs.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsubs_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsubs.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsubs_h_vv{: vs1, vs2 : vd}, + disasm: "vsubs.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsubs_h_vv_m{: vs1, vs2 : vd}, + disasm: "vsubs.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsubs_w_vv{: vs1, vs2 : vd}, + disasm: "vsubs.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsubs_w_vv_m{: vs1, vs2 : vd}, + disasm: "vsubs.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsubs_b_vx{: vs1, vs2 : vd}, + disasm: "vsubs.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsubs_b_vx_m{: vs1, vs2 : vd}, + disasm: "vsubs.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsubs_h_vx{: vs1, vs2 : vd}, + disasm: "vsubs.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsubs_h_vx_m{: vs1, vs2 : vd}, + disasm: "vsubs.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsubs_w_vx{: vs1, vs2 : vd}, + disasm: "vsubs.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsubs_w_vx_m{: vs1, vs2 : vd}, + disasm: "vsubs.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubs<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vsubsu + vsubs_u_b_vv{: vs1, vs2 : vd}, + disasm: "vsubs.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsubs_u_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsubs.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsubs_u_h_vv{: vs1, vs2 : vd}, + disasm: "vsubs.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsubs_u_h_vv_m{: vs1, vs2 : vd}, + disasm: "vsubs.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsubs_u_w_vv{: vs1, vs2 : vd}, + disasm: "vsubs.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsubs_u_w_vv_m{: vs1, vs2 : vd}, + disasm: "vsubs.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsubs_u_b_vx{: vs1, vs2 : vd}, + disasm: "vsubs.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsubs_u_b_vx_m{: vs1, vs2 : vd}, + disasm: "vsubs.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsubs_u_h_vx{: vs1, vs2 : vd}, + disasm: "vsubs.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsubs_u_h_vx_m{: vs1, vs2 : vd}, + disasm: "vsubs.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsubs_u_w_vx{: vs1, vs2 : vd}, + disasm: "vsubs.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsubs_u_w_vx_m{: vs1, vs2 : vd}, + disasm: "vsubs.w.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubsu<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vaddw + vaddw_h_vv{: vs1, vs2 : vd}, + disasm: "vaddw.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vaddw_h_vv_m{: vs1, vs2 : vd}, + disasm: "vaddw.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vaddw_w_vv{: vs1, vs2 : vd}, + disasm: "vaddw.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vaddw_w_vv_m{: vs1, vs2 : vd}, + disasm: "vaddw.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vaddw_h_vx{: vs1, vs2 : vd}, + disasm: "vaddw.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vaddw_h_vx_m{: vs1, vs2 : vd}, + disasm: "vaddw.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vaddw_w_vx{: vs1, vs2 : vd}, + disasm: "vaddw.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vaddw_w_vx_m{: vs1, vs2 : vd}, + disasm: "vaddw.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vaddwu + vaddw_h_u_vv{: vs1, vs2 : vd}, + disasm: "vaddw.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vaddw_h_u_vv_m{: vs1, vs2 : vd}, + disasm: "vaddw.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vaddw_w_u_vv{: vs1, vs2 : vd}, + disasm: "vaddw.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vaddw_w_u_vv_m{: vs1, vs2 : vd}, + disasm: "vaddw.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vaddw_h_u_vx{: vs1, vs2 : vd}, + disasm: "vaddw.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vaddw_h_u_vx_m{: vs1, vs2 : vd}, + disasm: "vaddw.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vaddw_w_u_vx{: vs1, vs2 : vd}, + disasm: "vaddw.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vaddw_w_u_vx_m{: vs1, vs2 : vd}, + disasm: "vaddw.w.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAddw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vsubw + vsubw_h_vv{: vs1, vs2 : vd}, + disasm: "vsubw.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsubw_h_vv_m{: vs1, vs2 : vd}, + disasm: "vsubw.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsubw_w_vv{: vs1, vs2 : vd}, + disasm: "vsubw.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsubw_w_vv_m{: vs1, vs2 : vd}, + disasm: "vsubw.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsubw_h_vx{: vs1, vs2 : vd}, + disasm: "vsubw.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsubw_h_vx_m{: vs1, vs2 : vd}, + disasm: "vsubw.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsubw_w_vx{: vs1, vs2 : vd}, + disasm: "vsubw.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsubw_w_vx_m{: vs1, vs2 : vd}, + disasm: "vsubw.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vsubwu + vsubw_h_u_vv{: vs1, vs2 : vd}, + disasm: "vsubw.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsubw_h_u_vv_m{: vs1, vs2 : vd}, + disasm: "vsubw.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsubw_w_u_vv{: vs1, vs2 : vd}, + disasm: "vsubw.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsubw_w_u_vv_m{: vs1, vs2 : vd}, + disasm: "vsubw.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsubw_h_u_vx{: vs1, vs2 : vd}, + disasm: "vsubw.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsubw_h_u_vx_m{: vs1, vs2 : vd}, + disasm: "vsubw.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsubw_w_u_vx{: vs1, vs2 : vd}, + disasm: "vsubw.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsubw_w_u_vx_m{: vs1, vs2 : vd}, + disasm: "vsubw.w.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSubw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vacc + vacc_h_vv{: vs1, vs2 : vd}, + disasm: "vacc.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vacc_h_vv_m{: vs1, vs2 : vd}, + disasm: "vacc.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vacc_w_vv{: vs1, vs2 : vd}, + disasm: "vacc.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vacc_w_vv_m{: vs1, vs2 : vd}, + disasm: "vacc.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vacc_h_vx{: vs1, vs2 : vd}, + disasm: "vacc.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vacc_h_vx_m{: vs1, vs2 : vd}, + disasm: "vacc.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vacc_w_vx{: vs1, vs2 : vd}, + disasm: "vacc.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vacc_w_vx_m{: vs1, vs2 : vd}, + disasm: "vacc.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vaccu + vacc_h_u_vv{: vs1, vs2 : vd}, + disasm: "vacc.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vacc_h_u_vv_m{: vs1, vs2 : vd}, + disasm: "vacc.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vacc_w_u_vv{: vs1, vs2 : vd}, + disasm: "vacc.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vacc_w_u_vv_m{: vs1, vs2 : vd}, + disasm: "vacc.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vacc_h_u_vx{: vs1, vs2 : vd}, + disasm: "vacc.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vacc_h_u_vx_m{: vs1, vs2 : vd}, + disasm: "vacc.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vacc_w_u_vx{: vs1, vs2 : vd}, + disasm: "vacc.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vacc_w_u_vx_m{: vs1, vs2 : vd}, + disasm: "vacc.w.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAcc<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vpadd + vpadd_h_v{: vs1 : vd}, + disasm: "vpadd.h.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPadd<int16_t, int8_t>, /*strip_mine*/ false)"; + vpadd_h_v_m{: vs1 : vd}, + disasm: "vpadd.h.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPadd<int16_t, int8_t>, /*strip_mine*/ true)"; + vpadd_w_v{: vs1 : vd}, + disasm: "vpadd.w.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPadd<int32_t, int16_t>, /*strip_mine*/ false)"; + vpadd_w_v_m{: vs1 : vd}, + disasm: "vpadd.w.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPadd<int32_t, int16_t>, /*strip_mine*/ true)"; + + //vpaddu + vpadd_h_u_v{: vs1 : vd}, + disasm: "vpadd.h.u.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPadd<int16_t, int8_t>, /*strip_mine*/ false)"; + vpadd_h_u_v_m{: vs1 : vd}, + disasm: "vpadd.h.u.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPadd<int16_t, int8_t>, /*strip_mine*/ true)"; + vpadd_w_u_v{: vs1 : vd}, + disasm: "vpadd.w.u.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPadd<int32_t, int16_t>, /*strip_mine*/ false)"; + vpadd_w_u_v_m{: vs1 : vd}, + disasm: "vpadd.w.u.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPadd<int32_t, int16_t>, /*strip_mine*/ true)"; + + //vpsub + vpsub_h_v{: vs1 : vd}, + disasm: "vpsub.h.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPsub<int16_t, int8_t>, /*strip_mine*/ false)"; + vpsub_h_v_m{: vs1 : vd}, + disasm: "vpsub.h.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPsub<int16_t, int8_t>, /*strip_mine*/ true)"; + vpsub_w_v{: vs1 : vd}, + disasm: "vpsub.w.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPsub<int32_t, int16_t>, /*strip_mine*/ false)"; + vpsub_w_v_m{: vs1 : vd}, + disasm: "vpsub.w.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPsub<int32_t, int16_t>, /*strip_mine*/ true)"; + + //vpsubu + vpsub_h_u_v{: vs1 : vd}, + disasm: "vpsub.h.u.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPsub<int16_t, int8_t>, /*strip_mine*/ false)"; + vpsub_h_u_v_m{: vs1 : vd}, + disasm: "vpsub.h.u.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPsub<int16_t, int8_t>, /*strip_mine*/ true)"; + vpsub_w_u_v{: vs1 : vd}, + disasm: "vpsub.w.u.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPsub<int32_t, int16_t>, /*strip_mine*/ false)"; + vpsub_w_u_v_m{: vs1 : vd}, + disasm: "vpsub.w.u.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVPsub<int32_t, int16_t>, /*strip_mine*/ true)"; + + //vhadd + vhadd_b_vv{: vs1, vs2 : vd}, + disasm: "vhadd.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhadd_b_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhadd_h_vv{: vs1, vs2 : vd}, + disasm: "vhadd.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhadd_h_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhadd_w_vv{: vs1, vs2 : vd}, + disasm: "vhadd.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhadd_w_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhadd_b_vx{: vs1, vs2 : vd}, + disasm: "vhadd.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhadd_b_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vhadd_h_vx{: vs1, vs2 : vd}, + disasm: "vhadd.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhadd_h_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vhadd_w_vx{: vs1, vs2 : vd}, + disasm: "vhadd.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhadd_w_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + + //vhadd.r + vhadd_b_r_vv{: vs1, vs2 : vd}, + disasm: "vhadd.b.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhadd_b_r_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.b.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhadd_h_r_vv{: vs1, vs2 : vd}, + disasm: "vhadd.h.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhadd_h_r_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.h.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhadd_w_r_vv{: vs1, vs2 : vd}, + disasm: "vhadd.w.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhadd_w_r_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.w.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhadd_b_r_vx{: vs1, vs2 : vd}, + disasm: "vhadd.b.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhadd_b_r_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.b.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vhadd_h_r_vx{: vs1, vs2 : vd}, + disasm: "vhadd.h.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhadd_h_r_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.h.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vhadd_w_r_vx{: vs1, vs2 : vd}, + disasm: "vhadd.w.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhadd_w_r_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.w.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + + //vhadd.u + vhadd_b_u_vv{: vs1, vs2 : vd}, + disasm: "vhadd.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhadd_b_u_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhadd_h_u_vv{: vs1, vs2 : vd}, + disasm: "vhadd.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhadd_h_u_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhadd_w_u_vv{: vs1, vs2 : vd}, + disasm: "vhadd.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhadd_w_u_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhadd_b_u_vx{: vs1, vs2 : vd}, + disasm: "vhadd.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhadd_b_u_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vhadd_h_u_vx{: vs1, vs2 : vd}, + disasm: "vhadd.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhadd_h_u_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vhadd_w_u_vx{: vs1, vs2 : vd}, + disasm: "vhadd.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhadd_w_u_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.w.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + + //vhadd.ru + vhadd_b_ur_vv{: vs1, vs2 : vd}, + disasm: "vhadd.b.ur.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhadd_b_ur_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.b.ur.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhadd_h_ur_vv{: vs1, vs2 : vd}, + disasm: "vhadd.h.ur.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhadd_h_ur_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.h.ur.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhadd_w_ur_vv{: vs1, vs2 : vd}, + disasm: "vhadd.w.ur.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhadd_w_ur_vv_m{: vs1, vs2 : vd}, + disasm: "vhadd.w.ur.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhadd_b_ur_vx{: vs1, vs2 : vd}, + disasm: "vhadd.b.ur.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhadd_b_ur_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.b.ur.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vhadd_h_ur_vx{: vs1, vs2 : vd}, + disasm: "vhadd.h.ur.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhadd_h_ur_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.h.ur.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vhadd_w_ur_vx{: vs1, vs2 : vd}, + disasm: "vhadd.w.ur.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhadd_w_ur_vx_m{: vs1, vs2 : vd}, + disasm: "vhadd.w.ur.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHadd<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + + //vhsub + vhsub_b_vv{: vs1, vs2 : vd}, + disasm: "vhsub.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhsub_b_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhsub_h_vv{: vs1, vs2 : vd}, + disasm: "vhsub.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhsub_h_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhsub_w_vv{: vs1, vs2 : vd}, + disasm: "vhsub.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhsub_w_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhsub_b_vx{: vs1, vs2 : vd}, + disasm: "vhsub.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhsub_b_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vhsub_h_vx{: vs1, vs2 : vd}, + disasm: "vhsub.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhsub_h_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vhsub_w_vx{: vs1, vs2 : vd}, + disasm: "vhsub.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhsub_w_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + + //vhsub.r + vhsub_b_r_vv{: vs1, vs2 : vd}, + disasm: "vhsub.b.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhsub_b_r_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.b.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhsub_h_r_vv{: vs1, vs2 : vd}, + disasm: "vhsub.h.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhsub_h_r_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.h.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhsub_w_r_vv{: vs1, vs2 : vd}, + disasm: "vhsub.w.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhsub_w_r_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.w.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhsub_b_r_vx{: vs1, vs2 : vd}, + disasm: "vhsub.b.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhsub_b_r_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.b.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vhsub_h_r_vx{: vs1, vs2 : vd}, + disasm: "vhsub.h.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhsub_h_r_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.h.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vhsub_w_r_vx{: vs1, vs2 : vd}, + disasm: "vhsub.w.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhsub_w_r_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.w.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + + //vhsub.u + vhsub_b_u_vv{: vs1, vs2 : vd}, + disasm: "vhsub.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhsub_b_u_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhsub_h_u_vv{: vs1, vs2 : vd}, + disasm: "vhsub.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhsub_h_u_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhsub_w_u_vv{: vs1, vs2 : vd}, + disasm: "vhsub.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vhsub_w_u_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vhsub_b_u_vx{: vs1, vs2 : vd}, + disasm: "vhsub.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhsub_b_u_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vhsub_h_u_vx{: vs1, vs2 : vd}, + disasm: "vhsub.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhsub_h_u_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vhsub_w_u_vx{: vs1, vs2 : vd}, + disasm: "vhsub.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vhsub_w_u_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.w.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + + //vhsub.ru + vhsub_b_ur_vv{: vs1, vs2 : vd}, + disasm: "vhsub.b.ur.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhsub_b_ur_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.b.ur.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhsub_h_ur_vv{: vs1, vs2 : vd}, + disasm: "vhsub.h.ur.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhsub_h_ur_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.h.ur.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhsub_w_ur_vv{: vs1, vs2 : vd}, + disasm: "vhsub.w.ur.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vhsub_w_ur_vv_m{: vs1, vs2 : vd}, + disasm: "vhsub.w.ur.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vhsub_b_ur_vx{: vs1, vs2 : vd}, + disasm: "vhsub.b.ur.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhsub_b_ur_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.b.ur.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vhsub_h_ur_vx{: vs1, vs2 : vd}, + disasm: "vhsub.h.ur.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhsub_h_ur_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.h.ur.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vhsub_w_ur_vx{: vs1, vs2 : vd}, + disasm: "vhsub.w.ur.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vhsub_w_ur_vx_m{: vs1, vs2 : vd}, + disasm: "vhsub.w.ur.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVHsub<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + + //vand + vand_vv{: vs1, vs2 : vd}, + disasm: "vand.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAnd<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vand_vv_m{: vs1, vs2 : vd}, + disasm: "vand.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAnd<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vand_b_vx{: vs1, vs2 : vd}, + disasm: "vand.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAnd<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vand_b_vx_m{: vs1, vs2 : vd}, + disasm: "vand.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAnd<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vand_h_vx{: vs1, vs2 : vd}, + disasm: "vand.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAnd<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vand_h_vx_m{: vs1, vs2 : vd}, + disasm: "vand.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAnd<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vand_w_vx{: vs1, vs2 : vd}, + disasm: "vand.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAnd<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vand_w_vx_m{: vs1, vs2 : vd}, + disasm: "vand.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVAnd<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vor + vor_vv{: vs1, vs2 : vd}, + disasm: "vor.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOr<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vor_vv_m{: vs1, vs2 : vd}, + disasm: "vor.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOr<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vor_b_vx{: vs1, vs2 : vd}, + disasm: "vor.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOr<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vor_b_vx_m{: vs1, vs2 : vd}, + disasm: "vor.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOr<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vor_h_vx{: vs1, vs2 : vd}, + disasm: "vor.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOr<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vor_h_vx_m{: vs1, vs2 : vd}, + disasm: "vor.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOr<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vor_w_vx{: vs1, vs2 : vd}, + disasm: "vor.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOr<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vor_w_vx_m{: vs1, vs2 : vd}, + disasm: "vor.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOr<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vxor + vxor_vv{: vs1, vs2 : vd}, + disasm: "vxor.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVXor<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vxor_vv_m{: vs1, vs2 : vd}, + disasm: "vxor.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVXor<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vxor_b_vx{: vs1, vs2 : vd}, + disasm: "vxor.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVXor<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vxor_b_vx_m{: vs1, vs2 : vd}, + disasm: "vxor.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVXor<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vxor_h_vx{: vs1, vs2 : vd}, + disasm: "vxor.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVXor<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vxor_h_vx_m{: vs1, vs2 : vd}, + disasm: "vxor.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVXor<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vxor_w_vx{: vs1, vs2 : vd}, + disasm: "vxor.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVXor<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vxor_w_vx_m{: vs1, vs2 : vd}, + disasm: "vxor.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVXor<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vrev + vrev_b_vx{: vs1, vs2 : vd}, + disasm: "vrev.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRev<uint8_t>, /*strip_mine*/ false)"; + vrev_b_vx_m{: vs1, vs2 : vd}, + disasm: "vrev.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRev<uint8_t>, /*strip_mine*/ true)"; + vrev_h_vx{: vs1, vs2 : vd}, + disasm: "vrev.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRev<uint16_t>, /*strip_mine*/ false)"; + vrev_h_vx_m{: vs1, vs2 : vd}, + disasm: "vrev.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRev<uint16_t>, /*strip_mine*/ true)"; + vrev_w_vx{: vs1, vs2 : vd}, + disasm: "vrev.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRev<uint32_t>, /*strip_mine*/ false)"; + vrev_w_vx_m{: vs1, vs2 : vd}, + disasm: "vrev.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRev<uint32_t>, /*strip_mine*/ true)"; + + //vror + vror_b_vx{: vs1, vs2 : vd}, + disasm: "vror.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRor<uint8_t>, /*strip_mine*/ false)"; + vror_b_vx_m{: vs1, vs2 : vd}, + disasm: "vror.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRor<uint8_t>, /*strip_mine*/ true)"; + vror_h_vx{: vs1, vs2 : vd}, + disasm: "vror.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRor<uint16_t>, /*strip_mine*/ false)"; + vror_h_vx_m{: vs1, vs2 : vd}, + disasm: "vror.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRor<uint16_t>, /*strip_mine*/ true)"; + vror_w_vx{: vs1, vs2 : vd}, + disasm: "vror.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRor<uint32_t>, /*strip_mine*/ false)"; + vror_w_vx_m{: vs1, vs2 : vd}, + disasm: "vror.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVRor<uint32_t>, /*strip_mine*/ true)"; + + //vmvp + vmvp_vv{: vs1, vs2 : vd}, + disasm: "vmvp.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMvp<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmvp_vv_m{: vs1, vs2 : vd}, + disasm: "vmvp.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMvp<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmvp_b_vx{: vs1, vs2 : vd}, + disasm: "vmvp.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMvp<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmvp_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmvp.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMvp<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmvp_h_vx{: vs1, vs2 : vd}, + disasm: "vmvp.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMvp<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmvp_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmvp.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMvp<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmvp_w_vx{: vs1, vs2 : vd}, + disasm: "vmvp.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMvp<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmvp_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmvp.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMvp<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + } +}
diff --git a/sim/kelvin_base.isa b/sim/kelvin_base.isa new file mode 100644 index 0000000..2809371 --- /dev/null +++ b/sim/kelvin_base.isa
@@ -0,0 +1,396 @@ +// This file define the kelvin base isa for mpact-sim. For more info on mpact-sim +// isa format, check: go/mpact-sim-codelabs-riscv-instruction-decoder + +// First disasm field is 18 char wide and left justified. +disasm widths = {-18}; + +// Basic integer ALU instructions, part of the RiscV 32i subset. +slot riscv32i { + includes { + #include "riscv/riscv_i_instructions.h" + } + default size = 4; + default latency = global_latency; + resources TwoOp = { next_pc, rs1 : rd[..rd]}; + resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]}; + opcodes { + addi{: rs1, I_imm12 : rd}, + resources: TwoOp, + disasm: "addi", "%rd, %rs1, %I_imm12", + semfunc: "&mpact::sim::riscv::RV32::RiscVIAdd"; + slti{: rs1, I_imm12 : rd}, + resources: TwoOp, + disasm: "slti", "%rd, %rs1, %I_imm12", + semfunc: "&mpact::sim::riscv::RV32::RiscVISlt"; + sltiu{: rs1, I_imm12 : rd}, + resources: TwoOp, + disasm: "sltiu", "%rd, %rs1, %I_imm12", + semfunc: "&mpact::sim::riscv::RV32::RiscVISltu"; + andi{: rs1, I_imm12 : rd}, + resources: TwoOp, + disasm: "andi", "%rd, %rs1, %I_imm12", + semfunc: "&mpact::sim::riscv::RV32::RiscVIAnd"; + ori{: rs1, I_imm12 : rd}, + resources: TwoOp, + disasm: "ori", "%rd, %rs1, %I_imm12", + semfunc: "&mpact::sim::riscv::RV32::RiscVIOr"; + xori{: rs1, I_imm12 : rd}, + resources: TwoOp, + disasm: "xori", "%rd, %rs1, %I_imm12", + semfunc: "&mpact::sim::riscv::RV32::RiscVIXor"; + slli{: rs1, I_uimm5 : rd}, + resources: TwoOp, + disasm: "slli", "%rd, %rs1, 0x%(I_uimm5:x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVISll"; + srli{: rs1, I_uimm5 : rd}, + resources: TwoOp, + disasm: "srli", "%rd %rs1, 0x%(I_uimm5:x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVISrl"; + srai{: rs1, I_uimm5 : rd}, + resources: TwoOp, + disasm: "srai", "%rd, %rs1, 0x%(I_uimm5:x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVISra"; + lui{: U_imm20 : rd}, + resources: { next_pc : rd[0..]}, + disasm: "lui", "%rd, 0x%(U_imm20:08x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVILui"; + auipc{: U_imm20 : rd}, + resources: { next_pc : rd[0..]}, + disasm: "auipc", "%rd, 0x%(U_imm20:08x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVIAuipc"; + add{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "add", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::RiscVIAdd"; + slt{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "slt", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::RiscVISlt"; + sltu{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "sltu", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::RiscVISltu"; + and{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "and", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::RiscVIAnd"; + or{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "or", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::RiscVIOr"; + xor{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "xor", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::RiscVIXor"; + sll{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "sll", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::RiscVISll"; + srl{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "srl", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::RiscVISrl"; + sub{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "sub", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::RiscVISub"; + sra{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "sra", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::RiscVISra"; + nop{}, + disasm: "nop", + semfunc: "&mpact::sim::riscv::RiscVINop"; + hint{}, + disasm: "hint", + semfunc: "&mpact::sim::riscv::RiscVINop"; + jal{: J_imm20 : next_pc, rd}, + resources: { next_pc : next_pc[0..], rd[0..]}, + disasm: "jal", "%rd, %(@+J_imm20:08x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVIJal"; + jalr{: rs1, J_imm12 : next_pc, rd}, + resources: { next_pc, rs1 : next_pc[0..], rd[0..]}, + disasm: "jalr", "%rd, %rs1, %J_imm12", + semfunc: "&mpact::sim::riscv::RV32::RiscVIJalr"; + j{: J_imm20 : next_pc, rd}, + resources: { next_pc : next_pc[0..], rd[0..]}, + disasm: "j", "%(@+J_imm20:08x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVIJal"; + jr{: rs1, J_imm12 : next_pc, rd}, + resources: { next_pc, rs1 : next_pc[0..], rd[0..]}, + disasm: "jr", "%rs1, %J_imm12", + semfunc: "&mpact::sim::riscv::RV32::RiscVIJalr"; + beq{: rs1, rs2, B_imm12 : next_pc}, + resources: { next_pc, rs1, rs2 : next_pc[0..]}, + disasm: "beq", "%rs1, %rs2, %(@+B_imm12:08x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVIBeq"; + bne{: rs1, rs2, B_imm12 : next_pc}, + resources: { next_pc, rs1, rs2 : next_pc[0..]}, + disasm: "bne", "%rs1, %rs2, %(@+B_imm12:08x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVIBne"; + blt{: rs1, rs2, B_imm12 : next_pc}, + resources: { next_pc, rs1, rs2 : next_pc[0..]}, + disasm: "blt", "%rs1, %rs2, %(@+B_imm12:08x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVIBlt"; + bltu{: rs1, rs2, B_imm12 : next_pc}, + resources: { next_pc, rs1, rs2 : next_pc[0..]}, + disasm: "bltu", "%rs1, %rs2, %(@+B_imm12:08x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVIBltu"; + bge{: rs1, rs2, B_imm12 : next_pc}, + resources: { next_pc, rs1, rs2 : next_pc[0..]}, + disasm: "bge", "%rs1, %rs2, %(@+B_imm12:08x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVIBge"; + bgeu{: rs1, rs2, B_imm12 : next_pc}, + resources: { next_pc, rs1, rs2 : next_pc[0..]}, + disasm: "bgeu", "%rs1, %rs2, %(@+B_imm12:08x)", + semfunc: "&mpact::sim::riscv::RV32::RiscVIBgeu"; + lw{(: rs1, I_imm12), (: : rd)}, + resources: { next_pc, rs1 : rd[0..]}, + disasm: "lw", "%rd, %I_imm12(%rs1)", + semfunc: "&mpact::sim::riscv::RV32::RiscVILw", "&mpact::sim::riscv::RV32::RiscVILwChild"; + lh{(: rs1, I_imm12 :), (: : rd)}, + resources: { next_pc, rs1 : rd[0..]}, + disasm: "lh", "%rd, %I_imm12(%rs1)", + semfunc: "&mpact::sim::riscv::RV32::RiscVILh", "&mpact::sim::riscv::RV32::RiscVILhChild"; + lhu{(: rs1, I_imm12 :), (: : rd)}, + resources: { next_pc, rs1 : rd[0..]}, + disasm: "lhu", "%rd, %I_imm12(%rs1)", + semfunc: "&mpact::sim::riscv::RV32::RiscVILhu", "&mpact::sim::riscv::RV32::RiscVILhuChild"; + lb{(: rs1, I_imm12 :), (: : rd)}, + resources: { next_pc, rs1 : rd[0..]}, + disasm: "lb", "%rd, %I_imm12(%rs1)", + semfunc: "&mpact::sim::riscv::RV32::RiscVILb", "&mpact::sim::riscv::RV32::RiscVILbChild"; + lbu{(: rs1, I_imm12 :), (: : rd)}, + resources: { next_pc, rs1 : rd[0..]}, + disasm: "lbu", "%rd, %I_imm12(%rs1)", + semfunc: "&mpact::sim::riscv::RV32::RiscVILbu", "&mpact::sim::riscv::RV32::RiscVILbuChild"; + sw{: rs1, S_imm12, rs2 : }, + resources: { next_pc, rs1, rs2 : }, + disasm: "sw", "%rs2, %S_imm12(%rs1)", + semfunc: "&mpact::sim::riscv::RV32::RiscVISw"; + sh{: rs1, S_imm12, rs2 : }, + resources: { next_pc, rs1, rs2 : }, + disasm: "sh", "%rs2, %S_imm12(%rs1)", + semfunc: "&mpact::sim::riscv::RV32::RiscVISh"; + sb{: rs1, S_imm12, rs2 : }, + resources: { next_pc, rs1, rs2 : }, + disasm: "sb", "%rs2, %S_imm12(%rs1)", + semfunc: "&mpact::sim::riscv::RV32::RiscVISb"; + fence{: I_imm12 : }, + disasm: "fence", + semfunc: "&mpact::sim::riscv::RiscVIFence"; + ecall{}, + disasm: "ecall", + semfunc: "&mpact::sim::riscv::RiscVIEcall"; + ebreak{}, + disasm: "ebreak", + semfunc: "&mpact::sim::riscv::RiscVIEbreak"; + } +} + +// RiscV32 multiply/divide instructions. +slot riscv32m { + includes { + #include "riscv/riscv_m_instructions.h" + } + default size = 4; + default latency = global_latency; + resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]}; + opcodes { + mul{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "mul", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::MMul"; + mulh{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "mulh", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::MMulh"; + mulhu{: rs1, rs2: rd}, + resources: ThreeOp, + disasm: "mulhu", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::MMulhu"; + mulhsu{: rs1, rs2: rd}, + resources: ThreeOp, + disasm: "mulhsu", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::MMulhsu"; + div{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "div", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::MDiv"; + divu{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "divu", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::MDivu"; + rem{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "rem", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::MRem"; + remu{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "remu", "%rd, %rs1, %rs2", + semfunc: "&mpact::sim::riscv::RV32::MRemu"; + } +} + +// RiscV32 CSR manipulation instructions. +slot zicsr { + includes { + #include "riscv/riscv_zicsr_instructions.h" + } + default size = 4; + default latency = global_latency; + opcodes { + csrrw{: rs1, csr : rd, csr}, + resources: { next_pc, rs1, csr : rd[0..], csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrw", + disasm: "csrw", "%rd, %csr, %rs1"; + csrrs{: rs1, csr : rd, csr}, + resources: { next_pc, rs1, csr : rd[0..], csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrs", + disasm: "csrs", "%rd, %csr, %rs1"; + csrrc{: rs1, csr : rd, csr}, + resources: { next_pc, rs1, csr : rd[0..], csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrc", + disasm: "csrc", "%rd, %csr, %rs1"; + csrrs_nr{: rs1, csr : rd, csr}, + resources: { next_pc, rs1, csr : rd[0..], csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrs", + disasm: "csrs", "%csr, %rs1"; + csrrc_nr{: rs1, csr : rd, csr}, + resources: { next_pc, rs1, csr : rd[0..], csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrc", + disasm: "csrc", "%csr, %rs1"; + csrrw_nr{: rs1, csr : csr}, + resources: { next_pc, rs1: csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrwNr", // rd == 0 (x0). + disasm: "csrw", "%csr, %rs1"; + csrrs_nw{: csr : rd}, + resources: { next_pc, csr: rd[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrNw", // rs1 == 0 (x0). + disasm: "csrs", "%rd, %csr"; + csrrc_nw{: csr : rd}, + resources: { next_pc, csr: rd[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrNw", // rs1 == 0 (x0). + disasm: "csrc", "%rd, %csr"; + csrrwi{: CSR_uimm5, csr : rd, csr}, + resources: { next_pc, csr: rd[0..], csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrw", + disasm: "csrwi", "%rd, %csr, %CSR_uimm5"; + csrrsi{: CSR_uimm5, csr : rd, csr}, + resources: { next_pc, csr: rd[0..], csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrs", + disasm: "csrsi", "%rd, %csr, %CSR_uimm5"; + csrrci{: CSR_uimm5, csr : rd, csr}, + resources: { next_pc, csr: rd[0..], csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrc", + disasm: "csrci", "%rd, %csr, %CSR_uimm5"; + csrrsi_nr{: CSR_uimm5, csr : rd, csr}, + resources: { next_pc, csr: rd[0..], csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrs", + disasm: "csrsi", "%csr, %CSR_uimm5"; + csrrci_nr{: CSR_uimm5, csr : rd, csr}, + resources: { next_pc, csr: rd[0..], csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrc", + disasm: "csrci", "%csr, %CSR_uimm5"; + csrrwi_nr{: CSR_uimm5, csr : csr}, + resources: { next_pc : csr[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrwNr", // rd == 0 (x0). + disasm: "csrrwi", "%csr, %CSR_uimm5"; + csrrsi_nw{: csr : rd}, + resources: { next_pc, csr : rd[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrNw", // uimm5 == 0. + disasm: "csrsi", "%rd, %csr, 0"; + csrrci_nw{: csr : rd}, + resources: { next_pc, csr : rd[0..]}, + semfunc: "&mpact::sim::riscv::RV32::RiscVZiCsrrNw", // uimm5 == 0. + disasm: "csrwi", "%rd, %csr, 0"; + } +} + +// Instruction fence. +slot zfencei { + includes { + #include "riscv/riscv_zfencei_instructions.h" + } + default size = 4; + default latency = global_latency; + opcodes { + fencei{: I_imm12 : }, + disasm: "fence.i", + semfunc: "&mpact::sim::riscv::RiscVZFencei"; + } +} + +// Privileged instructions. +slot privileged { + includes { + #include "riscv/riscv_priv_instructions.h" + #include "sim/kelvin_instructions.h" + } + default size = 4; + default latency = global_latency; + opcodes { + uret{: : next_pc}, + disasm: "uret", + semfunc: "&mpact::sim::riscv::RV32::RiscVPrivURet"; + sret{: : next_pc}, + disasm: "sret", + semfunc: "&mpact::sim::riscv::RV32::RiscVPrivSRet"; + mret{: : next_pc}, + disasm: "mret", + semfunc: "&mpact::sim::riscv::RV32::RiscVPrivMRet"; + wfi{}, + disasm: "wfi", + semfunc: "&mpact::sim::riscv::RiscVPrivWfi"; + mpause{}, + disasm: "mpause", + // mpause is the software breakpoint to terminate the program. + semfunc: "&KelvinIMpause"; + // The sfence instruction has 4 behaviors depending on if rs1 and/or rs2 + // are 0. These behaviors are split into 4 instructions. + sfence_vma_zz{: rs1, rs2}, + resources: {}, + disasm: "sfence.vma", "%rs1, %rs2", + semfunc: "&mpact::sim::riscv::RiscVPrivSFenceVmaZZ"; + sfence_vma_zn{: rs1, rs2}, + resources: {rs2}, + disasm: "sfence.vma", "%rs1, %rs2", + semfunc: "&mpact::sim::riscv::RiscVPrivSFenceVmaZN"; + sfence_vma_nz{: rs1, rs2}, + resources: { rs1 }, + disasm: "sfence.vma", "%rs1, %rs2", + semfunc: "&mpact::sim::riscv::RiscVPrivSFenceVmaNZ"; + sfence_vma_nn{: rs1, rs2}, + resources: {rs1, rs2}, + disasm: "sfence.vma", "%rs1, %rs2", + semfunc: "&mpact::sim::riscv::RiscVPrivSFenceVmaNN"; + // Skipping hypervisor memory management instructions for now. + } +} + +slot kelvin_log { + includes { + #include "sim/kelvin_instructions.h" + #include "absl/functional/bind_front.h" + } + default size = 4; + default latency = global_latency; + opcodes { + flog{: rs1 :}, + resources: { next_pc : rs1[0..]}, + disasm: "flog", "%rs1", + semfunc: "absl::bind_front(&KelvinLogInstruction, /*log_mode*/ 0)"; + slog{: rs1 :}, + resources: { next_pc : rs1[0..]}, + disasm: "slog", "%rs1", + semfunc: "absl::bind_front(&KelvinLogInstruction, /*log_mode*/ 1)"; + clog{: rs1 :}, + resources: { next_pc : rs1[0..]}, + disasm: "clog", "%rs1", + semfunc: "absl::bind_front(&KelvinLogInstruction, /*log_mode*/ 2)"; + klog{: rs1 :}, + resources: { next_pc : rs1[0..]}, + disasm: "klog", "%rs1", + semfunc: "absl::bind_front(&KelvinLogInstruction, /*log_mode*/ 3)"; + } +}
diff --git a/sim/kelvin_memory.isa b/sim/kelvin_memory.isa new file mode 100644 index 0000000..5ecb15a --- /dev/null +++ b/sim/kelvin_memory.isa
@@ -0,0 +1,485 @@ +// This file define the kelvin base isa for mpact-sim. For more info on mpact-sim +// isa format, check: go/mpact-sim-codelabs-riscv-instruction-decoder + +// First disasm field is 18 char wide and left justified. +disasm widths = {-18}; + +slot kelvin_memory { + includes { + #include "sim/kelvin_instructions.h" + } + default size = 4; + default latency = global_latency; + opcodes { + flushall{}, + disasm: "flushall", + semfunc: "&KelvinNopInstruction"; + flushat{: rs1 :}, + disasm: "flushat", "%rs1", + semfunc: "&KelvinNopInstruction"; + } +} + +// Kelvin simd instructions: +// https://spacebeaker.googlesource.com/shodan/sw/kelvin/+/refs/heads/master/docs/kelvin_isa.md +// Load / Store +slot kelvin_vector_memory { + includes { + #include "sim/kelvin_vector_memory_instructions.h" + #include "absl/functional/bind_front.h" + } + default size = 4; + default latency = global_latency; + resources TwoOp = { next_pc, rs1 : rd[..rd]}; + resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]}; + opcodes { + getmaxvl_b{: : rd}, + resources: { next_pc : rd[0..]}, + disasm: "getmaxvl.b", "%rd", + semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ false, /*is_rs1*/ false, /*is_rs2*/ false)"; + getmaxvl_h{: : rd}, + resources: { next_pc : rd[0..]}, + disasm: "getmaxvl.h", "%rd", + semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ false, /*is_rs1*/ false, /*is_rs2*/ false)"; + getmaxvl_w{: : rd}, + resources: { next_pc : rd[0..]}, + disasm: "getmaxvl.w", "%rd", + semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ false, /*is_rs1*/ false, /*is_rs2*/ false)"; + getvl_b_x{: rs1 : rd}, + resources: TwoOp, + disasm: "getvl.b.x", "%rd, %rs1", + semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ false)"; + getvl_h_x{: rs1 : rd}, + resources: TwoOp, + disasm: "getvl.h.x", "%rd, %rs1", + semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ false)"; + getvl_w_x{: rs1 : rd}, + resources: TwoOp, + disasm: "getvl.w.x", "%rd, %rs1", + semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ false)"; + getvl_b_xx{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "getvl.b.xx", "%rd, %rs1, %rs2", + semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ true)"; + getvl_h_xx{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "getvl.h.xx", "%rd, %rs1, %rs2", + semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ true)"; + getvl_w_xx{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "getvl.w.xx", "%rd, %rs1, %rs2", + semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ true)"; + getmaxvl_b_m{: : rd}, + resources: { next_pc : rd[0..]}, + disasm: "getmaxvl.b.m", "%rd", + semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ true, /*is_rs1*/ false, /*is_rs2*/ false)"; + getmaxvl_h_m{: : rd}, + resources: { next_pc : rd[0..]}, + disasm: "getmaxvl.h.m", "%rd", + semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ true, /*is_rs1*/ false, /*is_rs2*/ false)"; + getmaxvl_w_m{: : rd}, + resources: { next_pc : rd[0..]}, + disasm: "getmaxvl.w.m", "%rd", + semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ true, /*is_rs1*/ false, /*is_rs2*/ false)"; + getvl_b_x_m{: rs1 : rd}, + resources: TwoOp, + disasm: "getvl.b.x.m", "%rd, %rs1", + semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ false)"; + getvl_h_x_m{: rs1 : rd}, + resources: TwoOp, + disasm: "getvl.h.x.m", "%rd, %rs1", + semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ false)"; + getvl_w_x_m{: rs1 : rd}, + resources: TwoOp, + disasm: "getvl.w.x.m", "%rd, %rs1", + semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ false)"; + getvl_b_xx_m{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "getvl.b.xx.m", "%rd, %rs1, %rs2", + semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ true)"; + getvl_h_xx_m{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "getvl.h.xx.m", "%rd, %rs1, %rs2", + semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ true)"; + getvl_w_xx_m{: rs1, rs2 : rd}, + resources: ThreeOp, + disasm: "getvl.w.xx.m", "%rd, %rs1, %rs2", + semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ true)"; + + //vld + vld_b_x{(: vs1 :), (: : vd)}, + disasm: "vld.b.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>, /*strip_mine*/ false)"; + vld_h_x{(: vs1 :), (: : vd)}, + disasm: "vld.h.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; + vld_w_x{(: vs1 :), (: : vd)}, + disasm: "vld.w.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; + vld_b_x_m{(: vs1 :), (: : vd)}, + disasm: "vld.b.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; + vld_h_x_m{(: vs1 :), (: : vd)}, + disasm: "vld.h.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; + vld_w_x_m{(: vs1 :), (: : vd)}, + disasm: "vld.w.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; + vld_b_p_x{(: vs1 : vs1), (: : vd)}, + disasm: "vld.b.p.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; + vld_h_p_x{(: vs1 : vs1), (: : vd)}, + disasm: "vld.h.p.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; + vld_w_p_x{(: vs1 : vs1), (: : vd)}, + disasm: "vld.w.p.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; + vld_b_p_x_m{(: vs1 : vs1), (: : vd)}, + disasm: "vld.b.p.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; + vld_h_p_x_m{(: vs1 : vs1), (: : vd)}, + disasm: "vld.h.p.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; + vld_w_p_x_m{(: vs1 : vs1), (: : vd)}, + disasm: "vld.w.p.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; + vld_b_p_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.b.p.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; + vld_h_p_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.h.p.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; + vld_w_p_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.w.p.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; + vld_b_p_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.b.p.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; + vld_h_p_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.h.p.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; + vld_w_p_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.w.p.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; + vld_b_l_xx{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.b.l.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>, /*strip_mine*/ false)"; + vld_h_l_xx{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.h.l.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; + vld_w_l_xx{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.w.l.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; + vld_b_l_xx_m{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.b.l.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; + vld_h_l_xx_m{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.h.l.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; + vld_w_l_xx_m{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.w.l.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; + vld_b_lp_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.b.lp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; + vld_h_lp_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.h.lp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; + vld_w_lp_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.w.lp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; + vld_b_lp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.b.lp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; + vld_h_lp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.h.lp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; + vld_w_lp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.w.lp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; + vld_b_s_xx{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.b.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>, /*strip_mine*/ false)"; + vld_h_s_xx{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.h.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; + vld_w_s_xx{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.w.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; + vld_b_s_xx_m{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.b.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; + vld_h_s_xx_m{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.h.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; + vld_w_s_xx_m{(: vs1, vs2 :), (: : vd)}, + disasm: "vld.w.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; + vld_b_sp_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.b.sp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; + vld_h_sp_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.h.sp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; + vld_w_sp_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.w.sp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; + vld_b_sp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.b.sp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; + vld_h_sp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.h.sp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; + vld_w_sp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.w.sp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; + vld_b_tp_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.b.tp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; + vld_h_tp_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.h.tp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; + vld_w_tp_xx{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.w.tp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; + vld_b_tp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.b.tp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; + vld_h_tp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.h.tp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; + vld_w_tp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, + disasm: "vld.w.tp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)", + "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; + + //vst, note `vd` is actually the source vector register, and `vs1` is actually the scaler register. + vst_b_x{: vd, vs1 :}, + disasm: "vst.b.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; + vst_h_x{: vd, vs1 :}, + disasm: "vst.h.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; + vst_w_x{: vd, vs1 :}, + disasm: "vst.w.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; + vst_b_x_m{: vd, vs1 :}, + disasm: "vst.b.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; + vst_h_x_m{: vd, vs1 :}, + disasm: "vst.h.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; + vst_w_x_m{: vd, vs1 :}, + disasm: "vst.w.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; + vst_b_p_x{: vd, vs1 : vs1}, + disasm: "vst.b.p.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; + vst_h_p_x{: vd, vs1 : vs1}, + disasm: "vst.h.p.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; + vst_w_p_x{: vd, vs1 : vs1}, + disasm: "vst.w.p.x", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; + vst_b_p_x_m{: vd, vs1 : vs1}, + disasm: "vst.b.p.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; + vst_h_p_x_m{: vd, vs1 : vs1}, + disasm: "vst.h.p.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; + vst_w_p_x_m{: vd, vs1 : vs1}, + disasm: "vst.w.p.x.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; + vst_b_p_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.b.p.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; + vst_h_p_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.h.p.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; + vst_w_p_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.w.p.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; + vst_b_p_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.b.p.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; + vst_h_p_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.h.p.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; + vst_w_p_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vld.w.p.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; + vst_b_l_xx{: vd, vs1, vs2 :}, + disasm: "vst.b.l.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; + vst_h_l_xx{: vd, vs1, vs2 :}, + disasm: "vst.h.l.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; + vst_w_l_xx{: vd, vs1, vs2 :}, + disasm: "vst.w.l.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; + vst_b_l_xx_m{: vd, vs1, vs2 :}, + disasm: "vst.b.l.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; + vst_h_l_xx_m{: vd, vs1, vs2 :}, + disasm: "vst.h.l.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; + vst_w_l_xx_m{: vd, vs1, vs2 :}, + disasm: "vst.w.l.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; + vst_b_lp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.b.lp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; + vst_h_lp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.h.lp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; + vst_w_lp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.w.lp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; + vst_b_lp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.b.lp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; + vst_h_lp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.h.lp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; + vst_w_lp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.w.lp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; + vst_b_s_xx{: vd, vs1, vs2 :}, + disasm: "vst.b.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; + vst_h_s_xx{: vd, vs1, vs2 :}, + disasm: "vst.h.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; + vst_w_s_xx{: vd, vs1, vs2 :}, + disasm: "vst.w.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; + vst_b_s_xx_m{: vd, vs1, vs2 :}, + disasm: "vst.b.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; + vst_h_s_xx_m{: vd, vs1, vs2 :}, + disasm: "vst.h.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; + vst_w_s_xx_m{: vd, vs1, vs2 :}, + disasm: "vst.w.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; + vst_b_sp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.b.sp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; + vst_h_sp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.h.sp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; + vst_w_sp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.w.sp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; + vst_b_sp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.b.sp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; + vst_h_sp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.h.sp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; + vst_w_sp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.w.sp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; + vst_b_tp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.b.tp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)"; + vst_h_tp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.h.tp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)"; + vst_w_tp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vst.w.tp.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)"; + vst_b_tp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.b.tp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)"; + vst_h_tp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.h.tp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)"; + vst_w_tp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vst.w.tp.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)"; + vstq_b_s_xx{: vd, vs1, vs2 :}, + disasm: "vstq.b.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ false)"; + vstq_h_s_xx{: vd, vs1, vs2 :}, + disasm: "vstq.h.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ false)"; + vstq_w_s_xx{: vd, vs1, vs2 :}, + disasm: "vstq.w.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ false)"; + vstq_b_sp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vstq.b.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ false)"; + vstq_h_sp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vstq.h.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ false)"; + vstq_w_sp_xx{: vd, vs1, vs2 : vs1}, + disasm: "vstq.w.s.xx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ false)"; + vstq_b_s_xx_m{: vd, vs1, vs2 :}, + disasm: "vstq.b.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ true)"; + vstq_h_s_xx_m{: vd, vs1, vs2 :}, + disasm: "vstq.h.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ true)"; + vstq_w_s_xx_m{: vd, vs1, vs2 :}, + disasm: "vstq.w.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ true)"; + vstq_b_sp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vstq.b.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ true)"; + vstq_h_sp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vstq.h.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ true)"; + vstq_w_sp_xx_m{: vd, vs1, vs2 : vs1}, + disasm: "vstq.w.s.xx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ true)"; + } +}
diff --git a/sim/kelvin_mul.isa b/sim/kelvin_mul.isa new file mode 100644 index 0000000..f1456ac --- /dev/null +++ b/sim/kelvin_mul.isa
@@ -0,0 +1,527 @@ +// This file define the kelvin isa for mpact-sim. For more info on mpact-sim isa +// format, check: go/mpact-sim-codelabs-riscv-instruction-decoder + +// First disasm field is 18 char wide and left justified. +disasm widths = {-18}; + +// Kelvin simd instructions: +// https://spacebeaker.googlesource.com/shodan/sw/kelvin/+/refs/heads/master/docs/kelvin_isa.md +// Mul/Div instructions (func1 011) +slot kelvin_mul { + includes { + #include "sim/kelvin_instructions.h" + #include "sim/kelvin_vector_instructions.h" + #include "absl/functional/bind_front.h" + } + default size = 4; + default latency = global_latency; + opcodes { + //vmul + vmul_b_vv{: vs1, vs2 : vd}, + disasm: "vmul.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmul_b_vv_m{: vs1, vs2 : vd}, + disasm: "vmul.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmul_h_vv{: vs1, vs2 : vd}, + disasm: "vmul.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmul_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmul.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmul_w_vv{: vs1, vs2 : vd}, + disasm: "vmul.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmul_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmul.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmul_b_vx{: vs1, vs2 : vd}, + disasm: "vmul.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmul_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmul.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmul_h_vx{: vs1, vs2 : vd}, + disasm: "vmul.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmul_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmul.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmul_w_vx{: vs1, vs2 : vd}, + disasm: "vmul.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmul_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmul.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMul<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vmuls + vmuls_b_vv{: vs1, vs2 : vd}, + disasm: "vmuls.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmuls_b_vv_m{: vs1, vs2 : vd}, + disasm: "vmuls.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmuls_h_vv{: vs1, vs2 : vd}, + disasm: "vmuls.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmuls_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmuls.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmuls_w_vv{: vs1, vs2 : vd}, + disasm: "vmuls.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmuls_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmuls.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmuls_b_vx{: vs1, vs2 : vd}, + disasm: "vmuls.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmuls_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmuls.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmuls_h_vx{: vs1, vs2 : vd}, + disasm: "vmuls.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmuls_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmuls.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmuls_w_vx{: vs1, vs2 : vd}, + disasm: "vmuls.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmuls_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmuls.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vmulsu + vmulsu_b_vv{: vs1, vs2 : vd}, + disasm: "vmulsu.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmulsu_b_vv_m{: vs1, vs2 : vd}, + disasm: "vmulsu.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmulsu_h_vv{: vs1, vs2 : vd}, + disasm: "vmulsu.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmulsu_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmulsu.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmulsu_w_vv{: vs1, vs2 : vd}, + disasm: "vmulsu.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmulsu_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmulsu.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmulsu_b_vx{: vs1, vs2 : vd}, + disasm: "vmulsu.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmulsu_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmulsu.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmulsu_h_vx{: vs1, vs2 : vd}, + disasm: "vmulsu.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmulsu_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmulsu.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmulsu_w_vx{: vs1, vs2 : vd}, + disasm: "vmulsu.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmulsu_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmulsu.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMuls<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vmulw + vmulw_h_vv{: vs1, vs2 : vd}, + disasm: "vmulw.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmulw_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmulw.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<int16_t, int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmulw_w_vv{: vs1, vs2 : vd}, + disasm: "vmulw.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmulw_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmulw.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<int32_t, int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmulw_h_vx{: vs1, vs2 : vd}, + disasm: "vmulw.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmulw_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmulw.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<int16_t, int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmulw_w_vx{: vs1, vs2 : vd}, + disasm: "vmulw.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmulw_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmulw.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<int32_t, int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vmulwu + vmulw_h_u_vv{: vs1, vs2 : vd}, + disasm: "vmulw.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmulw_h_u_vv_m{: vs1, vs2 : vd}, + disasm: "vmulw.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<uint16_t, uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmulw_w_u_vv{: vs1, vs2 : vd}, + disasm: "vmulw.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmulw_w_u_vv_m{: vs1, vs2 : vd}, + disasm: "vmulw.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<uint32_t, uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmulw_h_u_vx{: vs1, vs2 : vd}, + disasm: "vmulw.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmulw_h_u_vx_m{: vs1, vs2 : vd}, + disasm: "vmulw.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<uint16_t, uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmulw_w_u_vx{: vs1, vs2 : vd}, + disasm: "vmulw.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmulw_w_u_vx_m{: vs1, vs2 : vd}, + disasm: "vmulw.w.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulw<uint32_t, uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vmulh + vmulh_b_vv{: vs1, vs2 : vd}, + disasm: "vmulh.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vmulh_b_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vmulh_h_vv{: vs1, vs2 : vd}, + disasm: "vmulh.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vmulh_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vmulh_w_vv{: vs1, vs2 : vd}, + disasm: "vmulh.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vmulh_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vmulh_b_vx{: vs1, vs2 : vd}, + disasm: "vmulh.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vmulh_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vmulh_h_vx{: vs1, vs2 : vd}, + disasm: "vmulh.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vmulh_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vmulh_w_vx{: vs1, vs2 : vd}, + disasm: "vmulh.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vmulh_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + + //vmulh.r + vmulh_b_r_vv{: vs1, vs2 : vd}, + disasm: "vmulh.b.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vmulh_b_r_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.b.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vmulh_h_r_vv{: vs1, vs2 : vd}, + disasm: "vmulh.h.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vmulh_h_r_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.h.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vmulh_w_r_vv{: vs1, vs2 : vd}, + disasm: "vmulh.w.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vmulh_w_r_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.w.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vmulh_b_r_vx{: vs1, vs2 : vd}, + disasm: "vmulh.b.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vmulh_b_r_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.b.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vmulh_h_r_vx{: vs1, vs2 : vd}, + disasm: "vmulh.h.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vmulh_h_r_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.h.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vmulh_w_r_vx{: vs1, vs2 : vd}, + disasm: "vmulh.w.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vmulh_w_r_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.w.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + + //vmulh.u + vmulh_b_u_vv{: vs1, vs2 : vd}, + disasm: "vmulh.b.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vmulh_b_u_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.b.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vmulh_h_u_vv{: vs1, vs2 : vd}, + disasm: "vmulh.h.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vmulh_h_u_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.h.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vmulh_w_u_vv{: vs1, vs2 : vd}, + disasm: "vmulh.w.u.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false)"; + vmulh_w_u_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.w.u.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false)"; + vmulh_b_u_vx{: vs1, vs2 : vd}, + disasm: "vmulh.b.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vmulh_b_u_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.b.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vmulh_h_u_vx{: vs1, vs2 : vd}, + disasm: "vmulh.h.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vmulh_h_u_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.h.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + vmulh_w_u_vx{: vs1, vs2 : vd}, + disasm: "vmulh.w.u.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false)"; + vmulh_w_u_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.w.u.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false)"; + + //vmulh.ru + vmulh_b_ur_vv{: vs1, vs2 : vd}, + disasm: "vmulh.b.ur.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vmulh_b_ur_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.b.ur.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vmulh_h_ur_vv{: vs1, vs2 : vd}, + disasm: "vmulh.h.ur.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vmulh_h_ur_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.h.ur.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vmulh_w_ur_vv{: vs1, vs2 : vd}, + disasm: "vmulh.w.ur.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true)"; + vmulh_w_ur_vv_m{: vs1, vs2 : vd}, + disasm: "vmulh.w.ur.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true)"; + vmulh_b_ur_vx{: vs1, vs2 : vd}, + disasm: "vmulh.b.ur.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vmulh_b_ur_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.b.ur.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vmulh_h_ur_vx{: vs1, vs2 : vd}, + disasm: "vmulh.h.ur.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vmulh_h_ur_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.h.ur.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + vmulh_w_ur_vx{: vs1, vs2 : vd}, + disasm: "vmulh.w.ur.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true)"; + vmulh_w_ur_vx_m{: vs1, vs2 : vd}, + disasm: "vmulh.w.ur.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMulh<uint32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true)"; + + //vdmulh + vdmulh_b_vv{: vs1, vs2 : vd}, + disasm: "vdmulh.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; + vdmulh_b_vv_m{: vs1, vs2 : vd}, + disasm: "vdmulh.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; + vdmulh_h_vv{: vs1, vs2 : vd}, + disasm: "vdmulh.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; + vdmulh_h_vv_m{: vs1, vs2 : vd}, + disasm: "vdmulh.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; + vdmulh_w_vv{: vs1, vs2 : vd}, + disasm: "vdmulh.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; + vdmulh_w_vv_m{: vs1, vs2 : vd}, + disasm: "vdmulh.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; + vdmulh_b_vx{: vs1, vs2 : vd}, + disasm: "vdmulh.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; + vdmulh_b_vx_m{: vs1, vs2 : vd}, + disasm: "vdmulh.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; + vdmulh_h_vx{: vs1, vs2 : vd}, + disasm: "vdmulh.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; + vdmulh_h_vx_m{: vs1, vs2 : vd}, + disasm: "vdmulh.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; + vdmulh_w_vx{: vs1, vs2 : vd}, + disasm: "vdmulh.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ false, /* round_neg */ false)"; + vdmulh_w_vx_m{: vs1, vs2 : vd}, + disasm: "vdmulh.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ false, /* round_neg */ false)"; + + //vdmulh.r + vdmulh_b_r_vv{: vs1, vs2 : vd}, + disasm: "vdmulh.b.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; + vdmulh_b_r_vv_m{: vs1, vs2 : vd}, + disasm: "vdmulh.b.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; + vdmulh_h_r_vv{: vs1, vs2 : vd}, + disasm: "vdmulh.h.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; + vdmulh_h_r_vv_m{: vs1, vs2 : vd}, + disasm: "vdmulh.h.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; + vdmulh_w_r_vv{: vs1, vs2 : vd}, + disasm: "vdmulh.w.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; + vdmulh_w_r_vv_m{: vs1, vs2 : vd}, + disasm: "vdmulh.w.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; + vdmulh_b_r_vx{: vs1, vs2 : vd}, + disasm: "vdmulh.b.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; + vdmulh_b_r_vx_m{: vs1, vs2 : vd}, + disasm: "vdmulh.b.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; + vdmulh_h_r_vx{: vs1, vs2 : vd}, + disasm: "vdmulh.h.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; + vdmulh_h_r_vx_m{: vs1, vs2 : vd}, + disasm: "vdmulh.h.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; + vdmulh_w_r_vx{: vs1, vs2 : vd}, + disasm: "vdmulh.w.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ false)"; + vdmulh_w_r_vx_m{: vs1, vs2 : vd}, + disasm: "vdmulh.w.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ false)"; + + //vdmulh.rn + vdmulh_b_rn_vv{: vs1, vs2 : vd}, + disasm: "vdmulh.b.rn.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; + vdmulh_b_rn_vv_m{: vs1, vs2 : vd}, + disasm: "vdmulh.b.rn.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; + vdmulh_h_rn_vv{: vs1, vs2 : vd}, + disasm: "vdmulh.h.rn.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; + vdmulh_h_rn_vv_m{: vs1, vs2 : vd}, + disasm: "vdmulh.h.rn.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; + vdmulh_w_rn_vv{: vs1, vs2 : vd}, + disasm: "vdmulh.w.rn.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; + vdmulh_w_rn_vv_m{: vs1, vs2 : vd}, + disasm: "vdmulh.w.rn.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ false, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; + vdmulh_b_rn_vx{: vs1, vs2 : vd}, + disasm: "vdmulh.b.rn.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; + vdmulh_b_rn_vx_m{: vs1, vs2 : vd}, + disasm: "vdmulh.b.rn.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int8_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; + vdmulh_h_rn_vx{: vs1, vs2 : vd}, + disasm: "vdmulh.h.rn.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; + vdmulh_h_rn_vx_m{: vs1, vs2 : vd}, + disasm: "vdmulh.h.rn.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int16_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; + vdmulh_w_rn_vx{: vs1, vs2 : vd}, + disasm: "vdmulh.w.rn.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ false, /* round */ true, /* round_neg */ true)"; + vdmulh_w_rn_vx_m{: vs1, vs2 : vd}, + disasm: "vdmulh.w.rn.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVDmulh<int32_t>, /*scalar*/ true, /*strip_mine*/ true, /* round */ true, /* round_neg */ true)"; + + //vmacc + vmacc_b_vv{: vs1, vs2 : vd}, + disasm: "vmacc.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmacc_b_vv_m{: vs1, vs2 : vd}, + disasm: "vmacc.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmacc_h_vv{: vs1, vs2 : vd}, + disasm: "vmacc.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmacc_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmacc.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmacc_w_vv{: vs1, vs2 : vd}, + disasm: "vmacc.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmacc_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmacc.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmacc_b_vx{: vs1, vs2 : vd}, + disasm: "vmacc.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmacc_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmacc.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmacc_h_vx{: vs1, vs2 : vd}, + disasm: "vmacc.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmacc_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmacc.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmacc_w_vx{: vs1, vs2 : vd}, + disasm: "vmacc.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmacc_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmacc.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMacc<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vmadd + vmadd_b_vv{: vs1, vs2 : vd}, + disasm: "vmadd.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmadd_b_vv_m{: vs1, vs2 : vd}, + disasm: "vmadd.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmadd_h_vv{: vs1, vs2 : vd}, + disasm: "vmadd.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmadd_h_vv_m{: vs1, vs2 : vd}, + disasm: "vmadd.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmadd_w_vv{: vs1, vs2 : vd}, + disasm: "vmadd.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vmadd_w_vv_m{: vs1, vs2 : vd}, + disasm: "vmadd.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vmadd_b_vx{: vs1, vs2 : vd}, + disasm: "vmadd.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmadd_b_vx_m{: vs1, vs2 : vd}, + disasm: "vmadd.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmadd_h_vx{: vs1, vs2 : vd}, + disasm: "vmadd.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmadd_h_vx_m{: vs1, vs2 : vd}, + disasm: "vmadd.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vmadd_w_vx{: vs1, vs2 : vd}, + disasm: "vmadd.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vmadd_w_vx_m{: vs1, vs2 : vd}, + disasm: "vmadd.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVMadd<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + } +}
diff --git a/sim/kelvin_shift.isa b/sim/kelvin_shift.isa new file mode 100644 index 0000000..9477806 --- /dev/null +++ b/sim/kelvin_shift.isa
@@ -0,0 +1,851 @@ +// This file define the kelvin base isa for mpact-sim. For more info on mpact-sim +// isa format, check: go/mpact-sim-codelabs-riscv-instruction-decoder + +// First disasm field is 18 char wide and left justified. +disasm widths = {-18}; + +// Kelvin simd instructions: +// https://spacebeaker.googlesource.com/shodan/sw/kelvin/+/refs/heads/master/docs/kelvin_isa.md +// Shift / Shuffle instructions (func1 010/110) +slot kelvin_shift { + includes { + #include "sim/kelvin_instructions.h" + #include "sim/kelvin_vector_instructions.h" + #include "absl/functional/bind_front.h" + } + default size = 4; + default latency = global_latency; + opcodes { + //vsll + vsll_b_vv{: vs1, vs2 : vd}, + disasm: "vsll.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsll_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsll.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsll_h_vv{: vs1, vs2 : vd}, + disasm: "vsll.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsll_h_vv_m{: vs1, vs2 : vd}, + disasm: "vsll.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsll_w_vv{: vs1, vs2 : vd}, + disasm: "vsll.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsll_w_vv_m{: vs1, vs2 : vd}, + disasm: "vsll.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsll_b_vx{: vs1, vs2 : vd}, + disasm: "vsll.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsll_b_vx_m{: vs1, vs2 : vd}, + disasm: "vsll.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsll_h_vx{: vs1, vs2 : vd}, + disasm: "vsll.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsll_h_vx_m{: vs1, vs2 : vd}, + disasm: "vsll.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsll_w_vx{: vs1, vs2 : vd}, + disasm: "vsll.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsll_w_vx_m{: vs1, vs2 : vd}, + disasm: "vsll.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSll<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vsra + vsra_b_vv{: vs1, vs2 : vd}, + disasm: "vsra.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsra_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsra.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsra_h_vv{: vs1, vs2 : vd}, + disasm: "vsra.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsra_h_vv_m{: vs1, vs2 : vd}, + disasm: "vsra.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsra_w_vv{: vs1, vs2 : vd}, + disasm: "vsra.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsra_w_vv_m{: vs1, vs2 : vd}, + disasm: "vsra.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsra_b_vx{: vs1, vs2 : vd}, + disasm: "vsra.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsra_b_vx_m{: vs1, vs2 : vd}, + disasm: "vsra.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsra_h_vx{: vs1, vs2 : vd}, + disasm: "vsra.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsra_h_vx_m{: vs1, vs2 : vd}, + disasm: "vsra.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsra_w_vx{: vs1, vs2 : vd}, + disasm: "vsra.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsra_w_vx_m{: vs1, vs2 : vd}, + disasm: "vsra.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSra<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vsrl + vsrl_b_vv{: vs1, vs2 : vd}, + disasm: "vsrl.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsrl_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsrl.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsrl_h_vv{: vs1, vs2 : vd}, + disasm: "vsrl.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsrl_h_vv_m{: vs1, vs2 : vd}, + disasm: "vsrl.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsrl_w_vv{: vs1, vs2 : vd}, + disasm: "vsrl.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsrl_w_vv_m{: vs1, vs2 : vd}, + disasm: "vsrl.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsrl_b_vx{: vs1, vs2 : vd}, + disasm: "vsrl.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsrl_b_vx_m{: vs1, vs2 : vd}, + disasm: "vsrl.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsrl_h_vx{: vs1, vs2 : vd}, + disasm: "vsrl.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsrl_h_vx_m{: vs1, vs2 : vd}, + disasm: "vsrl.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsrl_w_vx{: vs1, vs2 : vd}, + disasm: "vsrl.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsrl_w_vx_m{: vs1, vs2 : vd}, + disasm: "vsrl.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrl<uint32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vsha + vsha_b_vv{: vs1, vs2 : vd}, + disasm: "vsha.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ false, /*strip_mine*/ false)"; + vsha_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsha.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ false, /*strip_mine*/ true)"; + vsha_h_vv{: vs1, vs2 : vd}, + disasm: "vsha.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ false, /*strip_mine*/ false)"; + vsha_h_vv_m{: vs1, vs2 : vd}, + disasm: "vsha.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ false, /*strip_mine*/ true)"; + vsha_w_vv{: vs1, vs2 : vd}, + disasm: "vsha.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ false, /*strip_mine*/ false)"; + vsha_w_vv_m{: vs1, vs2 : vd}, + disasm: "vsha.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ false, /*strip_mine*/ true)"; + vsha_b_r_vv{: vs1, vs2 : vd}, + disasm: "vsha.b.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ true, /*strip_mine*/ false)"; + vsha_b_r_vv_m{: vs1, vs2 : vd}, + disasm: "vsha.b.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ true, /*strip_mine*/ true)"; + vsha_h_r_vv{: vs1, vs2 : vd}, + disasm: "vsha.h.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ true, /*strip_mine*/ false)"; + vsha_h_r_vv_m{: vs1, vs2 : vd}, + disasm: "vsha.h.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ true, /*strip_mine*/ true)"; + vsha_w_r_vv{: vs1, vs2 : vd}, + disasm: "vsha.w.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ true, /*strip_mine*/ false)"; + vsha_w_r_vv_m{: vs1, vs2 : vd}, + disasm: "vsha.w.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ true, /*strip_mine*/ true)"; + + //vshl + vshl_b_vv{: vs1, vs2 : vd}, + disasm: "vshl.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ false, /*strip_mine*/ false)"; + vshl_b_vv_m{: vs1, vs2 : vd}, + disasm: "vshl.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ false, /*strip_mine*/ true)"; + vshl_h_vv{: vs1, vs2 : vd}, + disasm: "vshl.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ false, /*strip_mine*/ false)"; + vshl_h_vv_m{: vs1, vs2 : vd}, + disasm: "vshl.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ false, /*strip_mine*/ true)"; + vshl_w_vv{: vs1, vs2 : vd}, + disasm: "vshl.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ false, /*strip_mine*/ false)"; + vshl_w_vv_m{: vs1, vs2 : vd}, + disasm: "vshl.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ false, /*strip_mine*/ true)"; + vshl_b_r_vv{: vs1, vs2 : vd}, + disasm: "vshl.b.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ true, /*strip_mine*/ false)"; + vshl_b_r_vv_m{: vs1, vs2 : vd}, + disasm: "vshl.b.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ true, /*strip_mine*/ true)"; + vshl_h_r_vv{: vs1, vs2 : vd}, + disasm: "vshl.h.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ true, /*strip_mine*/ false)"; + vshl_h_r_vv_m{: vs1, vs2 : vd}, + disasm: "vshl.h.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ true, /*strip_mine*/ true)"; + vshl_w_r_vv{: vs1, vs2 : vd}, + disasm: "vshl.w.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ true, /*strip_mine*/ false)"; + vshl_w_r_vv_m{: vs1, vs2 : vd}, + disasm: "vshl.w.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ true, /*strip_mine*/ true)"; + + //vnot + vnot_v{: vs1 : vd}, + disasm: "vnot.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVNot<int32_t>, /*strip_mine*/ false)"; + vnot_v_m{: vs1 : vd}, + disasm: "vnot.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVNot<int32_t>, /*strip_mine*/ true)"; + + //vclb + vclb_b_v{: vs1 : vd}, + disasm: "vclb.b.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClb<uint8_t>, /*strip_mine*/ false)"; + vclb_b_v_m{: vs1 : vd}, + disasm: "vclb.b.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClb<uint8_t>, /*strip_mine*/ true)"; + vclb_h_v{: vs1 : vd}, + disasm: "vclb.h.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClb<uint16_t>, /*strip_mine*/ false)"; + vclb_h_v_m{: vs1 : vd}, + disasm: "vclb.h.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClb<uint16_t>, /*strip_mine*/ true)"; + vclb_w_v{: vs1 : vd}, + disasm: "vclb.w.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClb<uint32_t>, /*strip_mine*/ false)"; + vclb_w_v_m{: vs1 : vd}, + disasm: "vclb.w.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClb<uint32_t>, /*strip_mine*/ true)"; + + //vclz + vclz_b_v{: vs1 : vd}, + disasm: "vclz.b.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClz<uint8_t>, /*strip_mine*/ false)"; + vclz_b_v_m{: vs1 : vd}, + disasm: "vclz.b.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClz<uint8_t>, /*strip_mine*/ true)"; + vclz_h_v{: vs1 : vd}, + disasm: "vclz.h.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClz<uint16_t>, /*strip_mine*/ false)"; + vclz_h_v_m{: vs1 : vd}, + disasm: "vclz.h.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClz<uint16_t>, /*strip_mine*/ true)"; + vclz_w_v{: vs1 : vd}, + disasm: "vclz.w.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClz<uint32_t>, /*strip_mine*/ false)"; + vclz_w_v_m{: vs1 : vd}, + disasm: "vclz.w.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVClz<uint32_t>, /*strip_mine*/ true)"; + + //vcpop + vcpop_b_v{: vs1 : vd}, + disasm: "vcpop.b.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVCpop<uint8_t>, /*strip_mine*/ false)"; + vcpop_b_v_m{: vs1 : vd}, + disasm: "vcpop.b.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVCpop<uint8_t>, /*strip_mine*/ true)"; + vcpop_h_v{: vs1 : vd}, + disasm: "vcpop.h.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVCpop<uint16_t>, /*strip_mine*/ false)"; + vcpop_h_v_m{: vs1 : vd}, + disasm: "vcpop.h.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVCpop<uint16_t>, /*strip_mine*/ true)"; + vcpop_w_v{: vs1 : vd}, + disasm: "vcpop.w.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVCpop<uint32_t>, /*strip_mine*/ false)"; + vcpop_w_v_m{: vs1 : vd}, + disasm: "vcpop.w.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVCpop<uint32_t>, /*strip_mine*/ true)"; + + //vmv + vmv_v{: vs1 : vd}, + disasm: "vmv.v", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVMv<int32_t>, /*strip_mine*/ false)"; + vmv_v_m{: vs1 : vd}, + disasm: "vmv.v.m", "%vd, %vs1", + semfunc: "absl::bind_front(&KelvinVMv<int32_t>, /*strip_mine*/ true)"; + + //vsrans + vsrans_b_vv{: vs1, vs2 : vd}, + disasm: "vsrans.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; + vsrans_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsrans.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; + vsrans_h_vv{: vs1, vs2 : vd}, + disasm: "vsrans.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; + vsrans_h_vv_m{: vs1, vs2 : vd}, + disasm: "vsrans.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; + vsrans_b_vx{: vs1, vs2 : vd}, + disasm: "vsrans.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; + vsrans_b_vx_m{: vs1, vs2 : vd}, + disasm: "vsrans.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; + vsrans_h_vx{: vs1, vs2 : vd}, + disasm: "vsrans.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; + vsrans_h_vx_m{: vs1, vs2 : vd}, + disasm: "vsrans.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; + vsrans_b_r_vv{: vs1, vs2 : vd}, + disasm: "vsrans.b.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; + vsrans_b_r_vv_m{: vs1, vs2 : vd}, + disasm: "vsrans.b.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; + vsrans_h_r_vv{: vs1, vs2 : vd}, + disasm: "vsrans.h.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; + vsrans_h_r_vv_m{: vs1, vs2 : vd}, + disasm: "vsrans.h.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; + vsrans_b_r_vx{: vs1, vs2 : vd}, + disasm: "vsrans.b.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; + vsrans_b_r_vx_m{: vs1, vs2 : vd}, + disasm: "vsrans.b.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int16_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; + vsrans_h_r_vx{: vs1, vs2 : vd}, + disasm: "vsrans.h.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; + vsrans_h_r_vx_m{: vs1, vs2 : vd}, + disasm: "vsrans.h.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int16_t, int32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; + + //vsransu + vsransu_b_vv{: vs1, vs2 : vd}, + disasm: "vsransu.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; + vsransu_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsransu.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; + vsransu_h_vv{: vs1, vs2 : vd}, + disasm: "vsransu.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; + vsransu_h_vv_m{: vs1, vs2 : vd}, + disasm: "vsransu.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; + vsransu_b_vx{: vs1, vs2 : vd}, + disasm: "vsransu.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; + vsransu_b_vx_m{: vs1, vs2 : vd}, + disasm: "vsransu.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; + vsransu_h_vx{: vs1, vs2 : vd}, + disasm: "vsransu.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; + vsransu_h_vx_m{: vs1, vs2 : vd}, + disasm: "vsransu.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; + vsransu_b_r_vv{: vs1, vs2 : vd}, + disasm: "vsransu.b.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; + vsransu_b_r_vv_m{: vs1, vs2 : vd}, + disasm: "vsransu.b.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; + vsransu_h_r_vv{: vs1, vs2 : vd}, + disasm: "vsransu.h.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; + vsransu_h_r_vv_m{: vs1, vs2 : vd}, + disasm: "vsransu.h.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; + vsransu_b_r_vx{: vs1, vs2 : vd}, + disasm: "vsransu.b.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; + vsransu_b_r_vx_m{: vs1, vs2 : vd}, + disasm: "vsransu.b.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint16_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; + vsransu_h_r_vx{: vs1, vs2 : vd}, + disasm: "vsransu.h.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; + vsransu_h_r_vx_m{: vs1, vs2 : vd}, + disasm: "vsransu.h.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint16_t, uint32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; + + //vsraqs + vsraqs_b_vv{: vs1, vs2 : vd}, + disasm: "vsraqs.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; + vsraqs_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsraqs.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; + vsraqs_b_vx{: vs1, vs2 : vd}, + disasm: "vsraqs.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; + vsraqs_b_vx_m{: vs1, vs2 : vd}, + disasm: "vsraqs.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; + vsraqs_b_r_vv{: vs1, vs2 : vd}, + disasm: "vsraqs.b.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; + vsraqs_b_r_vv_m{: vs1, vs2 : vd}, + disasm: "vsraqs.b.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; + vsraqs_b_r_vx{: vs1, vs2 : vd}, + disasm: "vsraqs.b.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; + vsraqs_b_r_vx_m{: vs1, vs2 : vd}, + disasm: "vsraqs.b.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<int8_t, int32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; + + //vsraqsu + vsraqsu_b_vv{: vs1, vs2 : vd}, + disasm: "vsraqsu.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ false)"; + vsraqsu_b_vv_m{: vs1, vs2 : vd}, + disasm: "vsraqsu.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ false, /*scalar*/ false, /*strip_mine*/ true)"; + vsraqsu_b_vx{: vs1, vs2 : vd}, + disasm: "vsraqsu.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ false)"; + vsraqsu_b_vx_m{: vs1, vs2 : vd}, + disasm: "vsraqsu.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ false, /*scalar*/ true, /*strip_mine*/ true)"; + vsraqsu_b_r_vv{: vs1, vs2 : vd}, + disasm: "vsraqsu.b.r.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ false)"; + vsraqsu_b_r_vv_m{: vs1, vs2 : vd}, + disasm: "vsraqsu.b.r.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ true, /*scalar*/ false, /*strip_mine*/ true)"; + vsraqsu_b_r_vx{: vs1, vs2 : vd}, + disasm: "vsraqsu.b.r.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ false)"; + vsraqsu_b_r_vx_m{: vs1, vs2 : vd}, + disasm: "vsraqsu.b.r.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSrans<uint8_t, uint32_t>, /*round*/ true, /*scalar*/ true, /*strip_mine*/ true)"; + + //vslidevn + vsliden_b_1_vv{: vs1, vs2 : vd}, + disasm: "vsliden.b.1.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 1 /* index */, false /* strip_mine */)"; + vsliden_b_2_vv{: vs1, vs2 : vd}, + disasm: "vsliden.b.2.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 2 /* index */, false /* strip_mine */)"; + vsliden_b_3_vv{: vs1, vs2 : vd}, + disasm: "vsliden.b.3.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 3 /* index */, false /* strip_mine */)"; + vsliden_b_4_vv{: vs1, vs2 : vd}, + disasm: "vsliden.b.4.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 4 /* index */, false /* strip_mine */)"; + vsliden_h_1_vv{: vs1, vs2 : vd}, + disasm: "vsliden.h.1.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 1 /* index */, false /* strip_mine */)"; + vsliden_h_2_vv{: vs1, vs2 : vd}, + disasm: "vsliden.h.2.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 2 /* index */, false /* strip_mine */)"; + vsliden_h_3_vv{: vs1, vs2 : vd}, + disasm: "vsliden.h.3.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 3 /* index */, false /* strip_mine */)"; + vsliden_h_4_vv{: vs1, vs2 : vd}, + disasm: "vsliden.h.4.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 4 /* index */, false /* strip_mine */)"; + vsliden_w_1_vv{: vs1, vs2 : vd}, + disasm: "vsliden.w.1.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 1 /* index */, false /* strip_mine */)"; + vsliden_w_2_vv{: vs1, vs2 : vd}, + disasm: "vsliden.w.2.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 2 /* index */, false /* strip_mine */)"; + vsliden_w_3_vv{: vs1, vs2 : vd}, + disasm: "vsliden.w.3.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 3 /* index */, false /* strip_mine */)"; + vsliden_w_4_vv{: vs1, vs2 : vd}, + disasm: "vsliden.w.4.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 4 /* index */, false /* strip_mine */)"; + vslidevn_b_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.b.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 1 /* index */, true /* strip_mine */)"; + vslidevn_b_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.b.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 2 /* index */, true /* strip_mine */)"; + vslidevn_b_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.b.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 3 /* index */, true /* strip_mine */)"; + vslidevn_b_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.b.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int8_t>, 4 /* index */, true /* strip_mine */)"; + vslidevn_h_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.h.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 1 /* index */, true /* strip_mine */)"; + vslidevn_h_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.h.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 2 /* index */, true /* strip_mine */)"; + vslidevn_h_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.h.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 3 /* index */, true /* strip_mine */)"; + vslidevn_h_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.h.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int16_t>, 4 /* index */, true /* strip_mine */)"; + vslidevn_w_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.w.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 1 /* index */, true /* strip_mine */)"; + vslidevn_w_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.w.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 2 /* index */, true /* strip_mine */)"; + vslidevn_w_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.w.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 3 /* index */, true /* strip_mine */)"; + vslidevn_w_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevn.w.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevn<int32_t>, 4 /* index */, true /* strip_mine */)"; + + //vslidehn + vslidehn_b_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.b.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int8_t>, 1 /* index */)"; + vslidehn_b_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.b.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int8_t>, 2 /* index */)"; + vslidehn_b_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.b.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int8_t>, 3 /* index */)"; + vslidehn_b_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.b.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int8_t>, 4 /* index */)"; + vslidehn_h_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.h.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int16_t>, 1 /* index */)"; + vslidehn_h_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.h.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int16_t>, 2 /* index */)"; + vslidehn_h_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.h.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int16_t>, 3 /* index */)"; + vslidehn_h_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.h.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int16_t>, 4 /* index */)"; + vslidehn_w_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.w.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int32_t>, 1 /* index */)"; + vslidehn_w_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.w.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int32_t>, 2 /* index */)"; + vslidehn_w_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.w.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int32_t>, 3 /* index */)"; + vslidehn_w_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehn.w.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehn<int32_t>, 4 /* index */)"; + + //vslidevp + vslidep_b_1_vv{: vs1, vs2 : vd}, + disasm: "vslidep.b.1.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 1 /* index */, false /* strip_mine */)"; + vslidep_b_2_vv{: vs1, vs2 : vd}, + disasm: "vslidep.b.2.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 2 /* index */, false /* strip_mine */)"; + vslidep_b_3_vv{: vs1, vs2 : vd}, + disasm: "vslidep.b.3.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 3 /* index */, false /* strip_mine */)"; + vslidep_b_4_vv{: vs1, vs2 : vd}, + disasm: "vslidep.b.4.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 4 /* index */, false /* strip_mine */)"; + vslidep_h_1_vv{: vs1, vs2 : vd}, + disasm: "vslidep.h.1.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 1 /* index */, false /* strip_mine */)"; + vslidep_h_2_vv{: vs1, vs2 : vd}, + disasm: "vslidep.h.2.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 2 /* index */, false /* strip_mine */)"; + vslidep_h_3_vv{: vs1, vs2 : vd}, + disasm: "vslidep.h.3.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 3 /* index */, false /* strip_mine */)"; + vslidep_h_4_vv{: vs1, vs2 : vd}, + disasm: "vslidep.h.4.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 4 /* index */, false /* strip_mine */)"; + vslidep_w_1_vv{: vs1, vs2 : vd}, + disasm: "vslidep.w.1.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 1 /* index */, false /* strip_mine */)"; + vslidep_w_2_vv{: vs1, vs2 : vd}, + disasm: "vslidep.w.2.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 2 /* index */, false /* strip_mine */)"; + vslidep_w_3_vv{: vs1, vs2 : vd}, + disasm: "vslidep.w.3.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 3 /* index */, false /* strip_mine */)"; + vslidep_w_4_vv{: vs1, vs2 : vd}, + disasm: "vslidep.w.4.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 4 /* index */, false /* strip_mine */)"; + vslidevp_b_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.b.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 1 /* index */, true /* strip_mine */)"; + vslidevp_b_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.b.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 2 /* index */, true /* strip_mine */)"; + vslidevp_b_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.b.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 3 /* index */, true /* strip_mine */)"; + vslidevp_b_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.b.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int8_t>, 4 /* index */, true /* strip_mine */)"; + vslidevp_h_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.h.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 1 /* index */, true /* strip_mine */)"; + vslidevp_h_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.h.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 2 /* index */, true /* strip_mine */)"; + vslidevp_h_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.h.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 3 /* index */, true /* strip_mine */)"; + vslidevp_h_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.h.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int16_t>, 4 /* index */, true /* strip_mine */)"; + vslidevp_w_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.w.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 1 /* index */, true /* strip_mine */)"; + vslidevp_w_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.w.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 2 /* index */, true /* strip_mine */)"; + vslidevp_w_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.w.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 3 /* index */, true /* strip_mine */)"; + vslidevp_w_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidevp.w.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidevp<int32_t>, 4 /* index */, true /* strip_mine */)"; + + //vslidehp + vslidehp_b_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.b.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int8_t>, 1 /* index */)"; + vslidehp_b_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.b.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int8_t>, 2 /* index */)"; + vslidehp_b_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.b.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int8_t>, 3 /* index */)"; + vslidehp_b_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.b.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int8_t>, 4 /* index */)"; + vslidehp_h_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.h.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int16_t>, 1 /* index */)"; + vslidehp_h_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.h.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int16_t>, 2 /* index */)"; + vslidehp_h_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.h.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int16_t>, 3 /* index */)"; + vslidehp_h_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.h.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int16_t>, 4 /* index */)"; + vslidehp_w_1_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.w.1.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int32_t>, 1 /* index */)"; + vslidehp_w_2_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.w.2.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int32_t>, 2 /* index */)"; + vslidehp_w_3_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.w.3.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int32_t>, 3 /* index */)"; + vslidehp_w_4_vv_m{: vs1, vs2 : vd}, + disasm: "vslidehp.w.4.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSlidehp<int32_t>, 4 /* index */)"; + + //vsel + vsel_b_vv{: vs1, vs2, vd : vd}, + disasm: "vsel.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsel_b_vv_m{: vs1, vs2, vd : vd}, + disasm: "vsel.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsel_h_vv{: vs1, vs2, vd : vd}, + disasm: "vsel.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsel_h_vv_m{: vs1, vs2, vd : vd}, + disasm: "vsel.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsel_w_vv{: vs1, vs2, vd : vd}, + disasm: "vsel.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vsel_w_vv_m{: vs1, vs2, vd : vd}, + disasm: "vsel.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vsel_b_vx{: vs1, vs2, vd : vd}, + disasm: "vsel.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsel_b_vx_m{: vs1, vs2, vd : vd}, + disasm: "vsel.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsel_h_vx{: vs1, vs2, vd : vd}, + disasm: "vsel.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsel_h_vx_m{: vs1, vs2, vd : vd}, + disasm: "vsel.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vsel_w_vx{: vs1, vs2, vd : vd}, + disasm: "vsel.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vsel_w_vx_m{: vs1, vs2, vd : vd}, + disasm: "vsel.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVSel<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vevn + vevn_b_vv{: vs1, vs2 : vd}, + disasm: "vevn.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vevn_b_vv_m{: vs1, vs2 : vd}, + disasm: "vevn.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vevn_h_vv{: vs1, vs2 : vd}, + disasm: "vevn.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vevn_h_vv_m{: vs1, vs2 : vd}, + disasm: "vevn.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vevn_w_vv{: vs1, vs2 : vd}, + disasm: "vevn.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vevn_w_vv_m{: vs1, vs2 : vd}, + disasm: "vevn.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vevn_b_vx{: vs1, vs2 : vd}, + disasm: "vevn.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vevn_b_vx_m{: vs1, vs2 : vd}, + disasm: "vevn.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vevn_h_vx{: vs1, vs2 : vd}, + disasm: "vevn.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vevn_h_vx_m{: vs1, vs2 : vd}, + disasm: "vevn.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vevn_w_vx{: vs1, vs2 : vd}, + disasm: "vevn.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vevn_w_vx_m{: vs1, vs2 : vd}, + disasm: "vevn.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvn<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vodd + vodd_b_vv{: vs1, vs2 : vd}, + disasm: "vodd.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vodd_b_vv_m{: vs1, vs2 : vd}, + disasm: "vodd.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vodd_h_vv{: vs1, vs2 : vd}, + disasm: "vodd.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vodd_h_vv_m{: vs1, vs2 : vd}, + disasm: "vodd.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vodd_w_vv{: vs1, vs2 : vd}, + disasm: "vodd.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vodd_w_vv_m{: vs1, vs2 : vd}, + disasm: "vodd.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vodd_b_vx{: vs1, vs2 : vd}, + disasm: "vodd.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vodd_b_vx_m{: vs1, vs2 : vd}, + disasm: "vodd.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vodd_h_vx{: vs1, vs2 : vd}, + disasm: "vodd.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vodd_h_vx_m{: vs1, vs2 : vd}, + disasm: "vodd.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vodd_w_vx{: vs1, vs2 : vd}, + disasm: "vodd.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vodd_w_vx_m{: vs1, vs2 : vd}, + disasm: "vodd.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVOdd<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vevnodd + vevnodd_b_vv{: vs1, vs2 : vd}, + disasm: "vevnodd.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vevnodd_b_vv_m{: vs1, vs2 : vd}, + disasm: "vevnodd.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vevnodd_h_vv{: vs1, vs2 : vd}, + disasm: "vevnodd.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vevnodd_h_vv_m{: vs1, vs2 : vd}, + disasm: "vevnodd.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vevnodd_w_vv{: vs1, vs2 : vd}, + disasm: "vevnodd.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vevnodd_w_vv_m{: vs1, vs2 : vd}, + disasm: "vevnodd.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vevnodd_b_vx{: vs1, vs2 : vd}, + disasm: "vevnodd.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vevnodd_b_vx_m{: vs1, vs2 : vd}, + disasm: "vevnodd.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vevnodd_h_vx{: vs1, vs2 : vd}, + disasm: "vevnodd.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vevnodd_h_vx_m{: vs1, vs2 : vd}, + disasm: "vevnodd.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vevnodd_w_vx{: vs1, vs2 : vd}, + disasm: "vevnodd.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vevnodd_w_vx_m{: vs1, vs2 : vd}, + disasm: "vevnodd.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVEvnodd<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + + //vzip + vzip_b_vv{: vs1, vs2 : vd}, + disasm: "vzip.b.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int8_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vzip_b_vv_m{: vs1, vs2 : vd}, + disasm: "vzip.b.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int8_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vzip_h_vv{: vs1, vs2 : vd}, + disasm: "vzip.h.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int16_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vzip_h_vv_m{: vs1, vs2 : vd}, + disasm: "vzip.h.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int16_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vzip_w_vv{: vs1, vs2 : vd}, + disasm: "vzip.w.vv", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int32_t>, /*scalar*/ false, /*strip_mine*/ false)"; + vzip_w_vv_m{: vs1, vs2 : vd}, + disasm: "vzip.w.vv.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int32_t>, /*scalar*/ false, /*strip_mine*/ true)"; + vzip_b_vx{: vs1, vs2 : vd}, + disasm: "vzip.b.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int8_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vzip_b_vx_m{: vs1, vs2 : vd}, + disasm: "vzip.b.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int8_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vzip_h_vx{: vs1, vs2 : vd}, + disasm: "vzip.h.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int16_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vzip_h_vx_m{: vs1, vs2 : vd}, + disasm: "vzip.h.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int16_t>, /*scalar*/ true, /*strip_mine*/ true)"; + vzip_w_vx{: vs1, vs2 : vd}, + disasm: "vzip.w.vx", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int32_t>, /*scalar*/ true, /*strip_mine*/ false)"; + vzip_w_vx_m{: vs1, vs2 : vd}, + disasm: "vzip.w.vx.m", "%vd, %vs1, %vs2", + semfunc: "absl::bind_front(&KelvinVZip<int32_t>, /*scalar*/ true, /*strip_mine*/ true)"; + } +}