gpt4 book ai didi

rust - 如何根据使用宏的体系结构定义具有不同调用约定的函数?

转载 作者:行者123 更新时间:2023-11-29 08:08:40 26 4
gpt4 key购买 nike

我正在用 Rust 开发一种小型语言。为了提高性能,我想对 x86 使用 fastcall 调用约定。 ARM 不支持 “fastcall” ABI。

对于 x86:

fn add_primitive(&mut self, name: &str, action: extern "fastcall" fn(&mut Self)) {
...
}

extern "fastcall" fn a_primitive(&mut self) {}

对于 ARM:

fn add_primitive(&mut self, name: &str, action: fn(&mut Self)) {
...
}

fn a_primitive(&mut self) {}

使用C我可以定义一个宏

#ifdef x86
#define PRIMITIVE extern "fastcall" fn
#endif
#ifdef arm
#define PRIMITIVE fn
#endif

fn add_primitive(&mut self, name: &str, action: PRIMITIVE(&mut Self)) {
...
}

PRIMITIVE a_primitive(&mut self) {}

我不知道如何使用 Rust 的宏系统来解决这个问题。

编辑:

我需要两个不同的宏。我知道如何使用 target_arch 来定义不同版本的函数而不是宏。

最佳答案

#[cfg(target_arch = "arm")]
#[macro_export]
macro_rules! primitive {
(fn $args:tt) => { fn $args };
(fn $f:ident $args:tt $body:tt) => { fn $f $args $body };
(fn $f:ident $args:tt -> isize $body:tt) => { fn $f $args -> isize $body };
}

#[cfg(target_arch = "x86")]
#[macro_export]
macro_rules! primitive {
(fn $args:tt) => { extern "fastcall" fn $args };
(fn $f:ident $args:tt $body:tt) => { extern "fastcall" fn $f $args $body };
(fn $f:ident $args:tt -> isize $body:tt) => { extern "fastcall" fn $f $args -> isize $body };
}

例子:

pub struct Word<Target> {
symbol: Symbol,
is_immediate: bool,
is_compile_only: bool,
hidden: bool,
dfa: usize,
cfa: usize,
action: primitive!{ fn (&mut Target) },
pub(crate) compilation_semantics: fn(&mut Target, usize),
}

primitive!{fn dup(&mut self) {
let slen = self.s_stack().len.wrapping_add(1);
self.s_stack().len = slen;
self.s_stack()[slen.wrapping_sub(1)] = self.s_stack()[slen.wrapping_sub(2)];
}}

关于rust - 如何根据使用宏的体系结构定义具有不同调用约定的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44369360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com