\chapter{ISA Subset Naming Conventions}
\label{naming}

This chapter describes the RISC-V ISA subset naming scheme that is
used to concisely describe the set of instructions present in a
hardware implementation, or the set of instructions used by an
application binary interface (ABI).

\begin{commentary}
The RISC-V ISA is designed to support a wide variety of
implementations with various experimental instruction-set extensions.
We have found that an organized naming scheme simplifies software
tools and documentation.
\end{commentary}

\section{Case Sensitivity}

The ISA naming strings are case insensitive.

\section{Base Integer ISA}
RISC-V ISA strings begin with either RV32I, RV32E, RV64I, or RV128I
indicating the supported address space size in bits for the base
integer ISA.

\section{Instruction Extensions Names}

Standard ISA extensions are given a name consisting of a single
letter.  For example, the first four standard
extensions to the integer bases are:
``M'' for integer multiplication and division,
``A'' for atomic memory instructions,
``F'' for single-precision floating-point instructions, and
``D'' for double-precision floating-point instructions.
Any RISC-V instruction set variant can be succinctly described by
concatenating the base integer prefix with the names of the included
extensions.  For example, ``RV64IMAFD''.

We have also defined an abbreviation ``G'' to represent the ``IMAFD''
base and extensions, as this is intended to represent our standard
general-purpose ISA.

Standard extensions to the RISC-V ISA are given other reserved
letters, e.g., ``Q'' for quad-precision floating-point, or
``C'' for the 16-bit compressed instruction format.

\section{Version Numbers}
Recognizing that instruction sets may expand or alter over time, we
encode subset version numbers following the subset name.  Version
numbers are divided into major and minor version numbers, separated by
a ``p''.  If the minor version is ``0'', then ``p0'' can be omitted
from the version string.  Changes in major version numbers imply a
loss of backwards compatibility, whereas changes in only the minor
version number must be backwards-compatible.  For example, the
original 64-bit standard ISA defined in release 1.0 of this manual can
be written in full as ``RV64I1p0M1p0A1p0F1p0D1p0'', more concisely as
``RV64I1M1A1F1D1'', or even more concisely as ``RV64G1''.  The G ISA
subset can be written as ``RV64I2p0M2p0A2p0F2p0D2p0'', or more
concisely ``RV64G2''.

We introduced the version numbering scheme with the second release,
which we also intend to become a permanent standard.  Hence, we define
the default version of a standard subset to be that present at the
time of this document, e.g., ``RV32G'' is equivalent to
``RV32I2M2A2F2D2''.

\section{Non-Standard Extension Names}

Non-standard subsets are named using a single ``X'' followed by a name
beginning with a letter and an optional version number.
For example, ``Xhwacha'' names the Hwacha vector-fetch ISA extension;
``Xhwacha2'' and ``Xhwacha2p0'' name version 2.0 of same.

Non-standard extensions must be separated from other multi-letter extensions
by a single underscore.  For example, an ISA with non-standard extensions
Argle and Bargle may be named ``RV64GXargle\_Xbargle''.

\section{Supervisor-level Instruction Subsets}
Standard supervisor instruction subsets are defined in Volume II, but
are named using ``S'' as a prefix, followed by a supervisor subset name
beginning with a letter and an optional version number.

Supervisor extensions must be separated from other multi-letter extensions
by a single underscore.

\section{Supervisor-level Extensions}
Non-standard extensions to the supervisor-level ISA are defined using
the ``SX'' prefix.

\section{Subset Naming Convention}
Table~\ref{isanametable} summarizes the standardized subset names.
~\\
\begin{table}[h]
\center
\begin{tabular}{|l|c|}
\hline
Subset & Name \\
\hline
\hline
\multicolumn{2}{|c|}{Standard General-Purpose ISA}\\
\hline
Integer & I \\
Integer Multiplication and Division & M \\
Atomics & A \\
Single-Precision Floating-Point & F \\
Double-Precision Floating-Point & D \\
\hline
General & G = IMAFD \\
\hline
\multicolumn{2}{|c|}{Standard User-Level Extensions}\\
\hline
Quad-Precision Floating-Point & Q \\
Decimal Floating-Point & L \\
16-bit Compressed Instructions & C \\
Bit Manipulation & B \\
Dynamic Languages & J \\
Transactional Memory & T \\
Packed-SIMD Extensions & P \\
Vector Extensions & V \\
User-Level Interrupts & N \\
\hline
\hline
\multicolumn{2}{|c|}{Non-Standard User-Level Extensions}\\
\hline
Non-standard extension ``abc'' & Xabc \\
\hline
\hline
\multicolumn{2}{|c|}{Standard Supervisor-Level ISA}\\
\hline
Supervisor extension ``def'' & Sdef \\
\hline
\hline
\multicolumn{2}{|c|}{Non-Standard Supervisor-Level Extensions}\\
\hline
Supervisor extension ``ghi'' & SXghi \\
\hline
\end{tabular}
\caption{Standard ISA subset names.  The table also defines the
  canonical order in which subset names must appear in the name
  string, with top-to-bottom in table indicating first-to-last in the
  name string, e.g., RV32IMAFDQC is legal, whereas RV32IMAFDCQ is not.}
\label{isanametable}
\end{table}


