Auto merge of #118347 - Mark-Simulacrum:asm-code-size, r=spastorino
Avoid per-register closure expansions Best reviewed with whitespace ignored. This hopefully reduces overall size of the binary. Probably zero impact in instructions/cycles in rustc-perf since we don't really have any asm benchmarks AFAIK...
This commit is contained in:
commit
90e321d82a
@ -342,9 +342,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
|
|
||||||
// Flag to output the error only once per operand
|
// Flag to output the error only once per operand
|
||||||
let mut skip = false;
|
let mut skip = false;
|
||||||
reg.overlapping_regs(|r| {
|
|
||||||
let mut check = |used_regs: &mut FxHashMap<asm::InlineAsmReg, usize>,
|
let mut check = |used_regs: &mut FxHashMap<asm::InlineAsmReg, usize>,
|
||||||
input| {
|
input,
|
||||||
|
r: asm::InlineAsmReg| {
|
||||||
match used_regs.entry(r) {
|
match used_regs.entry(r) {
|
||||||
Entry::Occupied(o) => {
|
Entry::Occupied(o) => {
|
||||||
if skip {
|
if skip {
|
||||||
@ -370,7 +371,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let reg_str = |idx| -> &str {
|
let reg_str = |idx| -> &str {
|
||||||
// HIR asm doesn't preserve the original alias string of the explicit register,
|
// HIR asm doesn't preserve the original alias string of the explicit register,
|
||||||
// so we have to retrieve it from AST
|
// so we have to retrieve it from AST
|
||||||
@ -399,13 +399,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let mut overlapping_with = vec![];
|
||||||
|
reg.overlapping_regs(|r| {
|
||||||
|
overlapping_with.push(r);
|
||||||
|
});
|
||||||
|
for r in overlapping_with {
|
||||||
if input {
|
if input {
|
||||||
check(&mut used_input_regs, true);
|
check(&mut used_input_regs, true, r);
|
||||||
}
|
}
|
||||||
if output {
|
if output {
|
||||||
check(&mut used_output_regs, false);
|
check(&mut used_output_regs, false, r);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -420,12 +425,12 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut output_used = false;
|
let mut overlapping_with = vec![];
|
||||||
clobber.overlapping_regs(|reg| {
|
clobber.overlapping_regs(|reg| {
|
||||||
if used_output_regs.contains_key(®) {
|
overlapping_with.push(reg);
|
||||||
output_used = true;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
let output_used =
|
||||||
|
overlapping_with.iter().any(|reg| used_output_regs.contains_key(®));
|
||||||
|
|
||||||
if !output_used {
|
if !output_used {
|
||||||
operands.push((
|
operands.push((
|
||||||
|
Loading…
x
Reference in New Issue
Block a user