1
Fork 0

Use Symbol for target features in asm handling

This saves a couple of Symbol::intern calls
This commit is contained in:
bjorn3 2022-01-10 15:32:45 +01:00
parent a34c079752
commit 991cbd1503
20 changed files with 91 additions and 69 deletions

View file

@ -1,6 +1,7 @@
use super::{InlineAsmArch, InlineAsmType};
use crate::spec::Target;
use rustc_macros::HashStable_Generic;
use rustc_span::Symbol;
use std::fmt;
def_reg_class! {
@ -58,11 +59,11 @@ impl AArch64InlineAsmRegClass {
pub fn supported_types(
self,
_arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::reg => types! { _: I8, I16, I32, I64, F32, F64; },
Self::vreg | Self::vreg_low16 => types! {
"fp": I8, I16, I32, I64, F32, F64,
fp: I8, I16, I32, I64, F32, F64,
VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF32(2), VecF64(1),
VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF32(4), VecF64(2);
},
@ -73,7 +74,7 @@ impl AArch64InlineAsmRegClass {
pub fn reserved_x18(
_arch: InlineAsmArch,
_has_feature: impl FnMut(&str) -> bool,
_has_feature: impl FnMut(Symbol) -> bool,
target: &Target,
) -> Result<(), &'static str> {
if target.os == "android"

View file

@ -1,6 +1,7 @@
use super::{InlineAsmArch, InlineAsmType};
use crate::spec::Target;
use rustc_macros::HashStable_Generic;
use rustc_span::{sym, Symbol};
use std::fmt;
def_reg_class! {
@ -44,28 +45,28 @@ impl ArmInlineAsmRegClass {
pub fn supported_types(
self,
_arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::reg => types! { _: I8, I16, I32, F32; },
Self::sreg | Self::sreg_low16 => types! { "vfp2": I32, F32; },
Self::sreg | Self::sreg_low16 => types! { vfp2: I32, F32; },
Self::dreg | Self::dreg_low16 | Self::dreg_low8 => types! {
"vfp2": I64, F64, VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF32(2);
vfp2: I64, F64, VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF32(2);
},
Self::qreg | Self::qreg_low8 | Self::qreg_low4 => types! {
"neon": VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF32(4);
neon: VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF32(4);
},
}
}
}
// This uses the same logic as useR7AsFramePointer in LLVM
fn frame_pointer_is_r7(mut has_feature: impl FnMut(&str) -> bool, target: &Target) -> bool {
target.is_like_osx || (!target.is_like_windows && has_feature("thumb-mode"))
fn frame_pointer_is_r7(mut has_feature: impl FnMut(Symbol) -> bool, target: &Target) -> bool {
target.is_like_osx || (!target.is_like_windows && has_feature(sym::thumb_mode))
}
fn frame_pointer_r11(
_arch: InlineAsmArch,
has_feature: impl FnMut(&str) -> bool,
has_feature: impl FnMut(Symbol) -> bool,
target: &Target,
) -> Result<(), &'static str> {
if !frame_pointer_is_r7(has_feature, target) {
@ -77,7 +78,7 @@ fn frame_pointer_r11(
fn frame_pointer_r7(
_arch: InlineAsmArch,
has_feature: impl FnMut(&str) -> bool,
has_feature: impl FnMut(Symbol) -> bool,
target: &Target,
) -> Result<(), &'static str> {
if frame_pointer_is_r7(has_feature, target) {
@ -89,10 +90,10 @@ fn frame_pointer_r7(
fn not_thumb1(
_arch: InlineAsmArch,
mut has_feature: impl FnMut(&str) -> bool,
mut has_feature: impl FnMut(Symbol) -> bool,
_target: &Target,
) -> Result<(), &'static str> {
if has_feature("thumb-mode") && !has_feature("thumb2") {
if has_feature(sym::thumb_mode) && !has_feature(sym::thumb2) {
Err("high registers (r8+) cannot be used in Thumb-1 code")
} else {
Ok(())
@ -101,14 +102,14 @@ fn not_thumb1(
fn reserved_r9(
arch: InlineAsmArch,
mut has_feature: impl FnMut(&str) -> bool,
mut has_feature: impl FnMut(Symbol) -> bool,
target: &Target,
) -> Result<(), &'static str> {
not_thumb1(arch, &mut has_feature, target)?;
// We detect this using the reserved-r9 feature instead of using the target
// because the relocation model can be changed with compiler options.
if has_feature("reserved-r9") {
if has_feature(sym::reserved_r9) {
Err("the RWPI static base register (r9) cannot be used as an operand for inline asm")
} else {
Ok(())

View file

@ -1,5 +1,6 @@
use super::{InlineAsmArch, InlineAsmType};
use rustc_macros::HashStable_Generic;
use rustc_span::Symbol;
use std::fmt;
def_reg_class! {
@ -39,7 +40,7 @@ impl AvrInlineAsmRegClass {
pub fn supported_types(
self,
_arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::reg => types! { _: I8; },
Self::reg_upper => types! { _: I8; },

View file

@ -1,5 +1,6 @@
use super::{InlineAsmArch, InlineAsmType, Target};
use rustc_macros::HashStable_Generic;
use rustc_span::{sym, Symbol};
use std::fmt;
def_reg_class! {
@ -33,20 +34,20 @@ impl BpfInlineAsmRegClass {
pub fn supported_types(
self,
_arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::reg => types! { _: I8, I16, I32, I64; },
Self::wreg => types! { "alu32": I8, I16, I32; },
Self::wreg => types! { alu32: I8, I16, I32; },
}
}
}
fn only_alu32(
_arch: InlineAsmArch,
mut has_feature: impl FnMut(&str) -> bool,
mut has_feature: impl FnMut(Symbol) -> bool,
_target: &Target,
) -> Result<(), &'static str> {
if !has_feature("alu32") {
if !has_feature(sym::alu32) {
Err("register can't be used without the `alu32` target feature")
} else {
Ok(())

View file

@ -1,5 +1,6 @@
use super::{InlineAsmArch, InlineAsmType};
use rustc_macros::HashStable_Generic;
use rustc_span::Symbol;
use std::fmt;
def_reg_class! {
@ -32,7 +33,7 @@ impl HexagonInlineAsmRegClass {
pub fn supported_types(
self,
_arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::reg => types! { _: I8, I16, I32, F32; },
}

View file

@ -1,5 +1,6 @@
use super::{InlineAsmArch, InlineAsmType};
use rustc_macros::HashStable_Generic;
use rustc_span::Symbol;
use std::fmt;
def_reg_class! {
@ -33,7 +34,7 @@ impl MipsInlineAsmRegClass {
pub fn supported_types(
self,
arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match (self, arch) {
(Self::reg, InlineAsmArch::Mips64) => types! { _: I8, I16, I32, I64, F32, F64; },
(Self::reg, _) => types! { _: I8, I16, I32, F32; },

View file

@ -81,7 +81,7 @@ macro_rules! def_regs {
pub fn parse(
_arch: super::InlineAsmArch,
mut _has_feature: impl FnMut(&str) -> bool,
mut _has_feature: impl FnMut(rustc_span::Symbol) -> bool,
_target: &crate::spec::Target,
name: &str,
) -> Result<Self, &'static str> {
@ -102,7 +102,7 @@ macro_rules! def_regs {
pub(super) fn fill_reg_map(
_arch: super::InlineAsmArch,
mut _has_feature: impl FnMut(&str) -> bool,
mut _has_feature: impl FnMut(rustc_span::Symbol) -> bool,
_target: &crate::spec::Target,
_map: &mut rustc_data_structures::fx::FxHashMap<
super::InlineAsmRegClass,
@ -130,7 +130,7 @@ macro_rules! def_regs {
macro_rules! types {
(
$(_ : $($ty:expr),+;)?
$($feature:literal: $($ty2:expr),+;)*
$($feature:ident: $($ty2:expr),+;)*
) => {
{
use super::InlineAsmType::*;
@ -139,7 +139,7 @@ macro_rules! types {
($ty, None),
)*)?
$($(
($ty2, Some($feature)),
($ty2, Some(rustc_span::sym::$feature)),
)*)*
]
}
@ -289,7 +289,7 @@ impl InlineAsmReg {
pub fn parse(
arch: InlineAsmArch,
has_feature: impl FnMut(&str) -> bool,
has_feature: impl FnMut(Symbol) -> bool,
target: &Target,
name: Symbol,
) -> Result<Self, &'static str> {
@ -510,7 +510,7 @@ impl InlineAsmRegClass {
pub fn supported_types(
self,
arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::X86(r) => r.supported_types(arch),
Self::Arm(r) => r.supported_types(arch),
@ -695,7 +695,7 @@ impl fmt::Display for InlineAsmType {
// falling back to an external assembler.
pub fn allocatable_registers(
arch: InlineAsmArch,
has_feature: impl FnMut(&str) -> bool,
has_feature: impl FnMut(Symbol) -> bool,
target: &crate::spec::Target,
) -> FxHashMap<InlineAsmRegClass, FxHashSet<InlineAsmReg>> {
match arch {
@ -794,7 +794,7 @@ impl InlineAsmClobberAbi {
/// clobber ABIs for the target.
pub fn parse(
arch: InlineAsmArch,
has_feature: impl FnMut(&str) -> bool,
has_feature: impl FnMut(Symbol) -> bool,
target: &Target,
name: Symbol,
) -> Result<Self, &'static [&'static str]> {

View file

@ -1,5 +1,6 @@
use super::{InlineAsmArch, InlineAsmType};
use rustc_macros::HashStable_Generic;
use rustc_span::Symbol;
def_reg_class! {
Nvptx NvptxInlineAsmRegClass {
@ -33,7 +34,7 @@ impl NvptxInlineAsmRegClass {
pub fn supported_types(
self,
_arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::reg16 => types! { _: I8, I16; },
Self::reg32 => types! { _: I8, I16, I32, F32; },

View file

@ -1,5 +1,6 @@
use super::{InlineAsmArch, InlineAsmType};
use rustc_macros::HashStable_Generic;
use rustc_span::Symbol;
use std::fmt;
def_reg_class! {
@ -36,7 +37,7 @@ impl PowerPCInlineAsmRegClass {
pub fn supported_types(
self,
arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::reg | Self::reg_nonzero => {
if arch == InlineAsmArch::PowerPC {

View file

@ -1,6 +1,7 @@
use super::{InlineAsmArch, InlineAsmType};
use crate::spec::Target;
use rustc_macros::HashStable_Generic;
use rustc_span::{sym, Symbol};
use std::fmt;
def_reg_class! {
@ -35,7 +36,7 @@ impl RiscVInlineAsmRegClass {
pub fn supported_types(
self,
arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::reg => {
if arch == InlineAsmArch::RiscV64 {
@ -44,7 +45,7 @@ impl RiscVInlineAsmRegClass {
types! { _: I8, I16, I32, F32; }
}
}
Self::freg => types! { "f": F32; "d": F64; },
Self::freg => types! { f: F32; d: F64; },
Self::vreg => &[],
}
}
@ -52,10 +53,10 @@ impl RiscVInlineAsmRegClass {
fn not_e(
_arch: InlineAsmArch,
mut has_feature: impl FnMut(&str) -> bool,
mut has_feature: impl FnMut(Symbol) -> bool,
_target: &Target,
) -> Result<(), &'static str> {
if has_feature("e") {
if has_feature(sym::e) {
Err("register can't be used with the `e` target feature")
} else {
Ok(())

View file

@ -1,5 +1,6 @@
use super::{InlineAsmArch, InlineAsmType};
use rustc_macros::HashStable_Generic;
use rustc_span::Symbol;
use std::fmt;
def_reg_class! {
@ -33,7 +34,7 @@ impl S390xInlineAsmRegClass {
pub fn supported_types(
self,
arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match (self, arch) {
(Self::reg, _) => types! { _: I8, I16, I32, I64; },
(Self::freg, _) => types! { _: F32, F64; },

View file

@ -1,5 +1,6 @@
use super::{InlineAsmArch, InlineAsmType};
use rustc_macros::HashStable_Generic;
use rustc_span::Symbol;
def_reg_class! {
SpirV SpirVInlineAsmRegClass {
@ -31,7 +32,7 @@ impl SpirVInlineAsmRegClass {
pub fn supported_types(
self,
_arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::reg => {
types! { _: I8, I16, I32, I64, F32, F64; }

View file

@ -1,5 +1,6 @@
use super::{InlineAsmArch, InlineAsmType};
use rustc_macros::HashStable_Generic;
use rustc_span::Symbol;
def_reg_class! {
Wasm WasmInlineAsmRegClass {
@ -31,7 +32,7 @@ impl WasmInlineAsmRegClass {
pub fn supported_types(
self,
_arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::local => {
types! { _: I8, I16, I32, I64, F32, F64; }

View file

@ -1,6 +1,7 @@
use super::{InlineAsmArch, InlineAsmType};
use crate::spec::Target;
use rustc_macros::HashStable_Generic;
use rustc_span::Symbol;
use std::fmt;
def_reg_class! {
@ -101,7 +102,7 @@ impl X86InlineAsmRegClass {
pub fn supported_types(
self,
arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] {
) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self {
Self::reg | Self::reg_abcd => {
if arch == InlineAsmArch::X86_64 {
@ -112,23 +113,23 @@ impl X86InlineAsmRegClass {
}
Self::reg_byte => types! { _: I8; },
Self::xmm_reg => types! {
"sse": I32, I64, F32, F64,
sse: I32, I64, F32, F64,
VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF32(4), VecF64(2);
},
Self::ymm_reg => types! {
"avx": I32, I64, F32, F64,
avx: I32, I64, F32, F64,
VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF32(4), VecF64(2),
VecI8(32), VecI16(16), VecI32(8), VecI64(4), VecF32(8), VecF64(4);
},
Self::zmm_reg => types! {
"avx512f": I32, I64, F32, F64,
avx512f: I32, I64, F32, F64,
VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF32(4), VecF64(2),
VecI8(32), VecI16(16), VecI32(8), VecI64(4), VecF32(8), VecF64(4),
VecI8(64), VecI16(32), VecI32(16), VecI64(8), VecF32(16), VecF64(8);
},
Self::kreg => types! {
"avx512f": I8, I16;
"avx512bw": I32, I64;
avx512f: I8, I16;
avx512bw: I32, I64;
},
Self::mmx_reg | Self::x87_reg => &[],
}
@ -137,7 +138,7 @@ impl X86InlineAsmRegClass {
fn x86_64_only(
arch: InlineAsmArch,
_has_feature: impl FnMut(&str) -> bool,
_has_feature: impl FnMut(Symbol) -> bool,
_target: &Target,
) -> Result<(), &'static str> {
match arch {
@ -149,7 +150,7 @@ fn x86_64_only(
fn high_byte(
arch: InlineAsmArch,
_has_feature: impl FnMut(&str) -> bool,
_has_feature: impl FnMut(Symbol) -> bool,
_target: &Target,
) -> Result<(), &'static str> {
match arch {
@ -160,7 +161,7 @@ fn high_byte(
fn rbx_reserved(
arch: InlineAsmArch,
_has_feature: impl FnMut(&str) -> bool,
_has_feature: impl FnMut(Symbol) -> bool,
_target: &Target,
) -> Result<(), &'static str> {
match arch {
@ -174,7 +175,7 @@ fn rbx_reserved(
fn esi_reserved(
arch: InlineAsmArch,
_has_feature: impl FnMut(&str) -> bool,
_has_feature: impl FnMut(Symbol) -> bool,
_target: &Target,
) -> Result<(), &'static str> {
match arch {