@@ -24,7 +24,7 @@ bitflags! {
2424 }
2525}
2626
27- #[ cfg( all ( feature = "instructions" , feature = "inline_asm" ) ) ]
27+ #[ cfg( feature = "instructions" ) ]
2828mod x86_64 {
2929 use super :: * ;
3030 impl XCr0 {
@@ -37,16 +37,22 @@ mod x86_64 {
3737 /// Read the current raw XCR0 value.
3838 #[ inline]
3939 pub fn read_raw ( ) -> u64 {
40- let ( low , high ) : ( u32 , u32 ) ;
40+ # [ cfg ( feature = "inline_asm" ) ]
4141 unsafe {
42+ let ( low, high) : ( u32 , u32 ) ;
4243 asm ! (
4344 "xgetbv" ,
4445 in( "ecx" ) 0 ,
4546 out( "rax" ) low, out( "rdx" ) high,
4647 options( nomem, nostack, preserves_flags) ,
4748 ) ;
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 )
4855 }
49- ( high as u64 ) << 32 | ( low as u64 )
5056 }
5157
5258 /// Write XCR0 flags.
@@ -78,12 +84,17 @@ mod x86_64 {
7884 pub unsafe fn write_raw ( value : u64 ) {
7985 let low = value as u32 ;
8086 let high = ( value >> 32 ) as u32 ;
87+
88+ #[ cfg( feature = "inline_asm" ) ]
8189 asm ! (
8290 "xsetbv" ,
8391 in( "ecx" ) 0 ,
8492 in( "rax" ) low, in( "rdx" ) high,
8593 options( nomem, nostack, preserves_flags) ,
8694 ) ;
95+
96+ #[ cfg( not( feature = "inline_asm" ) ) ]
97+ crate :: asm:: x86_64_asm_xsetbv ( 0 , low, high) ;
8798 }
8899 }
89100}
0 commit comments