@@ -65,6 +65,12 @@ static const ArgumentDesc arg_desc_list[] = {
65
65
ArgumentDesc (' s' , ' g' , 0 , 0x1f , { { { 5 , 15 } }, 0 }),
66
66
// Source register 2 (rs2/rt)
67
67
ArgumentDesc (' t' , ' g' , 0 , 0x1f , { { { 5 , 20 } }, 0 }),
68
+ // Float destination register (rd)
69
+ ArgumentDesc (' D' , ' f' , 0 , 0x1f , { { { 5 , 7 } }, 0 }),
70
+ // Float source register 1 (rs1/rs)
71
+ ArgumentDesc (' S' , ' f' , 0 , 0x1f , { { { 5 , 15 } }, 0 }),
72
+ // Float source register 1 (rs1/rs)
73
+ ArgumentDesc (' T' , ' f' , 0 , 0x1f , { { { 5 , 20 } }, 0 }),
68
74
// I-type immediate for arithmetic instructions (12bits)
69
75
ArgumentDesc (' j' , ' n' , -0x800 , 0x7ff , { { { 12 , 20 } }, 0 }),
70
76
// Shift for bit shift instructions (5bits)
@@ -368,6 +374,13 @@ static const struct InstructionMap LOAD_map[] = {
368
374
IM_UNKNOWN,
369
375
};
370
376
377
+ static const struct InstructionMap F_LOAD_map[] = {
378
+ IM_UNKNOWN,
379
+ IM_UNKNOWN,
380
+ {" flw" , IT_I, { .alu_op =AluOp::ADD }, AC_I32, nullptr , {" D" , " o(s)" }, 0x2007 , 0x707f , { .flags = FLAGS_ALU_I_LOAD | IMF_ALU_REQ_RD_F }, nullptr },
381
+ {" fld" , IT_I, { .alu_op =AluOp::ADD }, AC_I64, nullptr , {" D" , " o(s)" }, 0x3007 , 0x707f , { .flags = FLAGS_ALU_I_LOAD | IMF_ALU_REQ_RD_F }, nullptr },
382
+ };
383
+
371
384
static const struct InstructionMap SRI_map[] = { // 0xfe00707f mask changed to 0xfc00707f to support RV64I
372
385
{" srli" , IT_I, { .alu_op =AluOp::SR }, NOMEM, nullptr , {" d" , " s" , " >" }, 0x00005013 ,0xfc00707f , { .flags = FLAGS_ALU_I }, nullptr }, // SRLI
373
386
{" srai" , IT_I, { .alu_op =AluOp::SR }, NOMEM, nullptr , {" d" , " s" , " >" }, 0x40005013 ,0xfc00707f , { .flags = (FLAGS_ALU_I | IMF_ALU_MOD) }, nullptr }, // SRAI
@@ -395,6 +408,13 @@ static const struct InstructionMap STORE_map[] = {
395
408
IM_UNKNOWN,
396
409
};
397
410
411
+ static const struct InstructionMap F_STORE_map[] = {
412
+ IM_UNKNOWN,
413
+ IM_UNKNOWN,
414
+ {" fsw" , IT_I, { .alu_op =AluOp::ADD }, AC_U32, nullptr , {" T" , " q(s)" }, 0x2027 , 0x707f , { .flags = FLAGS_ALU_I_STORE | IMF_ALU_REQ_RT_F }, nullptr }, // FSW
415
+ {" fsd" , IT_I, { .alu_op =AluOp::ADD }, AC_U64, nullptr , {" T" , " q(s)" }, 0x3027 , 0x707f , { .flags = FLAGS_ALU_I_STORE | IMF_ALU_REQ_RT_F }, nullptr }, // FSD
416
+ };
417
+
398
418
static const struct InstructionMap ADD_map[] = {
399
419
{" add" , IT_R, { .alu_op =AluOp::ADD }, NOMEM, nullptr , {" d" , " s" , " t" }, 0x00000033 , 0xfe00707f , { .flags = FLAGS_ALU_T_R_STD }, nullptr },
400
420
{" sub" , IT_R, { .alu_op =AluOp::ADD }, NOMEM, nullptr , {" d" , " s" , " t" }, 0x40000033 , 0xfe00707f , { .flags = FLAGS_ALU_T_R_STD | IMF_ALU_MOD }, inst_aliases_sub},
@@ -578,28 +598,96 @@ static const struct InstructionMap OP_32_map[] = {
578
598
579
599
// Full, uncomprese, instructions top level map
580
600
601
+ static const struct InstructionMap F_sgnj_map[] = {
602
+ {" fsgnj.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0x20000053 , 0xfe00707f , {}, nullptr },
603
+ {" fsgnjn.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0x20001053 , 0xfe00707f , {}, nullptr },
604
+ {" fsgnjx.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0x20002053 , 0xfe00707f , {}, nullptr },
605
+ IM_UNKNOWN,
606
+ IM_UNKNOWN,
607
+ IM_UNKNOWN,
608
+ IM_UNKNOWN,
609
+ IM_UNKNOWN,
610
+ };
611
+
612
+ static const struct InstructionMap F_ex_map[] = {
613
+ {" fmin.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0x28000053 , 0xfe00707f , {}, nullptr },
614
+ {" fmax.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0x28001053 , 0xfe00707f , {}, nullptr },
615
+ };
616
+
617
+ static const struct InstructionMap F_cvt_w_s_map[] = {
618
+ {" fcvt.w.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0xc0000053 , 0xfff0007f , {}, nullptr },
619
+ {" fcvt.wu.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0xc0100053 , 0xfff0007f , {}, nullptr },
620
+ };
621
+
622
+ static const struct InstructionMap F_cp_map[] = {
623
+ {" fle.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0xa0002053 , 0xfe00707f , {}, nullptr },
624
+ {" flt.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0xa0001053 , 0xfe00707f , {}, nullptr },
625
+ {" feq.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0xa0000053 , 0xfe00707f , {}, nullptr },
626
+ IM_UNKNOWN,
627
+ };
628
+
629
+ static const struct InstructionMap F_cvt_s_w_map[] = {
630
+ {" fcvt.s.w" ,IT_I, NOALU, NOMEM, nullptr , {}, 0xd0000053 , 0xfff0007f , {}, nullptr },
631
+ {" fcvt.s.wu" ,IT_I, NOALU, NOMEM, nullptr , {}, 0xd0100053 , 0xfff0007f , {}, nullptr },
632
+ };
633
+
634
+ static const struct InstructionMap F_inst_map[] = {
635
+ {" fadd.s" ,IT_I, { .alu_op =AluOp::ADD }, NOMEM, nullptr , {" D" , " S" , " T" }, 0x53 , 0xfe00007f , { .flags = FLAGS_ALU_T_R_STD | IMF_ALU_REQ_RT_F | IMF_ALU_REQ_RS_F | IMF_ALU_REQ_RD_F }, nullptr },
636
+ {" fsub.s" ,IT_I, NOALU, NOMEM, nullptr , {" D" , " S" , " T" }, 0x8000053 , 0xfe00007f , { .flags = FLAGS_ALU_T_R_STD | IMF_ALU_REQ_RT_F | IMF_ALU_REQ_RS_F | IMF_ALU_REQ_RD_F | IMF_ALU_MOD}, nullptr },
637
+ {" fmul.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0x10000053 , 0xfe00007f , {}, nullptr },
638
+ {" fdiv.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0x18000053 , 0xfe00007f , {}, nullptr },
639
+ {" fsgnj" ,IT_I, NOALU, NOMEM, F_sgnj_map, {}, 0x20000053 , 0xfe00007f , { .subfield = {3 , 12 } }, nullptr },
640
+ {" f-ex.s" ,IT_I, NOALU, NOMEM, F_ex_map, {}, 0x28000053 , 0xfe00007f , { .subfield = {1 , 12 } }, nullptr },
641
+ IM_UNKNOWN,
642
+ IM_UNKNOWN,
643
+ IM_UNKNOWN,
644
+ IM_UNKNOWN,
645
+ IM_UNKNOWN,
646
+ {" fsqrt.s" ,IT_I, NOALU, NOMEM, nullptr , {}, 0x58000053 , 0xfe00007f , {}, nullptr },
647
+ IM_UNKNOWN,
648
+ IM_UNKNOWN,
649
+ IM_UNKNOWN,
650
+ IM_UNKNOWN,
651
+ IM_UNKNOWN,
652
+ IM_UNKNOWN,
653
+ IM_UNKNOWN,
654
+ IM_UNKNOWN,
655
+ {" f-cp" ,IT_I, NOALU, NOMEM, F_cp_map, {}, 0xa0000053 , 0xfe00007f , { .subfield = {2 , 12 } }, nullptr },
656
+ IM_UNKNOWN,
657
+ IM_UNKNOWN,
658
+ IM_UNKNOWN,
659
+ {" fcvt-w-s" ,IT_I, NOALU, NOMEM, F_cvt_w_s_map, {}, 0xc0000053 , 0xfe00007f , { .subfield = {1 , 20 } }, nullptr },
660
+ IM_UNKNOWN,
661
+ {" fcvt-s-w" ,IT_I, NOALU, NOMEM, F_cvt_s_w_map, {}, 0xd0000053 , 0xfe00007f , { .subfield = {1 , 20 } }, nullptr },
662
+ IM_UNKNOWN,
663
+ {" fmv.x.w" ,IT_I, { .alu_op =AluOp::ADD }, AC_I32, nullptr , {" d" , " S" }, 0xe0000053 , 0xfe00007f , {}, nullptr },
664
+ IM_UNKNOWN,
665
+ {" fmv.w.x" ,IT_I, { .alu_op =AluOp::ADD }, AC_I32, nullptr , {" D" , " s" }, 0xf0000053 , 0xfe00007f , {}, nullptr },
666
+ IM_UNKNOWN,
667
+ };
668
+
581
669
static const struct InstructionMap I_inst_map[] = {
582
670
{" load" , IT_I, NOALU, NOMEM, LOAD_map, {}, 0x03 , 0x7f , { .subfield = {3 , 12 } }, nullptr }, // LOAD
583
- IM_UNKNOWN , // LOAD-FP
671
+ { " load-fp " , IT_I, NOALU, NOMEM, F_LOAD_map, {}, 0x07 , 0x7f , { . subfield = { 2 , 12 } }, nullptr } , // LOAD-FP
584
672
IM_UNKNOWN, // custom-0
585
673
{" misc-mem" , IT_I, NOALU, NOMEM, MISC_MEM_map, {}, 0x0f , 0x7f , { .subfield = {3 , 12 } }, nullptr }, // MISC-MEM
586
674
{" op-imm" , IT_I, NOALU, NOMEM, OP_IMM_map, {}, 0x13 , 0x7f , { .subfield = {3 , 12 } }, nullptr }, // OP-IMM
587
675
{" auipc" , IT_U, { .alu_op =AluOp::ADD }, NOMEM, nullptr , {" d" , " u" }, 0x17 , 0x7f , { .flags = IMF_SUPPORTED | IMF_ALUSRC | IMF_REGWRITE | IMF_PC_TO_ALU }, nullptr }, // AUIPC
588
676
{" op-imm-32" , IT_I, NOALU, NOMEM, OP_IMM_32_map, {}, 0x1b , 0x7f , { .subfield = {3 , 12 } }, nullptr }, // OP-IMM-32 IM_UNKNOWN, // OP-IMM-32
589
677
IM_UNKNOWN, // 48b
590
678
{" store" , IT_I, NOALU, NOMEM, STORE_map, {}, 0x23 , 0x7f , { .subfield = {3 , 12 } }, nullptr }, // STORE
591
- IM_UNKNOWN , // STORE-FP
679
+ { " store-fp " , IT_I, NOALU, NOMEM, F_STORE_map, {}, 0x27 , 0x7f , { . subfield = { 2 , 12 } }, nullptr } , // STORE-FP
592
680
IM_UNKNOWN, // custom-1
593
681
{" amo" , IT_R, NOALU, NOMEM, AMO_map, {}, 0x2f , 0x7f , { .subfield = {3 , 12 } }, nullptr }, // OP-32
594
682
{" op" , IT_R, NOALU, NOMEM, OP_map, {}, 0x33 , 0x7f , { .subfield = {1 , 25 } }, nullptr }, // OP
595
683
{" lui" , IT_U, { .alu_op =AluOp::ADD }, NOMEM, nullptr , {" d" , " u" }, 0x37 , 0x7f , { .flags = IMF_SUPPORTED | IMF_ALUSRC | IMF_REGWRITE }, nullptr }, // LUI
596
684
{" op-32" , IT_R, NOALU, NOMEM, OP_32_map, {}, 0x3b , 0x7f , { .subfield = {1 , 25 } }, nullptr }, // OP-32
597
685
IM_UNKNOWN, // 64b
598
- IM_UNKNOWN, // MADD
599
- IM_UNKNOWN, // MSUB
600
- IM_UNKNOWN, // NMSUB
601
- IM_UNKNOWN, // NMADD
602
- IM_UNKNOWN , // OP-FP
686
+ { " fmadd.s " , IT_I, NOALU, NOMEM, nullptr , {}, 0x43 , 0x7f , {}, nullptr }, // FMADD.S
687
+ { " fmsub.s " , IT_I, NOALU, NOMEM, nullptr , {}, 0x47 , 0x7f , {}, nullptr }, // FMSUB.S
688
+ { " fnmsub.s " , IT_I, NOALU, NOMEM, nullptr , {}, 0x4b , 0x7f , {}, nullptr }, // FNMSUB.S
689
+ { " fnmadd.s " , IT_I, NOALU, NOMEM, nullptr , {}, 0x4f , 0x7f , {}, nullptr }, // FNMADD.S
690
+ { " op-fp " ,IT_I, NOALU, NOMEM, F_inst_map, {}, 0x600007f , 0x7f , { . subfield ={ 5 , 27 } }, nullptr } , // OP-FP
603
691
IM_UNKNOWN, // reserved
604
692
IM_UNKNOWN, // custom-2/rv128
605
693
IM_UNKNOWN, // 48b
@@ -804,6 +892,14 @@ QString Instruction::to_str(Address inst_addr) const {
804
892
}
805
893
break ;
806
894
}
895
+ case ' f' : {
896
+ if (symbolic_registers_enabled) {
897
+ res += QString (Rv_regnames[field]);
898
+ } else {
899
+ res += " f" + QString::number (field);
900
+ }
901
+ break ;
902
+ }
807
903
case ' p' :
808
904
case ' a' : {
809
905
field += (int32_t )inst_addr.get_raw ();
0 commit comments