BSET

RISC-V BSET 指令详解

指令手册R-type

单比特置位(寄存器指定位索引)

指令语法

bset rd, rs1, rs2

rd、rs1 选择 x0–x31;源读取写回前的值,写入 x0 被丢弃。

rs2 选择索引寄存器;仅取 RV32 的低 5 位或 RV64 的低 6 位,其余位忽略。

要求 RV32/RV64 Zbs 1.0;将所选位设为 1,其余位保持 rs1 原值;原本为 1 时数值不变。

Zbs位操作单比特操作

指令行为说明

bset 是 Zbs 单比特置位指令,位索引来自 rs2 的低 log2(XLEN) 位。

BSET 指令解析与执行动画

从机器码字段解析开始,依次展示操作数读取、该指令专属语义计算和 ISA 可见状态更新。

rd
rs1
rs2
bset
,
,
执行环境

本例使用固定寄存器初值和初始 PC=0x2000;取指成功,没有异步中断或额外扩展检查。异常分支只显示普通提交停止,陷入后的 PC 和处理程序状态由 EEI 决定。

a0(x10)
0x00001000
a6(x16)
0xFFFFFFF0
31..25
24..20
19..15
14..12
11..7
6..0
0010100
funct7
10000
rs2
01010
rs1
001
funct3
00101
rd
0110011
opcode
执行数据路径
instruction
0x290512B3
opcode
0110011 -> OP
funct3
001 -> BSET
funct7
0010100 -> single-bit operation selector
rd / rs1 / rs2
t0(x5) / a0(x10)=0x00001000 / a6(x16)=0xFFFFFFF0
rs2[4:0]
0xFFFFFFF0 & 31 -> index=16
single-bit set
尚未计算
x5
t0(x5) = 0x00003001; pc = 0x00002000
当前步骤

概念步骤:拿到 32-bit 指令编码

机器码按当前指令格式切成字段,动画从 encoding/decode 开始。

encoding: 0x290512B3
syntax : bset t0(x5), a0(x10), a6(x16)
待提交结果: 尚未计算
当前架构状态
t0(x5) = 0x00003001; pc = 0x00002000

该动画展示 ISA 可见的解码和状态变化,不表示任何特定 CPU 的流水线、缓存、预测或时序实现。

快速理解与检索要点

bset 是 Zbs 单比特置位指令,位索引来自 rs2 的低 log2(XLEN) 位。

本指令属于 Zbs 1.0,适用于 RV32 和 RV64;数据操作使用 XLEN 位整数寄存器。
寄存器索引形式只使用 rs2 的低 log2(XLEN) 位选择目标 bit。
bset 将选中的位设为 1,其余位保持 rs1 原值;该位原本为 1 时数值不变。

常见使用场景

位操作与掩码

RV32/RV64 Zbs,x11=0、x12=35:RV32 索引为 3,x10=0x8;RV64 索引为 35,x10=0x800000000。

使用前检查清单

语法检查
  • rd、rs1 选择 x0–x31;源读取写回前的值,写入 x0 被丢弃。
  • rs2 选择索引寄存器;仅取 RV32 的低 5 位或 RV64 的低 6 位,其余位忽略。
语义检查
  • 要求 RV32/RV64 Zbs 1.0;将所选位设为 1,其余位保持 rs1 原值;原本为 1 时数值不变。

容易混淆 / 常见误区

寄存器索引形式只使用 rs2 的低 log2(XLEN) 位选择目标 bit。
bset 将选中的位设为 1,其余位保持 rs1 原值;该位原本为 1 时数值不变。

常见问题

bset 会访问内存吗?

不访问数据内存。数据操作读取整数寄存器并将结果写入 rd;rd=x0 时结果被丢弃。

bset 的 bit 索引如何确定?

使用 rs2 的低 log2(XLEN) 位,因此超出范围的高位不会扩大索引范围。