@@ -24,7 +24,7 @@ bitflags! {
24
24
}
25
25
}
26
26
27
- #[ cfg( all ( feature = "instructions" , feature = "inline_asm" ) ) ]
27
+ #[ cfg( feature = "instructions" ) ]
28
28
mod x86_64 {
29
29
use super :: * ;
30
30
impl XCr0 {
@@ -37,16 +37,22 @@ mod x86_64 {
37
37
/// Read the current raw XCR0 value.
38
38
#[ inline]
39
39
pub fn read_raw ( ) -> u64 {
40
- let ( low , high ) : ( u32 , u32 ) ;
40
+ # [ cfg ( feature = "inline_asm" ) ]
41
41
unsafe {
42
+ let ( low, high) : ( u32 , u32 ) ;
42
43
asm ! (
43
44
"xgetbv" ,
44
45
in( "ecx" ) 0 ,
45
46
out( "rax" ) low, out( "rdx" ) high,
46
47
options( nomem, nostack, preserves_flags) ,
47
48
) ;
49
+ ( high as u64 ) << 32 | ( low as u64 )
50
+ }
51
+
52
+ #[ cfg( not( feature = "inline_asm" ) ) ]
53
+ unsafe {
54
+ crate :: asm:: x86_64_asm_xgetbv ( 0 )
48
55
}
49
- ( high as u64 ) << 32 | ( low as u64 )
50
56
}
51
57
52
58
/// Write XCR0 flags.
@@ -78,12 +84,17 @@ mod x86_64 {
78
84
pub unsafe fn write_raw ( value : u64 ) {
79
85
let low = value as u32 ;
80
86
let high = ( value >> 32 ) as u32 ;
87
+
88
+ #[ cfg( feature = "inline_asm" ) ]
81
89
asm ! (
82
90
"xsetbv" ,
83
91
in( "ecx" ) 0 ,
84
92
in( "rax" ) low, in( "rdx" ) high,
85
93
options( nomem, nostack, preserves_flags) ,
86
94
) ;
95
+
96
+ #[ cfg( not( feature = "inline_asm" ) ) ]
97
+ crate :: asm:: x86_64_asm_xsetbv ( 0 , low, high) ;
87
98
}
88
99
}
89
100
}
0 commit comments