blob: 94779de842cecdffbfb318a9c76f16f52277afef [file]
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Semantic functions for the RISC-V Vector Matrix Extension (Zvt / "VME",
// spec v0.3). This header declares the matrix configuration instructions
// (Zvtbase, spec 15.1.1.4). Tile move/load/store and the matrix-multiply
// instructions are added in their respective translation units.
#ifndef THIRD_PARTY_MPACT_RISCV_RISCV_ZVT_INSTRUCTIONS_H_
#define THIRD_PARTY_MPACT_RISCV_RISCV_ZVT_INSTRUCTIONS_H_
#include "mpact/sim/generic/instruction.h"
namespace mpact::sim::riscv {
using ::mpact::sim::generic::Instruction;
// KMAX (max inner dot-product depth) as a function of SEW in bits.
// Per spec 15.1.1.4: KMAX = max(1, 32 / SEW). int8->4, bf16(16)->2, fp32->1.
inline int RiscVZvtKmax(int sew_bits) {
return sew_bits >= 32 ? 1 : (32 / sew_bits);
}
// Matrix configuration instructions (Zvtbase). All write the constrained
// result back to the scalar destination register where applicable.
// In the Zvt extension:
// - M represents the number of rows of the accumulator tile.
// - N represents the number of columns of the accumulator tile.
// - K represents the inner dimension of the dot product.
//
// msetmtype rs1, rs2 : sets mtype (rs1) and vtype (rs2), zeroes vl.
void RiscVZvtMsetMtype(const Instruction* inst);
// msettn rd, rs1 : sets tn (== vl), bounded by the matrix config. (N is
// num columns)
void RiscVZvtMsetTn(const Instruction* inst);
// msettm rd, rs1 : sets mtype.tm. (M is num rows)
void RiscVZvtMsetTm(const Instruction* inst);
// msettk rd, rs1 : sets mtype.tk. (K is inner dimension)
void RiscVZvtMsetTk(const Instruction* inst);
// Tile manipulation instructions (Zvtbase).
// vtzero mtd : zeroes the tm x tn submatrix of tile mtd.
void RiscVZvtVtZero(const Instruction* inst);
// vtdiscard : hints the tile state is dead (no-op in the ISS).
void RiscVZvtVtDiscard(const Instruction* inst);
// vtmv.v.t vd, rs1 : moves a tile row/col subset (TSS in rs1) to vd.
void RiscVZvtVtmvVt(const Instruction* inst);
// vtmv.t.v rs1, vs2 : moves vs2 to a tile row/col subset (TSS in rs1).
void RiscVZvtVtmvTv(const Instruction* inst);
// vtle{8,16,32,64} rs2,(rs1) : loads a tile subset (TSS rs2) from memory.
void RiscVZvtVtle(int eew_bits, const Instruction* inst);
// vtse{8,16,32,64} rs2,(rs1) : stores a tile subset (TSS rs2) to memory.
void RiscVZvtVtse(int eew_bits, const Instruction* inst);
// Matrix-multiply instructions: C[m,n] += sum_k A[k,m] * B[k,n], with C in a
// tile and A/B sourced from vector register groups (spec 15.1.1.8).
// M is the number of rows of C, N is the number of columns of C, and
// K is the inner dimension of the dot product.
enum class RiscVZvtMatmulKind {
kInt8Signed, // vtmms.tvv: int8 x int8 -> int32.
kInt8Unsigned, // vtmmu.tvv: uint8 x uint8 -> int32.
kFp32, // vtfmm.tvv: fp32 x fp32 -> fp32.
kBf16, // vtfmm.alt.tvv: bf16 x bf16 -> fp32.
};
void RiscVZvtMatmul(RiscVZvtMatmulKind kind, const Instruction* inst);
} // namespace mpact::sim::riscv
#endif // THIRD_PARTY_MPACT_RISCV_RISCV_ZVT_INSTRUCTIONS_H_