Fix jump table emit
This commit is contained in:
parent
19922f1a4a
commit
8b52af9651
@ -30,7 +30,7 @@ fn write_br_gadget(rem: usize, d: &mut Data, w: &mut dyn Write) -> Result<()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn list_to_range(list: &[u32]) -> Vec<(Range<usize>, u32)> {
|
pub fn condense_jump_table(list: &[u32]) -> Vec<(usize, usize, u32)> {
|
||||||
let mut result = Vec::new();
|
let mut result = Vec::new();
|
||||||
let mut index = 0;
|
let mut index = 0;
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ pub fn list_to_range(list: &[u32]) -> Vec<(Range<usize>, u32)> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.push((start..index, list[start]));
|
result.push((start, index - 1, list[start]));
|
||||||
}
|
}
|
||||||
|
|
||||||
result
|
result
|
||||||
@ -338,14 +338,14 @@ impl BrTable {
|
|||||||
self.cond.output(d, w)?;
|
self.cond.output(d, w)?;
|
||||||
write!(w, " ")?;
|
write!(w, " ")?;
|
||||||
|
|
||||||
for (r, t) in list_to_range(&self.data.table) {
|
for (start, end, dest) in condense_jump_table(&self.data.table) {
|
||||||
if r.len() == 1 {
|
if start == end {
|
||||||
write!(w, "if temp == {} then ", r.start)?;
|
write!(w, "if temp == {} then ", start)?;
|
||||||
} else {
|
} else {
|
||||||
write!(w, "if temp >= {} and temp <= {} then ", r.start, r.end)?;
|
write!(w, "if temp >= {} and temp <= {} then ", start, end)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Br::write_at(t, d, w)?;
|
Br::write_at(dest, d, w)?;
|
||||||
write!(w, "else")?;
|
write!(w, "else")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user