1
1
#[ cfg( test) ]
2
2
use stdarch_test:: assert_instr;
3
3
4
+ // x32 wants to use a 32-bit address size, but asm! defaults to using the full
5
+ // register name (e.g. rax). We have to explicitly override the placeholder to
6
+ // use the 32-bit register name in that case.
7
+ #[ cfg( target_pointer_width = "32" ) ]
8
+ macro_rules! bt {
9
+ ( $inst: expr) => {
10
+ concat!( $inst, " {b}, ({p:e})" )
11
+ } ;
12
+ }
13
+ #[ cfg( target_pointer_width = "64" ) ]
14
+ macro_rules! bt {
15
+ ( $inst: expr) => {
16
+ concat!( $inst, " {b}, ({p})" )
17
+ } ;
18
+ }
19
+
4
20
/// Returns the bit in position `b` of the memory addressed by `p`.
5
21
#[ inline]
6
22
#[ cfg_attr( test, assert_instr( bt) ) ]
7
23
#[ unstable( feature = "simd_x86_bittest" , issue = "59414" ) ]
8
24
pub unsafe fn _bittest64 ( p : * const i64 , b : i64 ) -> u8 {
9
25
let r: u8 ;
10
26
asm ! (
11
- "btq {b}, ({p})" ,
27
+ bt! ( "btq" ) ,
12
28
"setc {r}" ,
13
29
p = in( reg) p,
14
30
b = in( reg) b,
@@ -25,7 +41,7 @@ pub unsafe fn _bittest64(p: *const i64, b: i64) -> u8 {
25
41
pub unsafe fn _bittestandset64 ( p : * mut i64 , b : i64 ) -> u8 {
26
42
let r: u8 ;
27
43
asm ! (
28
- "btsq {b}, ({p})" ,
44
+ bt! ( "btsq" ) ,
29
45
"setc {r}" ,
30
46
p = in( reg) p,
31
47
b = in( reg) b,
@@ -42,7 +58,7 @@ pub unsafe fn _bittestandset64(p: *mut i64, b: i64) -> u8 {
42
58
pub unsafe fn _bittestandreset64 ( p : * mut i64 , b : i64 ) -> u8 {
43
59
let r: u8 ;
44
60
asm ! (
45
- "btrq {b}, ({p})" ,
61
+ bt! ( "btrq" ) ,
46
62
"setc {r}" ,
47
63
p = in( reg) p,
48
64
b = in( reg) b,
@@ -59,7 +75,7 @@ pub unsafe fn _bittestandreset64(p: *mut i64, b: i64) -> u8 {
59
75
pub unsafe fn _bittestandcomplement64 ( p : * mut i64 , b : i64 ) -> u8 {
60
76
let r: u8 ;
61
77
asm ! (
62
- "btcq {b}, ({p})" ,
78
+ bt! ( "btcq" ) ,
63
79
"setc {r}" ,
64
80
p = in( reg) p,
65
81
b = in( reg) b,
0 commit comments