Use Symbol for target features in asm handling
This saves a couple of Symbol::intern calls
This commit is contained in:
parent
a34c079752
commit
991cbd1503
20 changed files with 91 additions and 69 deletions
|
@ -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"
|
||||
|
|
|
@ -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(())
|
||||
|
|
|
@ -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; },
|
||||
|
|
|
@ -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(())
|
||||
|
|
|
@ -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; },
|
||||
}
|
||||
|
|
|
@ -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; },
|
||||
|
|
|
@ -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]> {
|
||||
|
|
|
@ -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; },
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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(())
|
||||
|
|
|
@ -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; },
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue