0.34版本更新¶
日期:2023年12月6日
指令编码设计文档网页版路径请见LinxISA Encoding-v0.34
版本更新总体说明¶
- 增加13条浮点指令的实现。
- load/store指令的更新:(1)地址偏移移位类(scaled)load/store指令的拆分;(2)地址偏移不移位类(unscaled)load/store指令汇编名称修改(3)增加一条空store指令。
- 部分指令编码调整:(1)系统指令编码调整;(2)算数运算移位类指令编码调整;(3)部分模板块指令编码调整;(4)条件选择指令CSEL编码调整
- 部分指令汇编格式修改:(1)预取指令汇编格式中增加l1/l2/l3 Cache标识符;(2)模板块指令B.MCOPY和B.MSET汇编格式去掉目的寄存器
- CARG寄存器去除BSET/BGET/MSG域段,改为64bit寄存器。
修改一、增加浮点指令实现¶
浮点计算类
| 微指令 | 汇编格式 | 描述 |
|---|---|---|
| fadd | fadd{.d,.s,.h} SrcL, SrcR<, {=>, ->}RegDst> | 浮点加法 |
| fsub | fsub{.d,.s,.h} SrcL, SrcR<, {=>, ->}RegDst> | 浮点减法 |
| fmul | fmul{.d,.s,.h} SrcL, SrcR<, {=>, ->}RegDst> | 浮点乘法 |
| fmadd | fmadd{.d,.s,.h} SrcL, RSR, t#c<, {=>, ->}RegDst> | 浮点乘加 |
| fdiv | fdiv{.d,.s,.h} SrcL, SrcR<, {=>, ->}RegDst> | 浮点除法 |
| fabs | fabs{.d,.s,.h} SrcL<, {=>, ->}RegDst> | 浮点绝对值 |
| fsqrt | fsqrt{.d,.s,.h} SrcL<, {=>, ->}RegDst> | 浮点平方根 |
浮点转换类
| 微指令 | 汇编格式 | 描述 |
|---|---|---|
| fcvt | fcvt.dstT SrcL.srcT<, {=>, ->}RegDst> | 浮点转换 |
浮点比较类
| 微指令 | 汇编格式 | 描述 |
|---|---|---|
| feq | feq{.d,.s,.h} srcL, srcR<, {=>, ->}RegDst> | 浮点相等比较 |
| fle | fle{.d,.s,.h} srcL, srcR<, {=>, ->}RegDst> | 浮点小于等于比较 |
| flt | flt{.d,.s,.h} srcL, srcR<, {=>, ->}RegDst> | 浮点小于比较 |
最大最小值类
| 微指令 | 汇编格式 | 描述 |
|---|---|---|
| fmax | fmax{.d,.s,.h} srcL, srcR<, {=>, ->}RegDst> | 浮点最大值 |
| fmin | fmin{.d,.s,.h} srcL, srcR<, {=>, ->}RegDst> | 浮点最小值 |
修改二、Load/Store指令变动¶
1.对寻址偏移移位类(scaled模式)的load/store指令根据Reg + Reg和Reg + Imm两种编码格式拆分成两条指令。
Reg + Reg编码格式:保持原有的指令名称不变。Reg + Imm编码格式:在原有的指令名称中添加 "I",表明该指令是使用立即数偏移的load/store指令,增加一条指令。例如:LB -> LBI,SD -> SDI,LW.A -> LWI.A,SD.A -> SDI.A
Load指令的修改
| 原指令名称 | 拆分后指令名称 | 汇编示例 | 解释 |
|---|---|---|---|
| LB | LB LBI |
lb [a1, a2 << shamt] lbi [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + imm,默认不移位 |
| LH | LH LHI |
lh [a1, a2 << shamt] lhi [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + (imm << 1),默认左移1位 |
| LW | LW LWI |
lw [a1, a2 << shamt] lwi [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + (imm << 2),默认左移2位 |
| LD | LD LDI |
ld [a1, a2 << shamt] ldi [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + (imm << 3),默认左移3位 |
| LBU | LBU LBUI |
lbu [a1, a2 << shamt] lbui [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + imm,默认不移位 |
| LHU | LHU LHUI |
lhu [a1, a2 << shamt] lhui [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + (imm << 1),默认左移1位 |
| LWU | LWU LWUI |
lwu [a1, a2 << shamt] lwui [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + (imm << 2),默认左移2位 |
| LB.A | LB.A LBI.A |
lb.a [a1, a2 << shamt] lbi.a [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + imm,默认不移位 |
| LH.A | LH.A LHI.A |
lh.a [a1, a2 << shamt] lhi.a [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + (imm << 1),默认左移1位 |
| LW.A | LW.A LWI.A |
lw.a [a1, a2 << shamt] lwi.a [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + (imm << 2),默认左移2位 |
| LD.A | LD.A LDI.A |
ld.a [a1, a2 << shamt] ldi.a [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + (imm << 3),默认左移3位 |
| LBU.A | LBU.A LBUI.A |
lbu.a [a1, a2 << shamt] lbui.a [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + imm,默认不移位 |
| LHU.A | LHU.A LHUI.A |
lhu.a [a1, a2 << shamt] lhui.a [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + (imm << 1),默认左移1位 |
| LWU.A | LWU.A LWUI.A |
lwu.a [a1, a2 << shamt] lwui.a [a1, imm] |
访存地址为 a1 + (a2 << shamt),不固定移位 访存地址为 a1 + (imm << 2),默认左移2位 |
Store指令的修改
| 原指令名称 | 拆分后指令名称 | 汇编示例 | 解释 |
|---|---|---|---|
| SB | SB SBI |
sb a0, [a1, a2] sbi a0, [a1, imm] |
访存地址为a1 + a2,默认不移位 访存地址为 a1 + imm,默认不移位 |
| SH | SH SHI |
sh a0, [a1, a2] shi a0, [a1, imm] |
访存地址为a1 + (a2 << 1),默认左移1位 访存地址为 a1 + (imm << 1),默认左移1位 |
| SW | SW SWI |
sw a0, [a1, a2] swi a0, [a1, imm] |
访存地址为a1 + (a2 << 2),默认左移2位 访存地址为 a1 + (imm << 2),默认左移2位 |
| SD | SD SDI |
sd a0, [a1, a2] sdi a0, [a1, imm] |
访存地址为a1 + (a2 << 3),默认左移3位 访存地址为 a1 + (imm << 3),默认左移3位 |
| SB.A | SB.A SBI.A |
sb.a a0, [a1, a2] sbi.a a0, [a1, imm] |
访存地址为a1 + a2,默认不移位 访存地址为 a1 + imm,默认不移位 |
| SH.A | SH.A SHI.A |
sh.a a0, [a1, a2] shi.a a0, [a1, imm] |
访存地址为a1 + (a2 << 1),默认左移1位 访存地址为 a1 + (imm << 1),默认左移1位 |
| SW.A | SW.A SWI.A |
sw.a a0, [a1, a2] swi.a a0, [a1, imm] |
访存地址为a1 + (a2 << 2),默认左移2位 访存地址为 a1 + (imm << 2),默认左移2位 |
| SD.A | SD.A SDI.A |
sd.a a0, [a1, a2] sdi.a a0, [a1, imm] |
访存地址为a1 + (a2 << 3),默认左移3位 访存地址为 a1 + (imm << 3),默认左移3位 |
2.为了命名格式的统一,修改寻址偏移不移位类(unscaled模式)的load/store指令名称。
Load指令的修改
| 原指令名称 | 修改后的名称 | 汇编示例 | 解释 |
|---|---|---|---|
| LH.UI | LHI.U | lhi.u [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| LW.UI | LWI.U | lwi.u [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| LD.UI | LDI.U | ldi.u [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| LHU.UI | LHUI.U | lhui.u [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| LWU.UI | LWUI.U | lwui.u [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| PRF.UI | PRFI.U | prfi.u.l1 [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| LB.UIA | LBI.UA | lbi.ua [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| LH.UIA | LHI.UA | lhi.ua [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| LW.UIA | LWI.UA | lwi.ua [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| LD.UIA | LDI.UA | ldi.ua [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| LHU.UIA | LHUI.UA | lhui.ua [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| LWU.UIA | LWUI.UA | lwui.ua [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| PRF.UIA | PRFI.UA | prfi.ua.l1 [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
Store指令的修改
| 原指令名称 | 修改后的名称 | 汇编示例 | 解释 |
|---|---|---|---|
| SH.UR | SH.U | sh.u a0, [a1, a2] | 访存地址为 a1 + a2,不做默认移位 |
| SW.UR | SW.U | sw.u a0, [a1, a2] | 访存地址为 a1 + a2,不做默认移位 |
| SD.UR | SD.U | sd.u a0, [a1, a2] | 访存地址为 a1 + a2,不做默认移位 |
| SH.URA | SH.UA | sh.ua a0, [a1, a2] | 访存地址为 a1 + a2,不做默认移位 |
| SW.URA | SW.UA | sw.ua a0, [a1, a2] | 访存地址为 a1 + a2,不做默认移位 |
| SD.URA | SD.UA | sd.ua a0, [a1, a2] | 访存地址为 a1 + a2,不做默认移位 |
| SH.UI | SHI.U | shi.u a0, [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| SW.UI | SWI.U | swi.u a0, [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| SD.UI | SDI.U | sdi.u a0, [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| SH.UIA | SHI.UA | shi.ua a0, [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| SW.UIA | SWI.UA | swi.ua a0, [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
| SD.UIA | SDI.UA | sdi.ua a0, [a1, imm] | 访存地址为 a1 + imm,不做默认移位 |
3.增加一条store指令SNOP(Store NOP)
该store指令不写内存,只占Store Buffer Entry(配合BSBAR内存写屏障块指令使用)。
指令编码如下:

修改三、指令编码调整¶
系统块指令编码调整¶
为了方便硬件解码实现以及规范编解码格式,我们希望使用立即数的指令编码中Opcode域段最低位为 1。因此对系统指令包括SSRGET,SSRSET,SSRCRLT(及其展开指令)的编码进行了调整。
具体来讲:将Opcode从原来的 7'b100_0000 改为 7'b100_0001。
更新后的编码:

移位指令编码调整¶
为了完善指令编解码格式的规范性,首先对移位指令的高位进行了更加明确地域段划分,同时SRA{I,W,IW}指令与SRL{I,W,IW}指令的func字段(编码的12-14bit)使用了相同的编码,并在高位的func字段进行区分,这样可以为以后版本添加移位类指令预留空间。SLL{I,W,IW}指令的func字段(编码的12-14bit)做了顺延的修改。
修改前的编码:

修改后的编码:

模板块指令编码调整¶
在当前版本中,B.MCOPY和B.MSET在执行过程中被打断时状态的保存可使用异常块来实现,因此这两条指令不需要输出寄存器的编码。所以删除了B.MCOPY和B.MSET指令编码中RegDst0- RegDst2域段,改为占位值4’b0000。
修改前的编码:

修改后的编码:

在上个版本中,模板块的立即数编码为15bit(低三位为0),但是在指令实现时15bit的立即数无法在一条微指令中表达,因此修改了模板块的实现方式。当立即数有效位超过12bit时,使用三条指令组合的形式,拼接出块头中的长立即数。既然实现方式修改后可以处理超过12位的立即数,那么不如同时扩展立即数的范围,将块指令编码的16-31bit都编码为立即数,这样可以表达19bit的立即数,指令可使用的栈空间更大。因此,对模板块fentry, fexit, ftexit三条块指令编码的立即数域段做出调整。
修改前的编码:

修改后的编码:

块指令编码修改后,块头中立即数可表达19bit的立即数(低三位默认为0)。当块头表达的立即数有效位超过12位时,使用多条指令组合的形式拼接出块头表达的长立即数。下面以F.ENTRY指令为例说明此次修改:
- 修改前的执行方式:
- 修改后的执行方式:
控制块指令编码调整¶
BLBAR块指令编码调整¶
BLBAR块头的编码格式中,BInst[63:32]的高16bit用于编码块指令的输入,低16bit用于编码块指令的输出。为了统一编码格式,将LoadBase0域段编码改到BInst[51:48]位置,改名为RegPtr,该域段用于存储第一层架构寄存器ID,索引第一层架构寄存器R0-R15。
同时,该指令预取size都是以一条Cacheline(64byte)为单位,因此将原块头编码中BlockSize域段改为固定编码2'b01。
编码更新前:

编码更新后:

BSBAR块指令编码调整¶
编码更新前:

编码更新后:

注意
为了消除没有store指令前的BSBAR块:BSBAR 0格式的块,减少硬件BROB的占用,该指令禁止store_count为0。
CSEL/ADDC/SUBC指令编码调整¶
CSEL/ADDC/SUBC指令是三输入的指令。为了简化硬件的读口设计,以前的版本中,在指令设计层面将第三个源寄存器限制为T寄存器,第二个源寄存器限制为Local GPR,第一个源寄存器没有限制。从而达到最多同时有两个T寄存器输入或最多两个Local Reg寄存器输入的目的。
在当前版本,在指令编码层面,取消了第二个源寄存器固定为Local GPR的限制,即第二个源寄存器既可以是T寄存器,也可以是Local GPR。
以前版本编码:

当前版本编码:

修改四、汇编格式的修改¶
1.微指令汇编格式的修改
在前面的版本中,预取指令prf和prf.a编码格式增加了model字段,用来指示指令预取到的哪一层级的Cache,但是汇编格式上并没有做修改。为了汇编程序员能够明确指明指令预取的cache层级,因此在prf和prf.a两条指令的汇编名称后增加了 “.l1/.l2/.l3” 的后缀。而prfi.u和prfi.ua指令默认预取到L1 Cache,为了格式统一,在这两条指令的汇编名称后增加了 “.l1” 的后缀。修改后的汇编格式如下表:
| 指令 | 原汇编格式 | 修改后的汇编格式 |
|---|---|---|
| prf | prf [SrcL, srcR<{.sw,.uw}><< |
prf{.l1,.l2,.l3} [SrcL, SrcR<{.sw,.uw}><< |
| prf.a | prf [SrcL, SrcR<{.sw,.uw}><< |
prf.a{.l1,.l2,.l3} [SrcL, SrcR<{.sw,.uw}><< |
| prfi.u | prfi.u [SrcL, simm] | prfi.u.l1 [SrcL, simm] |
| prfi.ua | prfi.ua [SrcL, simm]<, {=>, ->}RegDst> | prfi.ua.l1 [SrcL, simm]<, {=>, ->}RegDst> |
2.块指令汇编格式修改
同上面所讲,模板块B.MCOPY和B.MSET指令的编码中删除了RegDst0-RegDst2的字段,因此汇编格式中同样去掉RegDst0-RegDst2的表达。
B.MCOPY修改后:
B.MSET修改后:修改五、CARG系统寄存器修改¶
- CARG寄存器删除了MSG/BGET/BSET域段。
- setc.msg指令需要使用别名指令BSE代替。
- 块内BGET/BSET状态的保存在当前版本使用B.EXCEPTION异常块实现。
- 块内发送的消息保存在消息缓存寄存器中。
以前版本寄存器域段:

当前版本寄存器域段:
