@samitouri / QOSamiQemu / commits / dacaa5412b

disas/riscv: Use extract helpers for operand fields

Replace shift-based operand extraction with extract32() and sextract32(). For signed immediates, use sextract32() on the field that carries the sign bit and combine it with the remaining extract32() fields. The RISC-V disassembler currently follows target/riscv/internals.h: insn_len() and decodes only 16-bit or 32-bit instruction lengths, so the converted fields are all in the low 32 bits of rv_inst. Suggested-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: TANG Tiancheng <lyndra@linux.alibaba.com> Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20260703-b4-disas-xthead-fix-riscv-next-v4-5-84c566330bc7@linux.alibaba.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

TANG Tiancheng committed Jul 3, 2026 at 13:03 UTC dacaa5412b93cc67782decf5e586cc239fce0918
1 file changed +107 -107
disas/riscv.c
+107 -107
@@ -4202,82 +4202,82 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
4202
4203 static uint32_t operand_rd(rv_inst inst)
4204 {
4205 - return (inst << 52) >> 59;
4205 + return extract32(inst, 7, 5);
4206 }
4207
4208 static uint32_t operand_rs1(rv_inst inst)
4209 {
4210 - return (inst << 44) >> 59;
4210 + return extract32(inst, 15, 5);
4211 }
4212
4213 static uint32_t operand_rs2(rv_inst inst)
4214 {
4215 - return (inst << 39) >> 59;
4215 + return extract32(inst, 20, 5);
4216 }
4217
4218 static uint32_t operand_rs3(rv_inst inst)
4219 {
4220 - return (inst << 32) >> 59;
4220 + return extract32(inst, 27, 5);
4221 }
4222
4223 static uint32_t operand_aq(rv_inst inst)
4224 {
4225 - return (inst << 37) >> 63;
4225 + return extract32(inst, 26, 1);
4226 }
4227
4228 static uint32_t operand_rl(rv_inst inst)
4229 {
4230 - return (inst << 38) >> 63;
4230 + return extract32(inst, 25, 1);
4231 }
4232
4233 static uint32_t operand_pred(rv_inst inst)
4234 {
4235 - return (inst << 36) >> 60;
4235 + return extract32(inst, 24, 4);
4236 }
4237
4238 static uint32_t operand_succ(rv_inst inst)
4239 {
4240 - return (inst << 40) >> 60;
4240 + return extract32(inst, 20, 4);
4241 }
4242
4243 static uint32_t operand_rm(rv_inst inst)
4244 {
4245 - return (inst << 49) >> 61;
4245 + return extract32(inst, 12, 3);
4246 }
4247
4248 static uint32_t operand_shamt5(rv_inst inst)
4249 {
4250 - return (inst << 39) >> 59;
4250 + return extract32(inst, 20, 5);
4251 }
4252
4253 static uint32_t operand_shamt6(rv_inst inst)
4254 {
4255 - return (inst << 38) >> 58;
4255 + return extract32(inst, 20, 6);
4256 }
4257
4258 static uint32_t operand_shamt7(rv_inst inst)
4259 {
4260 - return (inst << 37) >> 57;
4260 + return extract32(inst, 20, 7);
4261 }
4262
4263 static uint32_t operand_crdq(rv_inst inst)
4264 {
4265 - return (inst << 59) >> 61;
4265 + return extract32(inst, 2, 3);
4266 }
4267
4268 static uint32_t operand_crs1q(rv_inst inst)
4269 {
4270 - return (inst << 54) >> 61;
4270 + return extract32(inst, 7, 3);
4271 }
4272
4273 static uint32_t operand_crs1rdq(rv_inst inst)
4274 {
4275 - return (inst << 54) >> 61;
4275 + return extract32(inst, 7, 3);
4276 }
4277
4278 static uint32_t operand_crs2q(rv_inst inst)
4279 {
4280 - return (inst << 59) >> 61;
4280 + return extract32(inst, 2, 3);
4281 }
4282
4283 static uint32_t calculate_xreg(uint32_t sreg)
@@ -4287,80 +4287,80 @@ static uint32_t calculate_xreg(uint32_t sreg)
4287
4288 static uint32_t operand_sreg1(rv_inst inst)
4289 {
4290 - return calculate_xreg((inst << 54) >> 61);
4290 + return calculate_xreg(extract32(inst, 7, 3));
4291 }
4292
4293 static uint32_t operand_sreg2(rv_inst inst)
4294 {
4295 - return calculate_xreg((inst << 59) >> 61);
4295 + return calculate_xreg(extract32(inst, 2, 3));
4296 }
4297
4298 static uint32_t operand_crd(rv_inst inst)
4299 {
4300 - return (inst << 52) >> 59;
4300 + return extract32(inst, 7, 5);
4301 }
4302
4303 static uint32_t operand_crs1(rv_inst inst)
4304 {
4305 - return (inst << 52) >> 59;
4305 + return extract32(inst, 7, 5);
4306 }
4307
4308 static uint32_t operand_crs1rd(rv_inst inst)
4309 {
4310 - return (inst << 52) >> 59;
4310 + return extract32(inst, 7, 5);
4311 }
4312
4313 static uint32_t operand_crs2(rv_inst inst)
4314 {
4315 - return (inst << 57) >> 59;
4315 + return extract32(inst, 2, 5);
4316 }
4317
4318 static uint32_t operand_cimmsh5(rv_inst inst)
4319 {
4320 - return (inst << 57) >> 59;
4320 + return extract32(inst, 2, 5);
4321 }
4322
4323 static uint32_t operand_csr12(rv_inst inst)
4324 {
4325 - return (inst << 32) >> 52;
4325 + return extract32(inst, 20, 12);
4326 }
4327
4328 static int32_t operand_imm12(rv_inst inst)
4329 {
4330 - return ((int64_t)inst << 32) >> 52;
4330 + return sextract32(inst, 20, 12);
4331 }
4332
4333 static int32_t operand_imm20(rv_inst inst)
4334 {
4335 - return (((int64_t)inst << 32) >> 44) << 12;
4335 + return sextract32(inst, 12, 20) << 12;
4336 }
4337
4338 static int32_t operand_jimm20(rv_inst inst)
4339 {
4340 - return (((int64_t)inst << 32) >> 63) << 20 |
4341 - ((inst << 33) >> 54) << 1 |
4342 - ((inst << 43) >> 63) << 11 |
4343 - ((inst << 44) >> 56) << 12;
4340 + return sextract32(inst, 31, 1) << 20 |
4341 + extract32(inst, 21, 10) << 1 |
4342 + extract32(inst, 20, 1) << 11 |
4343 + extract32(inst, 12, 8) << 12;
4344 }
4345
4346 static int32_t operand_simm12(rv_inst inst)
4347 {
4348 - return (((int64_t)inst << 32) >> 57) << 5 |
4349 - (inst << 52) >> 59;
4348 + return sextract32(inst, 25, 7) << 5 |
4349 + extract32(inst, 7, 5);
4350 }
4351
4352 static int32_t operand_sbimm12(rv_inst inst)
4353 {
4354 - return (((int64_t)inst << 32) >> 63) << 12 |
4355 - ((inst << 33) >> 58) << 5 |
4356 - ((inst << 52) >> 60) << 1 |
4357 - ((inst << 56) >> 63) << 11;
4354 + return sextract32(inst, 31, 1) << 12 |
4355 + extract32(inst, 25, 6) << 5 |
4356 + extract32(inst, 8, 4) << 1 |
4357 + extract32(inst, 7, 1) << 11;
4358 }
4359
4360 static uint32_t operand_cimmshl6(rv_inst inst, rv_isa isa)
4361 {
4362 - int imm = ((inst << 51) >> 63) << 5 |
4363 - (inst << 57) >> 59;
4362 + int imm = extract32(inst, 12, 1) << 5 |
4363 + extract32(inst, 2, 5);
4364 if (isa == rv128) {
4365 imm = imm ? imm : 64;
4366 }
@@ -4369,8 +4369,8 @@ static uint32_t operand_cimmshl6(rv_inst inst, rv_isa isa)
4369
4370 static uint32_t operand_cimmshr6(rv_inst inst, rv_isa isa)
4371 {
4372 - int imm = ((inst << 51) >> 63) << 5 |
4373 - (inst << 57) >> 59;
4372 + int imm = extract32(inst, 12, 1) << 5 |
4373 + extract32(inst, 2, 5);
4374 if (isa == rv128) {
4375 imm = imm | (imm & 32) << 1;
4376 imm = imm ? imm : 64;
@@ -4380,116 +4380,116 @@ static uint32_t operand_cimmshr6(rv_inst inst, rv_isa isa)
4380
4381 static int32_t operand_cimmi(rv_inst inst)
4382 {
4383 - return (((int64_t)inst << 51) >> 63) << 5 |
4384 - (inst << 57) >> 59;
4383 + return sextract32(inst, 12, 1) << 5 |
4384 + extract32(inst, 2, 5);
4385 }
4386
4387 static int32_t operand_cimmui(rv_inst inst)
4388 {
4389 - return (((int64_t)inst << 51) >> 63) << 17 |
4390 - ((inst << 57) >> 59) << 12;
4389 + return sextract32(inst, 12, 1) << 17 |
4390 + extract32(inst, 2, 5) << 12;
4391 }
4392
4393 static uint32_t operand_cimmlwsp(rv_inst inst)
4394 {
4395 - return ((inst << 51) >> 63) << 5 |
4396 - ((inst << 57) >> 61) << 2 |
4397 - ((inst << 60) >> 62) << 6;
4395 + return extract32(inst, 12, 1) << 5 |
4396 + extract32(inst, 4, 3) << 2 |
4397 + extract32(inst, 2, 2) << 6;
4398 }
4399
4400 static uint32_t operand_cimmldsp(rv_inst inst)
4401 {
4402 - return ((inst << 51) >> 63) << 5 |
4403 - ((inst << 57) >> 62) << 3 |
4404 - ((inst << 59) >> 61) << 6;
4402 + return extract32(inst, 12, 1) << 5 |
4403 + extract32(inst, 5, 2) << 3 |
4404 + extract32(inst, 2, 3) << 6;
4405 }
4406
4407 static uint32_t operand_cimmlqsp(rv_inst inst)
4408 {
4409 - return ((inst << 51) >> 63) << 5 |
4410 - ((inst << 57) >> 63) << 4 |
4411 - ((inst << 58) >> 60) << 6;
4409 + return extract32(inst, 12, 1) << 5 |
4410 + extract32(inst, 6, 1) << 4 |
4411 + extract32(inst, 2, 4) << 6;
4412 }
4413
4414 static int32_t operand_cimm16sp(rv_inst inst)
4415 {
4416 - return (((int64_t)inst << 51) >> 63) << 9 |
4417 - ((inst << 57) >> 63) << 4 |
4418 - ((inst << 58) >> 63) << 6 |
4419 - ((inst << 59) >> 62) << 7 |
4420 - ((inst << 61) >> 63) << 5;
4416 + return sextract32(inst, 12, 1) << 9 |
4417 + extract32(inst, 6, 1) << 4 |
4418 + extract32(inst, 5, 1) << 6 |
4419 + extract32(inst, 3, 2) << 7 |
4420 + extract32(inst, 2, 1) << 5;
4421 }
4422
4423 static int32_t operand_cimmj(rv_inst inst)
4424 {
4425 - return (((int64_t)inst << 51) >> 63) << 11 |
4426 - ((inst << 52) >> 63) << 4 |
4427 - ((inst << 53) >> 62) << 8 |
4428 - ((inst << 55) >> 63) << 10 |
4429 - ((inst << 56) >> 63) << 6 |
4430 - ((inst << 57) >> 63) << 7 |
4431 - ((inst << 58) >> 61) << 1 |
4432 - ((inst << 61) >> 63) << 5;
4425 + return sextract32(inst, 12, 1) << 11 |
4426 + extract32(inst, 11, 1) << 4 |
4427 + extract32(inst, 9, 2) << 8 |
4428 + extract32(inst, 8, 1) << 10 |
4429 + extract32(inst, 7, 1) << 6 |
4430 + extract32(inst, 6, 1) << 7 |
4431 + extract32(inst, 3, 3) << 1 |
4432 + extract32(inst, 2, 1) << 5;
4433 }
4434
4435 static int32_t operand_cimmb(rv_inst inst)
4436 {
4437 - return (((int64_t)inst << 51) >> 63) << 8 |
4438 - ((inst << 52) >> 62) << 3 |
4439 - ((inst << 57) >> 62) << 6 |
4440 - ((inst << 59) >> 62) << 1 |
4441 - ((inst << 61) >> 63) << 5;
4437 + return sextract32(inst, 12, 1) << 8 |
4438 + extract32(inst, 10, 2) << 3 |
4439 + extract32(inst, 5, 2) << 6 |
4440 + extract32(inst, 3, 2) << 1 |
4441 + extract32(inst, 2, 1) << 5;
4442 }
4443
4444 static uint32_t operand_cimmswsp(rv_inst inst)
4445 {
4446 - return ((inst << 51) >> 60) << 2 |
4447 - ((inst << 55) >> 62) << 6;
4446 + return extract32(inst, 9, 4) << 2 |
4447 + extract32(inst, 7, 2) << 6;
4448 }
4449
4450 static uint32_t operand_cimmsdsp(rv_inst inst)
4451 {
4452 - return ((inst << 51) >> 61) << 3 |
4453 - ((inst << 54) >> 61) << 6;
4452 + return extract32(inst, 10, 3) << 3 |
4453 + extract32(inst, 7, 3) << 6;
4454 }
4455
4456 static uint32_t operand_cimmsqsp(rv_inst inst)
4457 {
4458 - return ((inst << 51) >> 62) << 4 |
4459 - ((inst << 53) >> 60) << 6;
4458 + return extract32(inst, 11, 2) << 4 |
4459 + extract32(inst, 7, 4) << 6;
4460 }
4461
4462 static uint32_t operand_cimm4spn(rv_inst inst)
4463 {
4464 - return ((inst << 51) >> 62) << 4 |
4465 - ((inst << 53) >> 60) << 6 |
4466 - ((inst << 57) >> 63) << 2 |
4467 - ((inst << 58) >> 63) << 3;
4464 + return extract32(inst, 11, 2) << 4 |
4465 + extract32(inst, 7, 4) << 6 |
4466 + extract32(inst, 6, 1) << 2 |
4467 + extract32(inst, 5, 1) << 3;
4468 }
4469
4470 static uint32_t operand_cimmw(rv_inst inst)
4471 {
4472 - return ((inst << 51) >> 61) << 3 |
4473 - ((inst << 57) >> 63) << 2 |
4474 - ((inst << 58) >> 63) << 6;
4472 + return extract32(inst, 10, 3) << 3 |
4473 + extract32(inst, 6, 1) << 2 |
4474 + extract32(inst, 5, 1) << 6;
4475 }
4476
4477 static uint32_t operand_cimmd(rv_inst inst)
4478 {
4479 - return ((inst << 51) >> 61) << 3 |
4480 - ((inst << 57) >> 62) << 6;
4479 + return extract32(inst, 10, 3) << 3 |
4480 + extract32(inst, 5, 2) << 6;
4481 }
4482
4483 static uint32_t operand_cimmq(rv_inst inst)
4484 {
4485 - return ((inst << 51) >> 62) << 4 |
4486 - ((inst << 53) >> 63) << 8 |
4487 - ((inst << 57) >> 62) << 6;
4485 + return extract32(inst, 11, 2) << 4 |
4486 + extract32(inst, 10, 1) << 8 |
4487 + extract32(inst, 5, 2) << 6;
4488 }
4489
4490 static int32_t operand_vimm(rv_inst inst)
4491 {
4492 - return (int64_t)(inst << 44) >> 59;
4492 + return sextract32(inst, 15, 5);
4493 }
4494
4495 static uint32_t operand_vuimm(rv_inst inst)
@@ -4499,54 +4499,54 @@ static uint32_t operand_vuimm(rv_inst inst)
4499
4500 static uint32_t operand_vzimm11(rv_inst inst)
4501 {
4502 - return (inst << 33) >> 53;
4502 + return extract32(inst, 20, 11);
4503 }
4504
4505 static uint32_t operand_vzimm10(rv_inst inst)
4506 {
4507 - return (inst << 34) >> 54;
4507 + return extract32(inst, 20, 10);
4508 }
4509
4510 static uint32_t operand_vzimm6(rv_inst inst)
4511 {
4512 - return ((inst << 37) >> 63) << 5 |
4513 - ((inst << 44) >> 59);
4512 + return extract32(inst, 26, 1) << 5 |
4513 + extract32(inst, 15, 5);
4514 }
4515
4516 static uint32_t operand_bs(rv_inst inst)
4517 {
4518 - return (inst << 32) >> 62;
4518 + return extract32(inst, 30, 2);
4519 }
4520
4521 static uint32_t operand_rnum(rv_inst inst)
4522 {
4523 - return (inst << 40) >> 60;
4523 + return extract32(inst, 20, 4);
4524 }
4525
4526 static uint32_t operand_vm(rv_inst inst)
4527 {
4528 - return (inst << 38) >> 63;
4528 + return extract32(inst, 25, 1);
4529 }
4530
4531 static uint32_t operand_uimm_c_lb(rv_inst inst)
4532 {
4533 - return (((inst << 58) >> 63) << 1) |
4534 - ((inst << 57) >> 63);
4533 + return extract32(inst, 5, 1) << 1 |
4534 + extract32(inst, 6, 1);
4535 }
4536
4537 static uint32_t operand_uimm_c_lh(rv_inst inst)
4538 {
4539 - return (((inst << 58) >> 63) << 1);
4539 + return extract32(inst, 5, 1) << 1;
4540 }
4541
4542 static uint32_t operand_zcmp_spimm(rv_inst inst)
4543 {
4544 - return ((inst << 60) >> 62) << 4;
4544 + return extract32(inst, 2, 2) << 4;
4545 }
4546
4547 static uint32_t operand_zcmp_rlist(rv_inst inst)
4548 {
4549 - return ((inst << 56) >> 60);
4549 + return extract32(inst, 4, 4);
4550 }
4551
4552 static uint32_t operand_imm6(rv_inst inst)
@@ -4556,17 +4556,17 @@ static uint32_t operand_imm6(rv_inst inst)
4556
4557 static uint32_t operand_imm2(rv_inst inst)
4558 {
4559 - return (inst << 37) >> 62;
4559 + return extract32(inst, 25, 2);
4560 }
4561
4562 static uint32_t operand_immh(rv_inst inst)
4563 {
4564 - return (inst << 32) >> 58;
4564 + return extract32(inst, 26, 6);
4565 }
4566
4567 static uint32_t operand_imml(rv_inst inst)
4568 {
4569 - return (inst << 38) >> 58;
4569 + return extract32(inst, 20, 6);
4570 }
4571
4572 static uint32_t calculate_stack_adj(rv_isa isa, uint32_t rlist, uint32_t spimm)
@@ -4585,12 +4585,12 @@ static uint32_t operand_zcmp_stack_adj(rv_inst inst, rv_isa isa)
4585
4586 static uint32_t operand_tbl_index(rv_inst inst)
4587 {
4588 - return ((inst << 54) >> 56);
4588 + return extract32(inst, 2, 8);
4589 }
4590
4591 static uint32_t operand_lpl(rv_inst inst)
4592 {
4593 - return inst >> 12;
4593 + return extract32(inst, 12, 20);
4594 }
4595
4596 /* decode operands */