Skip to content

Commit 4b95180

Browse files
committed
refactor
1 parent 55da87b commit 4b95180

File tree

5 files changed

+257
-287
lines changed

5 files changed

+257
-287
lines changed

src/common/string_utils.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
namespace str {
77
template<typename T>
88
QString asHex(T number) {
9-
if (number < 0) {
10-
return QString::asprintf("-0x%x", -number);
11-
} else {
9+
// return QString("0x%1").arg(number, 0, 16);
10+
// if (number < 0) {
11+
// return QString::asprintf("-0x%x", -number);
12+
// } else {
1213
return QString::asprintf("0x%x", number);
13-
}
14+
// }
1415
}
1516
} // namespace str
1617

src/machine/bitfield.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,14 @@ struct BitField {
2626
[[nodiscard]] T encode(T val) const {
2727
return ((val & (((uint64_t)1 << count) - 1)) << offset);
2828
}
29-
[[nodiscard]] uint64_t mask() const {
30-
return (((uint64_t)1 << count) - 1) << offset;
31-
}
29+
[[nodiscard]] uint64_t mask() const { return (((uint64_t)1 << count) - 1) << offset; }
3230
};
3331

3432
template<size_t MAX_FIELD_PARTS>
3533
struct SplitBitField {
3634
cvector<BitField, MAX_FIELD_PARTS> fields;
37-
size_t shift = 0;
35+
size_t str_shift = 0;
36+
size_t value_shift = 0;
3837

3938
[[nodiscard]] typename decltype(fields)::const_iterator begin() const {
4039
return fields.cbegin();
@@ -47,11 +46,15 @@ struct SplitBitField {
4746
ret |= field.decode(ins) << offset;
4847
offset += field.count;
4948
}
50-
return ret << shift;
49+
return ret << value_shift;
50+
}
51+
[[nodiscard]] uint32_t decode_str(uint32_t ins) const {
52+
uint32_t res = decode(ins);
53+
return res >> value_shift << str_shift;
5154
}
5255
[[nodiscard]] uint32_t encode(uint32_t imm) const {
5356
uint32_t ret = 0;
54-
imm >>= shift;
57+
imm >>= str_shift;
5558
for (BitField field : *this) {
5659
ret |= field.encode(imm);
5760
imm >>= field.count;

src/machine/instruction.cpp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

9097
static 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

Comments
 (0)