在 C 中实现 Type SB riscv 指令

问题描述 投票:0回答:1

我遇到了一些问题,我尝试将 32 位二进制文件解码为 RISCV 架构集中的 SB 型指令

我已经移动了操作码、imm、rs1、rs2 和 rd 值,但未能获得正确的 IMM 值

例如下面的 32 位二进制

11111110000001111001101011100011

立即值是-12,但是在我的实现中

  int type_sb_imm(unsigned char* p) {
    // Extract the 32-bit instruction from the byte array
    unsigned int opcode = (((unsigned int)p[0]) << 24) |
                          (((unsigned int)p[1]) << 16) |
                          (((unsigned int)p[2]) << 8) |
                          ((unsigned int)p[3]);

    // Extract the immediate value from the instruction (Type SB: branch)
    unsigned int uimm = ((opcode >> 7) & 0x1F) |            // imm[4:1]
                        ((opcode >> 20) & (0x7F << 5)) |    // imm[11:5]
                        ((opcode << 4) & (1 << 11)) |       // imm[12]
                        ((opcode << 19) & (0x1F << 12));    // imm[10:5]

    // Sign-extend the immediate value to 32 bits
    int imm = uimm;
    if (imm & 0x1000) {
        imm |= 0xFFFFE000;
    }

    return imm;
}

返回的立即数是4085,请问我哪里出错了?

c bit-manipulation riscv bitset
1个回答
0
投票

以最高评论为序...

创建一个使用表定义位的函数(例如):

imm = bitmask(opcode,31,25,5) | bitmask(opcode,11,7,0);

这是我快速完成的一些示例代码(因为您的时间压力)。我在

gdb
下运行它,我 认为 我得到了
mask
一代正确 - 但不能保证:

#include <stdio.h>

typedef unsigned int u32;

u32
bitmask(u32 opc,u32 bhi,u32 blo,u32 shfl)
{
    u32 val = opc >> blo;
    u32 mask = 0xFFFFFFFF >> 31 - (bhi - blo);
    val &= mask;
    val <<= shfl;
    return val;
}

int
main(void)
{

    u32 opc = 0xF0FFFF0A;
    u32 imm = 0;
    imm |= bitmask(opc,31,25,5);
    imm |= bitmask(opc,11,7,0);
    printf("%8.8X/%u\n",imm,imm);

    return 0;
}

请注意,如果您制作函数

inline
并且仅传递常量位值和移位,编译器优化器将生成高效代码。

© www.soinside.com 2019 - 2024. All rights reserved.