ysyx-org / jemu-decoder

The decoder library for jemu execution and web documentation
https://jemu.oscc.cc
MIT License
56 stars 16 forks source link

描述规范的建议:操作数的有无符号解释描述 #10

Closed x402 closed 2 years ago

x402 commented 2 years ago

RISC-V的寄存器操作数无论是按有符号还是无符号解释,长度都是XLEN,所以寄存器操作数不需要标注长度。 如RV32I,寄存器可以被解释为u32/s32。在RV64I中,32I作为64I的子集,指令是一样的,但寄存器操作数会被解释为u64/s64,而不是u32/s32。所以建议只标注u/s。如u'rs1 s'rs2。 RISC-V中立即数都是符号位扩展,所以不需要给立即数标注是按有符号还是无符号解释。同样立即数的符号扩展也是扩展至XLEN长度。 建议可以用[11:0]这样的格式表示位选择,用SEXT(x)表示x的有符号扩展。

示例: BGE

mask: '-----------------101-----1100011'

args:
  rs2: 24:20
  rs1: 19:15
  imm: [8:11, 25:30, 7, 31]

exec:
  pc: "s'rs1 >= s'rs2 ? pc + imm : pc + 4"

meta:
  encoding: S
  importance: NaN

bge

BGEU

mask: '-----------------111-----1100011'

args:
  rs2: 24:20
  rs1: 19:15
  imm: [8:11, 25:30, 7, 31]

exec:
  pc: "u'rs1 >= u'rs2 ? pc + imm : pc + 4"

meta:
  encoding: S
  importance: NaN

bgeu

ADDIW

mask: '-----------------000-----0011011'

args:
  rs1: 19:15
  rd: 11:7
  imm: 31:20

exec:
  rd: "SEXT((rs1 + imm)[31:0])"

meta:
  encoding: I
  importance: NaN

addiw

zhangyx1998 commented 2 years ago

前缀 s32 的意思是在运算是忽略该值的高32位,并根据它的第32位在高位填充 10u32 则会直接将该值的高32位填充为零。

如此设计的意图是为了尽量覆盖尽可能多的 use case, 减少根据源数据类型进行的推断,尽可能避免歧义。

例如:

不知道我有没有准确理解你的意思?

x402 commented 2 years ago

我的意思是遇到截短操作时(通常发生在RV64中带w的指令),用[31:0]的方式表示即可,然后符号扩展用SEXT( )表示,没有SEXT( )可以默认是零扩展。符号扩展/零扩展一般 用于对齐源、目的操作数长度(目的操作数长度比源操作数长),而u、s操作(如u'rs1 s'rs2)则用于对符号敏感的操作,如比较大小、乘除法等,此时无需关心扩展问题。

zhangyx1998 commented 2 years ago

可以用PR的方式描述一下你想要做的修改吗?

x402 commented 2 years ago

不知道u64、s32这样的格式是否和其他项目有关联(代码简洁,易于识别)?如果是有关联的话我的建议就欠考虑了

zhangyx1998 commented 2 years ago

不知道u64、s32这样的格式是否和其他项目有关联(代码简洁,易于识别)?如果是有关联的话我的建议就欠考虑了

我计划用状态转移模型构建一个基于指令集翻译的模拟器,但是目前缺少一些必要知识,所以还没有开工。

x402 commented 2 years ago

我觉得可以这样:状态转移模型分为读着可见和不可见两份,读者可见部分用更通俗易懂的语言来写(我上面提的建议),而不可见部分用让机器更容易识别的语言来写(方便其他项目读取)。读者可见部分等我补充完整之后提交PR看看

zhangyx1998 commented 2 years ago

好的