3
3
#[ allow( unused_imports) ]
4
4
#[ stable( feature = "simd_arch" , since = "1.27.0" ) ]
5
5
pub use crate :: core_arch:: arch:: * ;
6
+ #[ unstable( feature = "naked_functions" , issue = "90957" ) ]
7
+ #[ cfg( bootstrap) ]
8
+ pub use crate :: naked_asm;
6
9
7
10
/// Inline assembly.
8
11
///
@@ -17,6 +20,37 @@ pub macro asm("assembly template", $(operands,)* $(options($(option),*))?) {
17
20
/* compiler built-in */
18
21
}
19
22
23
+ /// Inline assembly used in combination with `#[naked]` functions.
24
+ ///
25
+ /// Refer to [Rust By Example] for a usage guide and the [reference] for
26
+ /// detailed information about the syntax and available options.
27
+ ///
28
+ /// [Rust By Example]: https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html
29
+ /// [reference]: https://doc.rust-lang.org/nightly/reference/inline-assembly.html
30
+ #[ unstable( feature = "naked_functions" , issue = "90957" ) ]
31
+ #[ macro_export]
32
+ #[ cfg( bootstrap) ]
33
+ macro_rules! naked_asm {
34
+ ( [ $last: expr] , [ $( $pushed: expr) ,* ] ) => {
35
+ #[ cfg( any( target_arch = "x86_64" , target_arch = "x86" ) ) ]
36
+ {
37
+ core:: arch:: asm!( $( $pushed) ,* , options( att_syntax, noreturn) )
38
+ }
39
+ #[ cfg( not( any( target_arch = "x86_64" , target_arch = "x86" ) ) ) ]
40
+ {
41
+ core:: arch:: asm!( $( $pushed) ,* , $last, options( noreturn) )
42
+ }
43
+ } ;
44
+
45
+ ( [ $first: expr $( , $rest: expr) * ] , [ $( $pushed: expr) ,* ] ) => {
46
+ naked_asm!( [ $( $rest) ,* ] , [ $( $pushed, ) * $first] ) ;
47
+ } ;
48
+
49
+ ( $( $expr: expr) ,* $( , ) ?) => {
50
+ naked_asm!( [ $( $expr) ,* ] , [ ] ) ;
51
+ } ;
52
+ }
53
+
20
54
/// Inline assembly used in combination with `#[naked]` functions.
21
55
///
22
56
/// Refer to [Rust By Example] for a usage guide and the [reference] for
0 commit comments