@@ -48,10 +48,12 @@ struct ArgumentDesc {
4848 /* * Check whether given value fits into this instruction field. */
4949 [[nodiscard]] constexpr bool is_value_in_field_range (RegisterValue val) const {
5050 if (min < 0 ) {
51- return val.as_i64 () <= max && val.as_i64 () >= min;
51+ int32_t val_ = val.as_i32 ();
52+ val_ >>= arg.str_shift ;
53+ return val_ <= max && val_ >= min;
5254 } else {
53- return val.as_u64 () <= static_cast < uint64_t >(max)
54- && val. as_u64 () >= static_cast <uint64_t >(min);
55+ uint64_t val_ = val.as_u64 () >> arg. str_shift ;
56+ return val_ <= static_cast < uint64_t >(max) && val_ >= static_cast <uint64_t >(min);
5557 }
5658 }
5759
@@ -70,11 +72,16 @@ static const ArgumentDesc arg_desc_list[] = {
7072 // Shift for bit shift instructions (5bits)
7173 ArgumentDesc (' >' , ' n' , 0 , 0x1f , { { { 5 , 20 } }, 0 }),
7274 // Address offset immediate (20bits), encoded in multiples of 2 bytes
73- ArgumentDesc (' a' , ' a' , -0x80000 , 0x7ffff , { { { 10 , 21 }, { 1 , 20 }, { 8 , 12 }, { 1 , 31 } }, 1 }),
75+ ArgumentDesc (
76+ ' a' ,
77+ ' a' ,
78+ -0x80000 ,
79+ 0x7ffff ,
80+ { { { 10 , 21 }, { 1 , 20 }, { 8 , 12 }, { 1 , 31 } }, 1 , 0 }),
7481 // U-type immediate for LUI and AUIPC (20bits)
75- ArgumentDesc (' u' , ' n' , 0 , 0xfffff000 , { { { 20 , 12 } }, 0 }),
82+ ArgumentDesc (' u' , ' n' , 0 , 0xfffff , { { { 20 , 12 } }, 0 , 12 }),
7683 // B-type immediate for branches (12 bits)
77- ArgumentDesc (' p' , ' p' , -0x1000 , 0x0fff , { { { 4 , 8 }, { 6 , 25 }, { 1 , 7 }, { 1 , 31 } }, 1 }),
84+ ArgumentDesc (' p' , ' p' , -0x1000 , 0x0fff , { { { 4 , 8 }, { 6 , 25 }, { 1 , 7 }, { 1 , 31 } }, 1 , 0 }),
7885 // Offset immediate for load instructions (12 bits)
7986 ArgumentDesc (' o' , ' o' , -0x800 , 0x7ff , { { { 12 , 20 } }, 0 }),
8087 // Offset immediate for store instructions (12 bits)
@@ -84,7 +91,7 @@ static const ArgumentDesc arg_desc_list[] = {
8491 ArgumentDesc (' Z' , ' n' , 0 , 0x1f , { { { 5 , 15 } }, 0 }),
8592 // 12-bit CSR address
8693 // (https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=opcodes/riscv-opc.c;h=7e95f645c5c5fe0a7c93c64c2f1719efaec67972;hb=HEAD#l928)
87- ArgumentDesc (' E' , ' E' , 0 , 0xfff , { { { 12 , 20 } }, 0 }),
94+ ArgumentDesc (' E' , ' E' , 0 , 0xfff , { { { 12 , 20 } }, 0 , 20 }),
8895};
8996
9097static const ArgumentDesc *arg_desc_by_code[(int )(' z' + 1 )];
@@ -786,10 +793,11 @@ QString Instruction::to_str(Address inst_addr) const {
786793 res += arg_letter;
787794 continue ;
788795 }
789- auto field = (int32_t )arg_desc->arg .decode (this ->dt );
796+
797+ auto field = (int32_t )arg_desc->arg .decode_str (this ->dt );
790798 if (arg_desc->min < 0 ) {
791799 field = extend (field, [&]() {
792- int sum = (int )arg_desc->arg .shift ;
800+ int sum = (int )arg_desc->arg .str_shift ;
793801 for (auto chunk : arg_desc->arg ) {
794802 sum += chunk.count ;
795803 }
@@ -808,6 +816,7 @@ QString Instruction::to_str(Address inst_addr) const {
808816 case ' p' :
809817 case ' a' : {
810818 field += (int32_t )inst_addr.get_raw ();
819+ QString a = str::asHex (field);
811820 res.append (str::asHex (field));
812821 break ;
813822 }
@@ -1401,7 +1410,7 @@ bool Instruction::update(int64_t val, RelocExpression *relocexp) {
14011410 if (relocexp->pseudo_mod != Modifier::NONE) {
14021411 val = (int64_t )modify_pseudoinst_imm (relocexp->pseudo_mod , val);
14031412 } else {
1404- if ((val & ((1 << relocexp->arg ->shift ) - 1 ))) { return false ; }
1413+ if ((val & ((1 << relocexp->arg ->str_shift ) - 1 ))) { return false ; }
14051414 if (relocexp->min < 0 ) {
14061415 if (((int64_t )val < relocexp->min ) || ((int64_t )val > relocexp->max )) {
14071416 if (((int64_t )val - 0x100000000 < relocexp->min )
0 commit comments