Pass target_features set instead of has_feature closure
This avoids unnecessary monomorphizations in codegen backends
This commit is contained in:
parent
991cbd1503
commit
042aa379a5
8 changed files with 63 additions and 62 deletions
|
@ -81,14 +81,14 @@ macro_rules! def_regs {
|
|||
|
||||
pub fn parse(
|
||||
_arch: super::InlineAsmArch,
|
||||
mut _has_feature: impl FnMut(rustc_span::Symbol) -> bool,
|
||||
_target_features: &rustc_data_structures::fx::FxHashSet<Symbol>,
|
||||
_target: &crate::spec::Target,
|
||||
name: &str,
|
||||
) -> Result<Self, &'static str> {
|
||||
match name {
|
||||
$(
|
||||
$($alias)|* | $reg_name => {
|
||||
$($filter(_arch, &mut _has_feature, _target)?;)?
|
||||
$($filter(_arch, _target_features, _target)?;)?
|
||||
Ok(Self::$reg)
|
||||
}
|
||||
)*
|
||||
|
@ -102,7 +102,7 @@ macro_rules! def_regs {
|
|||
|
||||
pub(super) fn fill_reg_map(
|
||||
_arch: super::InlineAsmArch,
|
||||
mut _has_feature: impl FnMut(rustc_span::Symbol) -> bool,
|
||||
_target_features: &rustc_data_structures::fx::FxHashSet<Symbol>,
|
||||
_target: &crate::spec::Target,
|
||||
_map: &mut rustc_data_structures::fx::FxHashMap<
|
||||
super::InlineAsmRegClass,
|
||||
|
@ -112,7 +112,7 @@ macro_rules! def_regs {
|
|||
#[allow(unused_imports)]
|
||||
use super::{InlineAsmReg, InlineAsmRegClass};
|
||||
$(
|
||||
if $($filter(_arch, &mut _has_feature, _target).is_ok() &&)? true {
|
||||
if $($filter(_arch, _target_features, _target).is_ok() &&)? true {
|
||||
if let Some(set) = _map.get_mut(&InlineAsmRegClass::$arch($arch_regclass::$class)) {
|
||||
set.insert(InlineAsmReg::$arch($arch_reg::$reg));
|
||||
}
|
||||
|
@ -289,7 +289,7 @@ impl InlineAsmReg {
|
|||
|
||||
pub fn parse(
|
||||
arch: InlineAsmArch,
|
||||
has_feature: impl FnMut(Symbol) -> bool,
|
||||
target_features: &FxHashSet<Symbol>,
|
||||
target: &Target,
|
||||
name: Symbol,
|
||||
) -> Result<Self, &'static str> {
|
||||
|
@ -298,43 +298,43 @@ impl InlineAsmReg {
|
|||
let name = name.as_str();
|
||||
Ok(match arch {
|
||||
InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
|
||||
Self::X86(X86InlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::X86(X86InlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::Arm => {
|
||||
Self::Arm(ArmInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::Arm(ArmInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::AArch64 => {
|
||||
Self::AArch64(AArch64InlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::AArch64(AArch64InlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::RiscV32 | InlineAsmArch::RiscV64 => {
|
||||
Self::RiscV(RiscVInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::RiscV(RiscVInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::Nvptx64 => {
|
||||
Self::Nvptx(NvptxInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::Nvptx(NvptxInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::PowerPC | InlineAsmArch::PowerPC64 => {
|
||||
Self::PowerPC(PowerPCInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::PowerPC(PowerPCInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::Hexagon => {
|
||||
Self::Hexagon(HexagonInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::Hexagon(HexagonInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::Mips | InlineAsmArch::Mips64 => {
|
||||
Self::Mips(MipsInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::Mips(MipsInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::S390x => {
|
||||
Self::S390x(S390xInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::S390x(S390xInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::SpirV => {
|
||||
Self::SpirV(SpirVInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::SpirV(SpirVInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::Wasm32 | InlineAsmArch::Wasm64 => {
|
||||
Self::Wasm(WasmInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::Wasm(WasmInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::Bpf => {
|
||||
Self::Bpf(BpfInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::Bpf(BpfInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
InlineAsmArch::Avr => {
|
||||
Self::Avr(AvrInlineAsmReg::parse(arch, has_feature, target, name)?)
|
||||
Self::Avr(AvrInlineAsmReg::parse(arch, target_features, target, name)?)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -695,73 +695,73 @@ impl fmt::Display for InlineAsmType {
|
|||
// falling back to an external assembler.
|
||||
pub fn allocatable_registers(
|
||||
arch: InlineAsmArch,
|
||||
has_feature: impl FnMut(Symbol) -> bool,
|
||||
target_features: &FxHashSet<Symbol>,
|
||||
target: &crate::spec::Target,
|
||||
) -> FxHashMap<InlineAsmRegClass, FxHashSet<InlineAsmReg>> {
|
||||
match arch {
|
||||
InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
|
||||
let mut map = x86::regclass_map();
|
||||
x86::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
x86::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::Arm => {
|
||||
let mut map = arm::regclass_map();
|
||||
arm::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
arm::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::AArch64 => {
|
||||
let mut map = aarch64::regclass_map();
|
||||
aarch64::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
aarch64::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::RiscV32 | InlineAsmArch::RiscV64 => {
|
||||
let mut map = riscv::regclass_map();
|
||||
riscv::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
riscv::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::Nvptx64 => {
|
||||
let mut map = nvptx::regclass_map();
|
||||
nvptx::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
nvptx::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::PowerPC | InlineAsmArch::PowerPC64 => {
|
||||
let mut map = powerpc::regclass_map();
|
||||
powerpc::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
powerpc::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::Hexagon => {
|
||||
let mut map = hexagon::regclass_map();
|
||||
hexagon::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
hexagon::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::Mips | InlineAsmArch::Mips64 => {
|
||||
let mut map = mips::regclass_map();
|
||||
mips::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
mips::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::S390x => {
|
||||
let mut map = s390x::regclass_map();
|
||||
s390x::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
s390x::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::SpirV => {
|
||||
let mut map = spirv::regclass_map();
|
||||
spirv::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
spirv::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::Wasm32 | InlineAsmArch::Wasm64 => {
|
||||
let mut map = wasm::regclass_map();
|
||||
wasm::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
wasm::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::Bpf => {
|
||||
let mut map = bpf::regclass_map();
|
||||
bpf::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
bpf::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
InlineAsmArch::Avr => {
|
||||
let mut map = avr::regclass_map();
|
||||
avr::fill_reg_map(arch, has_feature, target, &mut map);
|
||||
avr::fill_reg_map(arch, target_features, target, &mut map);
|
||||
map
|
||||
}
|
||||
}
|
||||
|
@ -794,7 +794,7 @@ impl InlineAsmClobberAbi {
|
|||
/// clobber ABIs for the target.
|
||||
pub fn parse(
|
||||
arch: InlineAsmArch,
|
||||
has_feature: impl FnMut(Symbol) -> bool,
|
||||
target_features: &FxHashSet<Symbol>,
|
||||
target: &Target,
|
||||
name: Symbol,
|
||||
) -> Result<Self, &'static [&'static str]> {
|
||||
|
@ -819,7 +819,7 @@ impl InlineAsmClobberAbi {
|
|||
},
|
||||
InlineAsmArch::AArch64 => match name {
|
||||
"C" | "system" | "efiapi" => {
|
||||
Ok(if aarch64::reserved_x18(arch, has_feature, target).is_err() {
|
||||
Ok(if aarch64::reserved_x18(arch, target_features, target).is_err() {
|
||||
InlineAsmClobberAbi::AArch64NoX18
|
||||
} else {
|
||||
InlineAsmClobberAbi::AArch64
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue