Clean up handling of NOPs in the x64 backend.
1. Restricts max nop size to 15 instead of 16. 2. Fixes an edge case where gen_nop() would return a zero sized intruction on multiples of 16. 3. Clarifies the documentation of the gen_nop interface to state that returning zero is allowed when preferred_size is zero.
This commit is contained in:
@@ -566,7 +566,7 @@ impl Inst {
|
|||||||
|
|
||||||
impl Inst {
|
impl Inst {
|
||||||
pub(crate) fn nop(len: u8) -> Self {
|
pub(crate) fn nop(len: u8) -> Self {
|
||||||
debug_assert!(len <= 16);
|
debug_assert!(len <= 15);
|
||||||
Self::Nop { len }
|
Self::Nop { len }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2594,11 +2594,11 @@ impl MachInst for Inst {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn gen_zero_len_nop() -> Inst {
|
fn gen_zero_len_nop() -> Inst {
|
||||||
Inst::Nop { len: 0 }
|
Inst::nop(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn gen_nop(preferred_size: usize) -> Inst {
|
fn gen_nop(preferred_size: usize) -> Inst {
|
||||||
Inst::nop((preferred_size % 16) as u8)
|
Inst::nop(std::cmp::min(preferred_size, 15) as u8)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn maybe_direct_reload(&self, _reg: VirtualReg, _slot: SpillSlot) -> Option<Inst> {
|
fn maybe_direct_reload(&self, _reg: VirtualReg, _slot: SpillSlot) -> Option<Inst> {
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ pub trait MachInst: Clone + Debug {
|
|||||||
/// request a NOP of that size, or as close to it as possible. The machine
|
/// request a NOP of that size, or as close to it as possible. The machine
|
||||||
/// backend may return a NOP whose binary encoding is smaller than the
|
/// backend may return a NOP whose binary encoding is smaller than the
|
||||||
/// preferred size, but must not return a NOP that is larger. However,
|
/// preferred size, but must not return a NOP that is larger. However,
|
||||||
/// the instruction must have a nonzero size.
|
/// the instruction must have a nonzero size if preferred_size is nonzero.
|
||||||
fn gen_nop(preferred_size: usize) -> Self;
|
fn gen_nop(preferred_size: usize) -> Self;
|
||||||
|
|
||||||
/// Get the register universe for this backend.
|
/// Get the register universe for this backend.
|
||||||
|
|||||||
Reference in New Issue
Block a user