mirror of
https://github.com/Noratrieb/rustv32i.git
synced 2026-01-16 14:25:02 +01:00
fix
This commit is contained in:
parent
4cf8082116
commit
e5828c4838
1 changed files with 26 additions and 5 deletions
|
|
@ -791,9 +791,10 @@ impl InstCode {
|
||||||
(self.0 << (end_span)) >> (end_span + range.start())
|
(self.0 << (end_span)) >> (end_span + range.start())
|
||||||
}
|
}
|
||||||
fn insert(self, range: RangeInclusive<u32>, data: u32) -> Self {
|
fn insert(self, range: RangeInclusive<u32>, data: u32) -> Self {
|
||||||
|
let (start,end) = (*range.start(),*range.end());
|
||||||
// let start = ;
|
// let start = ;
|
||||||
let span_item = (1 << (range.end() - range.start())) - 1;
|
let span_item = (1 << (end - start + 1)) - 1;
|
||||||
Self(self.0 & !(span_item << range.start()) | ((data & span_item) << range.start()))
|
Self(self.0 & !(span_item << start) | ((data & span_item) << start))
|
||||||
}
|
}
|
||||||
fn immediate_s(self, mappings: &[(RangeInclusive<u32>, u32)]) -> Imm {
|
fn immediate_s(self, mappings: &[(RangeInclusive<u32>, u32)]) -> Imm {
|
||||||
let mut imm = 0;
|
let mut imm = 0;
|
||||||
|
|
@ -807,8 +808,16 @@ impl InstCode {
|
||||||
Imm::new_i32(sign_extend(imm, size) as i32)
|
Imm::new_i32(sign_extend(imm, size) as i32)
|
||||||
}
|
}
|
||||||
fn with_immediate_s(self, mappings: &[(RangeInclusive<u32>, u32)], data: Imm) -> Self {
|
fn with_immediate_s(self, mappings: &[(RangeInclusive<u32>, u32)], data: Imm) -> Self {
|
||||||
|
let mut size = 0;
|
||||||
|
for (from, to) in mappings {
|
||||||
|
let this_size = from.end() - from.start() + 1;
|
||||||
|
size = size.max(*to + this_size);
|
||||||
|
}
|
||||||
mappings.iter().fold(self, |this, (from, to)| {
|
mappings.iter().fold(self, |this, (from, to)| {
|
||||||
this.insert(from.clone(), data.as_u32() >> to)
|
this.insert(
|
||||||
|
from.clone(),
|
||||||
|
data.as_u32() >> *to,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2114,7 +2123,13 @@ mod tests {
|
||||||
let i2 = Inst::decode(i, xlen);
|
let i2 = Inst::decode(i, xlen);
|
||||||
if let Ok((i2, crate::IsCompressed::No)) = i2 {
|
if let Ok((i2, crate::IsCompressed::No)) = i2 {
|
||||||
if is_inst_supposed_to_roundtrip(&i2) {
|
if is_inst_supposed_to_roundtrip(&i2) {
|
||||||
assert_eq!(i2.encode_normal(xlen), i);
|
assert_eq!(
|
||||||
|
i2,
|
||||||
|
Inst::decode(i2.encode_normal(xlen), xlen)
|
||||||
|
.expect("to succeed")
|
||||||
|
.0,
|
||||||
|
"encoded inst different: {i2} from {i} encodes differently"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2122,7 +2137,13 @@ mod tests {
|
||||||
let i = u32::MAX;
|
let i = u32::MAX;
|
||||||
if let Ok((i2, crate::IsCompressed::No)) = i2 {
|
if let Ok((i2, crate::IsCompressed::No)) = i2 {
|
||||||
if is_inst_supposed_to_roundtrip(&i2) {
|
if is_inst_supposed_to_roundtrip(&i2) {
|
||||||
assert_eq!(i2.encode_normal(xlen), i);
|
assert_eq!(
|
||||||
|
i2,
|
||||||
|
Inst::decode(i2.encode_normal(xlen), xlen)
|
||||||
|
.expect("to succeed")
|
||||||
|
.0,
|
||||||
|
"encoded inst different: {i2} from {i} encodes differently"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue