指令集概述¶
灵犀指令集被定义为一个基本的整数指令集,称为基础指令集,它必须在任何实现中存在。基础指令集是图灵完备的,包含处理通用运算的所有基本指令。灵犀指令集还可以包含基于基础指令集的其他扩展,这些扩展可以由指令编码长度变化而增加,也可以由某种特殊的块类型引入。
灵犀指令集采用变长指令的编码模式,支持16位、32位、48位或64位的4种指令长度。由于指令长度都是16位基准的整数倍,因此这些指令必须在16位边界对齐。
不同长度指令介绍如下:
- 16位长度的指令称为压缩指令,定义在压缩指令扩展中。压缩指令的命名统一使用“C.”(或小写“c.”)作为前缀。
- 32位长度的指令称为标准指令,标准指令用于定义基础指令集,基础指令扩展和标准指令扩展。
- 48位长度的指令称为半长指令,定义在增强指令扩展中。半长指令的命名统一使用“HL.”(或小写“hl.”)作为前缀。
- 64位长度的指令称为长指令,定义在超长指令扩展中。长指令的命名统一使用“L.”(或小写“l.”)作为前缀。
其中,48位和64位字长的指令采用 前缀+后缀 这种拼接组合的方式进行编码,从而达到扩展指令空间以及提升指令表达能力的目的。同时为了能够在一种实现中,软件或程序员可以选用任意长度的指令来实现指定的功能,我们将4种字长的指令编码在同一套指令空间内。编码规则如下所述:

第一层编码逻辑中,最低位代表指令字长Width(简写为W)。Width位编码为0表示16位指令,编码为1则表示32位指令。

第二层编码逻辑中,通过Opcode字段将16bit和32bit指令空间进一步划分为对应字长的主指令空间、后缀指令空间和前缀指令空间,用于提供更长指令的组合编码。具体如下表:
| Width | Opcode | 分类 | 作用/要求 |
|---|---|---|---|
| 0 | [0, 6] | 16bit主指令 | 单独定义特定语义的指令,暂时不支持拼接前缀指令 |
| 0 | 7 | 16bit前缀指令 | 必须匹配主指令或后缀指令才有含义。通常用于补充额外信息 |
| 1 | [0, 5] | 32bit主指令 | 允许单独定义特定语义的指令,并且可拼接前缀指令 |
| 1 | 6 | 32bit后缀指令 | 必须匹配前缀指令才有含义,单独后缀指令无含义 |
| 1 | 7 | 32bit前缀指令 | 必须匹配主指令或后缀指令才有含义。通常用于补充额外信息 |
通过上面几类指令的有效组合定义了48bit和64bit字长的指令编码方式:
- 48位指令:由一个
16位前缀拼接一个32位主指令或32位后缀指令构成。前缀部分主要用于扩展操作码和立即数的高位信息,从而满足长立即数加载和复杂内存操作的需求。 - 64位指令:由一个
32位前缀和一个32位主指令或32位后缀指令拼接而成,为更极端的复杂操作提供足够的编码空间。
不同字长指令详细的空间分配情况请见指令空间分配小节。