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
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
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
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
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
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
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 */