Skip to content

Commit 0a74aa2

Browse files
committed
Make abm, bmi1, bmi2, bswap and tbm functions const
1 parent 8bad28c commit 0a74aa2

File tree

10 files changed

+131
-78
lines changed

10 files changed

+131
-78
lines changed

crates/core_arch/src/x86/abm.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ use stdarch_test::assert_instr;
2929
#[target_feature(enable = "lzcnt")]
3030
#[cfg_attr(test, assert_instr(lzcnt))]
3131
#[stable(feature = "simd_x86", since = "1.27.0")]
32-
pub fn _lzcnt_u32(x: u32) -> u32 {
32+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
33+
pub const fn _lzcnt_u32(x: u32) -> u32 {
3334
x.leading_zeros()
3435
}
3536

@@ -40,23 +41,25 @@ pub fn _lzcnt_u32(x: u32) -> u32 {
4041
#[target_feature(enable = "popcnt")]
4142
#[cfg_attr(test, assert_instr(popcnt))]
4243
#[stable(feature = "simd_x86", since = "1.27.0")]
43-
pub fn _popcnt32(x: i32) -> i32 {
44+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
45+
pub const fn _popcnt32(x: i32) -> i32 {
4446
x.count_ones() as i32
4547
}
4648

4749
#[cfg(test)]
4850
mod tests {
51+
use crate::core_arch::assert_eq_const as assert_eq;
4952
use stdarch_test::simd_test;
5053

5154
use crate::core_arch::x86::*;
5255

5356
#[simd_test(enable = "lzcnt")]
54-
unsafe fn test_lzcnt_u32() {
57+
const unsafe fn test_lzcnt_u32() {
5558
assert_eq!(_lzcnt_u32(0b0101_1010), 25);
5659
}
5760

5861
#[simd_test(enable = "popcnt")]
59-
unsafe fn test_popcnt32() {
62+
const unsafe fn test_popcnt32() {
6063
assert_eq!(_popcnt32(0b0101_1010), 4);
6164
}
6265
}

crates/core_arch/src/x86/bmi1.rs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ pub fn _bextr2_u32(a: u32, control: u32) -> u32 {
4646
#[target_feature(enable = "bmi1")]
4747
#[cfg_attr(test, assert_instr(andn))]
4848
#[stable(feature = "simd_x86", since = "1.27.0")]
49-
pub fn _andn_u32(a: u32, b: u32) -> u32 {
49+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
50+
pub const fn _andn_u32(a: u32, b: u32) -> u32 {
5051
!a & b
5152
}
5253

@@ -57,7 +58,8 @@ pub fn _andn_u32(a: u32, b: u32) -> u32 {
5758
#[target_feature(enable = "bmi1")]
5859
#[cfg_attr(test, assert_instr(blsi))]
5960
#[stable(feature = "simd_x86", since = "1.27.0")]
60-
pub fn _blsi_u32(x: u32) -> u32 {
61+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
62+
pub const fn _blsi_u32(x: u32) -> u32 {
6163
x & x.wrapping_neg()
6264
}
6365

@@ -68,7 +70,8 @@ pub fn _blsi_u32(x: u32) -> u32 {
6870
#[target_feature(enable = "bmi1")]
6971
#[cfg_attr(test, assert_instr(blsmsk))]
7072
#[stable(feature = "simd_x86", since = "1.27.0")]
71-
pub fn _blsmsk_u32(x: u32) -> u32 {
73+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
74+
pub const fn _blsmsk_u32(x: u32) -> u32 {
7275
x ^ (x.wrapping_sub(1_u32))
7376
}
7477

@@ -81,7 +84,8 @@ pub fn _blsmsk_u32(x: u32) -> u32 {
8184
#[target_feature(enable = "bmi1")]
8285
#[cfg_attr(test, assert_instr(blsr))]
8386
#[stable(feature = "simd_x86", since = "1.27.0")]
84-
pub fn _blsr_u32(x: u32) -> u32 {
87+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
88+
pub const fn _blsr_u32(x: u32) -> u32 {
8589
x & (x.wrapping_sub(1))
8690
}
8791

@@ -94,7 +98,8 @@ pub fn _blsr_u32(x: u32) -> u32 {
9498
#[target_feature(enable = "bmi1")]
9599
#[cfg_attr(test, assert_instr(tzcnt))]
96100
#[stable(feature = "simd_x86_updates", since = "1.82.0")]
97-
pub fn _tzcnt_u16(x: u16) -> u16 {
101+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
102+
pub const fn _tzcnt_u16(x: u16) -> u16 {
98103
x.trailing_zeros() as u16
99104
}
100105

@@ -107,7 +112,8 @@ pub fn _tzcnt_u16(x: u16) -> u16 {
107112
#[target_feature(enable = "bmi1")]
108113
#[cfg_attr(test, assert_instr(tzcnt))]
109114
#[stable(feature = "simd_x86", since = "1.27.0")]
110-
pub fn _tzcnt_u32(x: u32) -> u32 {
115+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
116+
pub const fn _tzcnt_u32(x: u32) -> u32 {
111117
x.trailing_zeros()
112118
}
113119

@@ -120,7 +126,8 @@ pub fn _tzcnt_u32(x: u32) -> u32 {
120126
#[target_feature(enable = "bmi1")]
121127
#[cfg_attr(test, assert_instr(tzcnt))]
122128
#[stable(feature = "simd_x86", since = "1.27.0")]
123-
pub fn _mm_tzcnt_32(x: u32) -> i32 {
129+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
130+
pub const fn _mm_tzcnt_32(x: u32) -> i32 {
124131
x.trailing_zeros() as i32
125132
}
126133

@@ -131,6 +138,7 @@ unsafe extern "C" {
131138

132139
#[cfg(test)]
133140
mod tests {
141+
use crate::core_arch::assert_eq_const as assert_eq;
134142
use stdarch_test::simd_test;
135143

136144
use crate::core_arch::x86::*;
@@ -142,7 +150,7 @@ mod tests {
142150
}
143151

144152
#[simd_test(enable = "bmi1")]
145-
unsafe fn test_andn_u32() {
153+
const unsafe fn test_andn_u32() {
146154
assert_eq!(_andn_u32(0, 0), 0);
147155
assert_eq!(_andn_u32(0, 1), 1);
148156
assert_eq!(_andn_u32(1, 0), 0);
@@ -165,32 +173,32 @@ mod tests {
165173
}
166174

167175
#[simd_test(enable = "bmi1")]
168-
unsafe fn test_blsi_u32() {
176+
const unsafe fn test_blsi_u32() {
169177
assert_eq!(_blsi_u32(0b1101_0000u32), 0b0001_0000u32);
170178
}
171179

172180
#[simd_test(enable = "bmi1")]
173-
unsafe fn test_blsmsk_u32() {
181+
const unsafe fn test_blsmsk_u32() {
174182
let r = _blsmsk_u32(0b0011_0000u32);
175183
assert_eq!(r, 0b0001_1111u32);
176184
}
177185

178186
#[simd_test(enable = "bmi1")]
179-
unsafe fn test_blsr_u32() {
187+
const unsafe fn test_blsr_u32() {
180188
// TODO: test the behavior when the input is `0`.
181189
let r = _blsr_u32(0b0011_0000u32);
182190
assert_eq!(r, 0b0010_0000u32);
183191
}
184192

185193
#[simd_test(enable = "bmi1")]
186-
unsafe fn test_tzcnt_u16() {
194+
const unsafe fn test_tzcnt_u16() {
187195
assert_eq!(_tzcnt_u16(0b0000_0001u16), 0u16);
188196
assert_eq!(_tzcnt_u16(0b0000_0000u16), 16u16);
189197
assert_eq!(_tzcnt_u16(0b1001_0000u16), 4u16);
190198
}
191199

192200
#[simd_test(enable = "bmi1")]
193-
unsafe fn test_tzcnt_u32() {
201+
const unsafe fn test_tzcnt_u32() {
194202
assert_eq!(_tzcnt_u32(0b0000_0001u32), 0u32);
195203
assert_eq!(_tzcnt_u32(0b0000_0000u32), 32u32);
196204
assert_eq!(_tzcnt_u32(0b1001_0000u32), 4u32);

crates/core_arch/src/x86/bmi2.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ use stdarch_test::assert_instr;
2525
#[cfg_attr(all(test, target_arch = "x86"), assert_instr(mul))]
2626
#[target_feature(enable = "bmi2")]
2727
#[stable(feature = "simd_x86", since = "1.27.0")]
28-
pub fn _mulx_u32(a: u32, b: u32, hi: &mut u32) -> u32 {
28+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
29+
pub const fn _mulx_u32(a: u32, b: u32, hi: &mut u32) -> u32 {
2930
let result: u64 = (a as u64) * (b as u64);
3031
*hi = (result >> 32) as u32;
3132
result as u32
@@ -77,6 +78,7 @@ unsafe extern "C" {
7778

7879
#[cfg(test)]
7980
mod tests {
81+
use crate::core_arch::assert_eq_const as assert_eq;
8082
use stdarch_test::simd_test;
8183

8284
use crate::core_arch::x86::*;
@@ -117,7 +119,7 @@ mod tests {
117119
}
118120

119121
#[simd_test(enable = "bmi2")]
120-
unsafe fn test_mulx_u32() {
122+
const unsafe fn test_mulx_u32() {
121123
let a: u32 = 4_294_967_200;
122124
let b: u32 = 2;
123125
let mut hi = 0;

crates/core_arch/src/x86/bswap.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,20 @@ use stdarch_test::assert_instr;
1010
#[inline]
1111
#[cfg_attr(test, assert_instr(bswap))]
1212
#[stable(feature = "simd_x86", since = "1.27.0")]
13-
pub fn _bswap(x: i32) -> i32 {
13+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
14+
pub const fn _bswap(x: i32) -> i32 {
1415
x.swap_bytes()
1516
}
1617

1718
#[cfg(test)]
1819
mod tests {
20+
use crate::core_arch::assert_eq_const as assert_eq;
21+
use stdarch_test::simd_test;
22+
1923
use super::*;
2024

21-
#[test]
22-
fn test_bswap() {
25+
#[simd_test]
26+
const fn test_bswap() {
2327
assert_eq!(_bswap(0x0EADBE0F), 0x0FBEAD0E);
2428
assert_eq!(_bswap(0x00000000), 0x00000000);
2529
}

crates/core_arch/src/x86/tbm.rs

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ pub fn _bextri_u32<const CONTROL: u32>(a: u32) -> u32 {
4242
#[target_feature(enable = "tbm")]
4343
#[cfg_attr(test, assert_instr(blcfill))]
4444
#[stable(feature = "simd_x86", since = "1.27.0")]
45-
pub fn _blcfill_u32(x: u32) -> u32 {
45+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
46+
pub const fn _blcfill_u32(x: u32) -> u32 {
4647
x & (x.wrapping_add(1))
4748
}
4849

@@ -53,7 +54,8 @@ pub fn _blcfill_u32(x: u32) -> u32 {
5354
#[target_feature(enable = "tbm")]
5455
#[cfg_attr(test, assert_instr(blci))]
5556
#[stable(feature = "simd_x86", since = "1.27.0")]
56-
pub fn _blci_u32(x: u32) -> u32 {
57+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
58+
pub const fn _blci_u32(x: u32) -> u32 {
5759
x | !x.wrapping_add(1)
5860
}
5961

@@ -64,7 +66,8 @@ pub fn _blci_u32(x: u32) -> u32 {
6466
#[target_feature(enable = "tbm")]
6567
#[cfg_attr(test, assert_instr(blcic))]
6668
#[stable(feature = "simd_x86", since = "1.27.0")]
67-
pub fn _blcic_u32(x: u32) -> u32 {
69+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
70+
pub const fn _blcic_u32(x: u32) -> u32 {
6871
!x & x.wrapping_add(1)
6972
}
7073

@@ -76,7 +79,8 @@ pub fn _blcic_u32(x: u32) -> u32 {
7679
#[target_feature(enable = "tbm")]
7780
#[cfg_attr(test, assert_instr(blcmsk))]
7881
#[stable(feature = "simd_x86", since = "1.27.0")]
79-
pub fn _blcmsk_u32(x: u32) -> u32 {
82+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
83+
pub const fn _blcmsk_u32(x: u32) -> u32 {
8084
x ^ x.wrapping_add(1)
8185
}
8286

@@ -87,7 +91,8 @@ pub fn _blcmsk_u32(x: u32) -> u32 {
8791
#[target_feature(enable = "tbm")]
8892
#[cfg_attr(test, assert_instr(blcs))]
8993
#[stable(feature = "simd_x86", since = "1.27.0")]
90-
pub fn _blcs_u32(x: u32) -> u32 {
94+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
95+
pub const fn _blcs_u32(x: u32) -> u32 {
9196
x | x.wrapping_add(1)
9297
}
9398

@@ -98,7 +103,8 @@ pub fn _blcs_u32(x: u32) -> u32 {
98103
#[target_feature(enable = "tbm")]
99104
#[cfg_attr(test, assert_instr(blsfill))]
100105
#[stable(feature = "simd_x86", since = "1.27.0")]
101-
pub fn _blsfill_u32(x: u32) -> u32 {
106+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
107+
pub const fn _blsfill_u32(x: u32) -> u32 {
102108
x | x.wrapping_sub(1)
103109
}
104110

@@ -109,7 +115,8 @@ pub fn _blsfill_u32(x: u32) -> u32 {
109115
#[target_feature(enable = "tbm")]
110116
#[cfg_attr(test, assert_instr(blsic))]
111117
#[stable(feature = "simd_x86", since = "1.27.0")]
112-
pub fn _blsic_u32(x: u32) -> u32 {
118+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
119+
pub const fn _blsic_u32(x: u32) -> u32 {
113120
!x | x.wrapping_sub(1)
114121
}
115122

@@ -121,7 +128,8 @@ pub fn _blsic_u32(x: u32) -> u32 {
121128
#[target_feature(enable = "tbm")]
122129
#[cfg_attr(test, assert_instr(t1mskc))]
123130
#[stable(feature = "simd_x86", since = "1.27.0")]
124-
pub fn _t1mskc_u32(x: u32) -> u32 {
131+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
132+
pub const fn _t1mskc_u32(x: u32) -> u32 {
125133
!x | x.wrapping_add(1)
126134
}
127135

@@ -133,12 +141,14 @@ pub fn _t1mskc_u32(x: u32) -> u32 {
133141
#[target_feature(enable = "tbm")]
134142
#[cfg_attr(test, assert_instr(tzmsk))]
135143
#[stable(feature = "simd_x86", since = "1.27.0")]
136-
pub fn _tzmsk_u32(x: u32) -> u32 {
144+
#[rustc_const_unstable(feature = "stdarch_const_x86", issue = "149298")]
145+
pub const fn _tzmsk_u32(x: u32) -> u32 {
137146
!x & x.wrapping_sub(1)
138147
}
139148

140149
#[cfg(test)]
141150
mod tests {
151+
use crate::core_arch::assert_eq_const as assert_eq;
142152
use stdarch_test::simd_test;
143153

144154
use crate::core_arch::x86::*;
@@ -149,13 +159,13 @@ mod tests {
149159
}
150160

151161
#[simd_test(enable = "tbm")]
152-
unsafe fn test_blcfill_u32() {
162+
const unsafe fn test_blcfill_u32() {
153163
assert_eq!(_blcfill_u32(0b0101_0111u32), 0b0101_0000u32);
154164
assert_eq!(_blcfill_u32(0b1111_1111u32), 0u32);
155165
}
156166

157167
#[simd_test(enable = "tbm")]
158-
unsafe fn test_blci_u32() {
168+
const unsafe fn test_blci_u32() {
159169
assert_eq!(
160170
_blci_u32(0b0101_0000u32),
161171
0b1111_1111_1111_1111_1111_1111_1111_1110u32
@@ -167,25 +177,25 @@ mod tests {
167177
}
168178

169179
#[simd_test(enable = "tbm")]
170-
unsafe fn test_blcic_u32() {
180+
const unsafe fn test_blcic_u32() {
171181
assert_eq!(_blcic_u32(0b0101_0001u32), 0b0000_0010u32);
172182
assert_eq!(_blcic_u32(0b1111_1111u32), 0b1_0000_0000u32);
173183
}
174184

175185
#[simd_test(enable = "tbm")]
176-
unsafe fn test_blcmsk_u32() {
186+
const unsafe fn test_blcmsk_u32() {
177187
assert_eq!(_blcmsk_u32(0b0101_0001u32), 0b0000_0011u32);
178188
assert_eq!(_blcmsk_u32(0b1111_1111u32), 0b1_1111_1111u32);
179189
}
180190

181191
#[simd_test(enable = "tbm")]
182-
unsafe fn test_blcs_u32() {
192+
const unsafe fn test_blcs_u32() {
183193
assert_eq!(_blcs_u32(0b0101_0001u32), 0b0101_0011u32);
184194
assert_eq!(_blcs_u32(0b1111_1111u32), 0b1_1111_1111u32);
185195
}
186196

187197
#[simd_test(enable = "tbm")]
188-
unsafe fn test_blsfill_u32() {
198+
const unsafe fn test_blsfill_u32() {
189199
assert_eq!(_blsfill_u32(0b0101_0100u32), 0b0101_0111u32);
190200
assert_eq!(
191201
_blsfill_u32(0u32),
@@ -194,7 +204,7 @@ mod tests {
194204
}
195205

196206
#[simd_test(enable = "tbm")]
197-
unsafe fn test_blsic_u32() {
207+
const unsafe fn test_blsic_u32() {
198208
assert_eq!(
199209
_blsic_u32(0b0101_0100u32),
200210
0b1111_1111_1111_1111_1111_1111_1111_1011u32
@@ -206,7 +216,7 @@ mod tests {
206216
}
207217

208218
#[simd_test(enable = "tbm")]
209-
unsafe fn test_t1mskc_u32() {
219+
const unsafe fn test_t1mskc_u32() {
210220
assert_eq!(
211221
_t1mskc_u32(0b0101_0111u32),
212222
0b1111_1111_1111_1111_1111_1111_1111_1000u32
@@ -218,7 +228,7 @@ mod tests {
218228
}
219229

220230
#[simd_test(enable = "tbm")]
221-
unsafe fn test_tzmsk_u32() {
231+
const unsafe fn test_tzmsk_u32() {
222232
assert_eq!(_tzmsk_u32(0b0101_1000u32), 0b0000_0111u32);
223233
assert_eq!(_tzmsk_u32(0b0101_1001u32), 0b0000_0000u32);
224234
}

0 commit comments

Comments
 (0)