Первые 7 бит представляют код операции инструкции. И исходный код github, и pdf содержат один и тот же код операции для ADD. 0x0C = 0000_1100 бинарный. Но источник GitHub говорит 5 бит (6..2), поэтому 0x0C = 01100 двоичный. Первые 2 бита любого действительного кода операции всегда 11 двоичных. Соедините 01100 11 вместе, и вы получите 0110011 двоичный, 51 десятичный.
Визуально (с левосторонним сдвигом, затем ИЛИ):
01100 11 -> ADD Opcode
----- --
0x0C 3 -> 0x0C << 2 | 3 -> 12*4 + 3 = 51
Инструкции с одним и тем же кодом операции, например BEQ и BNE, оба с кодом операции 1100011 = BRANCH, будут иметь другое поле, которое дополнительно определяет функцию инструкции. Таким образом, код операции BRANCH 1100011 группирует все инструкции ветвления. Чтобы отличить BEQ (равная ветвь) от BNE (не равная ветвь), вам нужно взглянуть на поле funct3. BEQ имеет funct3 = 000, BNE имеет funct3 = 001. Поле funct3 однозначно идентифицирует функцию команды BRANCH (1100011): BEQ, BNE, BLT, BGE, BLTU, BGEU).
Некоторые инструкции, такие как LUI, однозначно идентифицируются кодом операции и поэтому не нуждаются в поле funct3. Другие инструкции, например, с кодом операции OP (0110011), нуждаются в поле funct3 вместе с полем funct7. Обратите внимание, что ADD и SUB имеют одинаковый код операции (OP = 0110011) и один и тот же funct3 (000), поэтому поле funct7 является дифференциатором. ADC funct7 равен 0000000, а SUB funct7 - 0100000.
В начале главы 19 RISC-V Spec показана таблица со всеми действительными OPCODES и их двоичным значением. Помните, что первые 2 бита каждого OPCODE равны 11, это исключено из таблицы. Например, посмотрите на таблицу find STORE, если мы хотим узнать код операции STORE, отсканируем влево до столбца inst [6: 5] и вы обнаружите 01. отсканируйте строку STORE до inst [4: 2] и найдите 000. Из этого мы можем построить код операции STORE 01 000 11 -> 0100011. Все инструкции STORE (SB, SH, SW) будут иметь код операции 0100011. Чтобы выяснить, является ли инструкция SB, SH или SW, посмотрите на поле funct3 000 = SB, 001 = SH, 010 = SW.