RiscV spec v2.1 Vol 1用户级ISA重复操作列表?

时间:2017-05-04 20:14:26

标签: specifications riscv

我不认为这是一个大问题,但我发现用于RV32I的操作码“SLLI,SRLI和SRAI”的重复条目和用户级ISA规范的RV64I指令集。这与表头“除了RV32I”相矛盾,并且看起来是重复错误。我指的是"Risc-V Instruction Set Manual/Volume I: User-Level ISA Version 2.1"pdf)中第9章“RV32 / 64G指令集列表”中的表格,其目的是仅列出每个操作码一次:

RV32I Base Instruction Set
0000000 shamt rs1 001 rd 0010011 SLLI
0000000 shamt rs1 101 rd 0010011 SRLI
0100000 shamt rs1 101 rd 0010011 SRAI
...

RV64I Base Instruction Set (in addition to RV32I)
000000 shamt rs1 001 rd 0010011 SLLI
000000 shamt rs1 101 rd 0010011 SRLI
010000 shamt rs1 101 rd 0010011 SRAI

由于我没有看到对此帖的任何回复 - 这是在RiscV规范中发布这些类型的小问题的正确论坛吗?

1 个答案:

答案 0 :(得分:1)

" Risc-V指令集手册/第I卷:用户级ISA版本2.1" https://content.riscv.org/wp-content/uploads/2016/06/riscv-spec-v2.1.pdf 在第9章列表中(pdf的第64页,文本的54):

RV32I Base Instruction Set
0000000 shamt rs1 001 rd 0010011 SLLI
0000000 shamt rs1 101 rd 0010011 SRLI
0100000 shamt rs1 101 rd 0010011 SRAI

然后在下一页

RV64I Base Instruction Set (in addition to RV32I)
000000 shamt rs1 001 rd 0010011 SLLI
000000 shamt rs1 101 rd 0010011 SRLI
010000 shamt rs1 101 rd 0010011 SRAI
0000000 shamt rs1 001 rd 0011011 SLLIW
0000000 shamt rs1 101 rd 0011011 SRLIW
0100000 shamt rs1 101 rd 0011011 SRAIW

在第38页(pdf)28(文本)中,说明了以下内容:

31 26 25 24 20 19 15 14 12 11 7 6 0
imm[11:6] imm[5]   imm[4:0]  rs1 funct3 rd  opcode
   6      1         5         5    3    5    7
000000   shamt[5] shamt[4:0] src SLLI  dest OP-IMM
000000   shamt[5] shamt[4:0] src SRLI  dest OP-IMM
010000   shamt[5] shamt[4:0] src SRAI  dest OP-IMM
000000     0      shamt[4:0] src SLLIW dest OP-IMM-32
000000     0      shamt[4:0] src SRLIW dest OP-IMM-32
010000     0      shamt[4:0] src SRAIW dest OP-IMM-32
  

SLLI 是逻辑左移(零移位到低位); SRLI 是逻辑右移(零移位到高位);并且 SRAI 是算术右移(原始符号位被复制到空出的高位)。对于RV32I,如果imm [5]!= 0,则 SLLI SRLI SRAI 会生成非法指令异常。    SLLIW SRLIW SRAIW 是仅限RV64I的指令,它们是类似定义的,但在32位值上运行并产生带符号的32位结果。如果imm [5]!= 0

,SLLIW,SRLIW和SRAIW会生成非法指令异常

因此,在32位模式和64位模式下,SLLI / SRLI / SRAI的行为有所不同。在32位模式下,它们具有5位shamt,在64位模式下,它们具有6位shamt。

  

这与此相矛盾

这不是。您刚刚没有计算/比较不同表中的imm值。在一个表中,它是0000000 shamt(7个零,5位shamt),在另一个表中是000000 shamt(6个零,6位shamt)。