Skip to content

Commit 4efe614

Browse files
committed
Use a bitset for the CPU flags
1 parent 1fd76ab commit 4efe614

6 files changed

Lines changed: 70 additions & 64 deletions

File tree

alc/alc.cpp

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -450,24 +450,24 @@ void alc_initconfig()
450450
ERR("Unhandled context suspend behavior setting: \"{}\"", *suspendmode);
451451
}
452452

453-
auto capfilter = 0;
453+
auto capfilter = CPUCapBitset{};
454454
#if HAVE_NEON
455-
capfilter |= CPU_CAP_NEON;
455+
capfilter.set(CPUCap::NEON);
456456
#endif
457457
#if HAVE_SSE4_1
458-
capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3 | CPU_CAP_SSE4_1;
458+
capfilter.set(CPUCap::SSE).set(CPUCap::SSE2).set(CPUCap::SSE3).set(CPUCap::SSE4_1);
459459
#elif HAVE_SSE3
460-
capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3;
460+
capfilter.set(CPUCap::SSE).set(CPUCap::SSE2).set(CPUCap::SSE3);
461461
#elif HAVE_SSE2
462-
capfilter |= CPU_CAP_SSE | CPU_CAP_SSE2;
462+
capfilter.set(CPUCap::SSE).set(CPUCap::SSE2);
463463
#elif HAVE_SSE
464-
capfilter |= CPU_CAP_SSE;
464+
capfilter.set(CPUCap::SSE);
465465
#endif
466466
if(auto cpuopt = ConfigValueStr({}, {}, "disable-cpu-exts"sv))
467467
{
468468
if(auto const cpulist = std::string_view{*cpuopt};
469469
is_eq(al::case_compare(cpulist, "all"sv)))
470-
capfilter = 0;
470+
capfilter.reset();
471471
else
472472
{
473473
std::ranges::for_each(cpulist | std::views::split(','),
@@ -482,15 +482,15 @@ void alc_initconfig()
482482
return;
483483

484484
if(is_eq(al::case_compare(entry, "sse"sv)))
485-
capfilter &= ~CPU_CAP_SSE;
485+
capfilter.reset(CPUCap::SSE);
486486
else if(is_eq(al::case_compare(entry, "sse2"sv)))
487-
capfilter &= ~CPU_CAP_SSE2;
487+
capfilter.reset(CPUCap::SSE2);
488488
else if(is_eq(al::case_compare(entry, "sse3"sv)))
489-
capfilter &= ~CPU_CAP_SSE3;
489+
capfilter.reset(CPUCap::SSE3);
490490
else if(is_eq(al::case_compare(entry, "sse4.1"sv)))
491-
capfilter &= ~CPU_CAP_SSE4_1;
491+
capfilter.reset(CPUCap::SSE4_1);
492492
else if(is_eq(al::case_compare(entry, "neon"sv)))
493-
capfilter &= ~CPU_CAP_NEON;
493+
capfilter.reset(CPUCap::NEON);
494494
else
495495
WARN("Invalid CPU extension \"{}\"", entry);
496496
});
@@ -504,13 +504,18 @@ void alc_initconfig()
504504
TRACE("Name: \"{}\"", cpuopt->mName);
505505
}
506506
auto const caps = cpuopt->mCaps;
507+
auto do_test = [capfilter, caps](CPUCap const cap, std::string_view const on,
508+
std::string_view const off) -> std::string_view
509+
{
510+
return capfilter.test(cap) ? caps.test(cap) ? on : off : ""sv;
511+
};
507512
TRACE("Extensions:{}{}{}{}{}{}",
508-
((capfilter&CPU_CAP_SSE) ?(caps&CPU_CAP_SSE) ?" +SSE"sv : " -SSE"sv : ""sv),
509-
((capfilter&CPU_CAP_SSE2) ?(caps&CPU_CAP_SSE2) ?" +SSE2"sv : " -SSE2"sv : ""sv),
510-
((capfilter&CPU_CAP_SSE3) ?(caps&CPU_CAP_SSE3) ?" +SSE3"sv : " -SSE3"sv : ""sv),
511-
((capfilter&CPU_CAP_SSE4_1)?(caps&CPU_CAP_SSE4_1)?" +SSE4.1"sv : " -SSE4.1"sv : ""sv),
512-
((capfilter&CPU_CAP_NEON) ?(caps&CPU_CAP_NEON) ?" +NEON"sv : " -NEON"sv : ""sv),
513-
(!capfilter) ? " -none-"sv : ""sv);
513+
do_test(CPUCap::SSE, " +SSE"sv, " -SSE"sv),
514+
do_test(CPUCap::SSE2, " +SSE2"sv, " -SSE2"sv),
515+
do_test(CPUCap::SSE3, " +SSE3"sv, " -SSE3"sv),
516+
do_test(CPUCap::SSE4_1, " +SSE4_1"sv, " -SSE4_1"sv),
517+
do_test(CPUCap::NEON, " +NEON"sv, " -NEON"sv),
518+
capfilter.none() ? " -none-"sv : ""sv);
514519
CPUCapFlags = caps & capfilter;
515520
}
516521

alc/alu.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,11 @@ constinit auto MixDirectHrtf = HrtfDirectMixerFunc{MixDirectHrtf_C};
125125
auto SelectHrtfMixer() -> HrtfDirectMixerFunc
126126
{
127127
#if HAVE_NEON
128-
if((CPUCapFlags&CPU_CAP_NEON))
128+
if(CPUCapFlags.test(CPUCap::NEON))
129129
return MixDirectHrtf_NEON;
130130
#endif
131131
#if HAVE_SSE
132-
if((CPUCapFlags&CPU_CAP_SSE))
132+
if(CPUCapFlags.test(CPUCap::SSE))
133133
return MixDirectHrtf_SSE;
134134
#endif
135135

@@ -173,34 +173,34 @@ auto SelectResampler(Resampler const resampler, unsigned const increment) noexce
173173
return Resample_Point_C;
174174
case Resampler::Linear:
175175
#if HAVE_NEON
176-
if((CPUCapFlags&CPU_CAP_NEON))
176+
if(CPUCapFlags[CPUCap::NEON])
177177
return Resample_Linear_NEON;
178178
#endif
179179
#if HAVE_SSE4_1
180-
if((CPUCapFlags&CPU_CAP_SSE4_1))
180+
if(CPUCapFlags[CPUCap::SSE4_1])
181181
return Resample_Linear_SSE4;
182182
#endif
183183
#if HAVE_SSE2
184-
if((CPUCapFlags&CPU_CAP_SSE2))
184+
if(CPUCapFlags[CPUCap::SSE2])
185185
return Resample_Linear_SSE2;
186186
#endif
187187
return Resample_Linear_C;
188188
case Resampler::Spline:
189189
case Resampler::Gaussian:
190190
#if HAVE_NEON
191-
if((CPUCapFlags&CPU_CAP_NEON))
191+
if(CPUCapFlags[CPUCap::NEON])
192192
return Resample_Cubic_NEON;
193193
#endif
194194
#if HAVE_SSE4_1
195-
if((CPUCapFlags&CPU_CAP_SSE4_1))
195+
if(CPUCapFlags[CPUCap::SSE4_1])
196196
return Resample_Cubic_SSE4;
197197
#endif
198198
#if HAVE_SSE2
199-
if((CPUCapFlags&CPU_CAP_SSE2))
199+
if(CPUCapFlags[CPUCap::SSE2])
200200
return Resample_Cubic_SSE2;
201201
#endif
202202
#if HAVE_SSE
203-
if((CPUCapFlags&CPU_CAP_SSE))
203+
if(CPUCapFlags[CPUCap::SSE])
204204
return Resample_Cubic_SSE;
205205
#endif
206206
return Resample_Cubic_C;
@@ -210,11 +210,11 @@ auto SelectResampler(Resampler const resampler, unsigned const increment) noexce
210210
if(increment > MixerFracOne)
211211
{
212212
#if HAVE_NEON
213-
if((CPUCapFlags&CPU_CAP_NEON))
213+
if(CPUCapFlags[CPUCap::NEON])
214214
return Resample_BSinc_NEON;
215215
#endif
216216
#if HAVE_SSE
217-
if((CPUCapFlags&CPU_CAP_SSE))
217+
if(CPUCapFlags[CPUCap::SSE])
218218
return Resample_BSinc_SSE;
219219
#endif
220220
return Resample_BSinc_C;
@@ -224,11 +224,11 @@ auto SelectResampler(Resampler const resampler, unsigned const increment) noexce
224224
case Resampler::FastBSinc24:
225225
case Resampler::FastBSinc48:
226226
#if HAVE_NEON
227-
if((CPUCapFlags&CPU_CAP_NEON))
227+
if(CPUCapFlags[CPUCap::NEON])
228228
return Resample_FastBSinc_NEON;
229229
#endif
230230
#if HAVE_SSE
231-
if((CPUCapFlags&CPU_CAP_SSE))
231+
if(CPUCapFlags[CPUCap::SSE])
232232
return Resample_FastBSinc_SSE;
233233
#endif
234234
return Resample_FastBSinc_C;

core/cpu_caps.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -107,42 +107,42 @@ auto GetCPUInfo() -> std::optional<CPUInfo>
107107
{
108108
cpuregs = get_cpuid(1);
109109
if((cpuregs[3]&(1<<25)))
110-
ret.mCaps |= CPU_CAP_SSE;
111-
if((ret.mCaps&CPU_CAP_SSE) && (cpuregs[3]&(1<<26)))
112-
ret.mCaps |= CPU_CAP_SSE2;
113-
if((ret.mCaps&CPU_CAP_SSE2) && (cpuregs[2]&(1<<0)))
114-
ret.mCaps |= CPU_CAP_SSE3;
115-
if((ret.mCaps&CPU_CAP_SSE3) && (cpuregs[2]&(1<<19)))
116-
ret.mCaps |= CPU_CAP_SSE4_1;
110+
ret.mCaps.set(CPUCap::SSE);
111+
if(ret.mCaps.test(CPUCap::SSE) and (cpuregs[3]&(1<<26)))
112+
ret.mCaps.set(CPUCap::SSE2);
113+
if(ret.mCaps.test(CPUCap::SSE2) and (cpuregs[2]&(1<<0)))
114+
ret.mCaps.set(CPUCap::SSE3);
115+
if(ret.mCaps.test(CPUCap::SSE3) and (cpuregs[2]&(1<<19)))
116+
ret.mCaps.set(CPUCap::SSE4_1);
117117
}
118118

119119
#else
120120

121121
/* Assume support for whatever's supported if we can't check for it */
122122
#if HAVE_SSE4_1
123123
#warning "Assuming SSE 4.1 run-time support!"
124-
ret.mCaps |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3 | CPU_CAP_SSE4_1;
124+
ret.mCaps.set(CPUCap::SSE).set(CPUCap::SSE2).set(CPUCap::SSE3).set(CPUCap::SSE4_1);
125125
#elif HAVE_SSE3
126126
#warning "Assuming SSE 3 run-time support!"
127-
ret.mCaps |= CPU_CAP_SSE | CPU_CAP_SSE2 | CPU_CAP_SSE3;
127+
ret.mCaps.set(CPUCap::SSE).set(CPUCap::SSE2).set(CPUCap::SSE3);
128128
#elif HAVE_SSE2
129129
#warning "Assuming SSE 2 run-time support!"
130-
ret.mCaps |= CPU_CAP_SSE | CPU_CAP_SSE2;
130+
ret.mCaps.set(CPUCap::SSE).set(CPUCap::SSE2);
131131
#elif HAVE_SSE
132132
#warning "Assuming SSE run-time support!"
133-
ret.mCaps |= CPU_CAP_SSE;
133+
ret.mCaps.set(CPUCap::SSE);
134134
#endif
135135
#endif /* CAN_GET_CPUID */
136136

137137
#if HAVE_NEON
138138
#ifdef __ARM_NEON
139-
ret.mCaps |= CPU_CAP_NEON;
139+
ret.mCaps.set(CPUCap::NEON);
140140
#elif defined(_WIN32) && (defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC))
141141
if(IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE))
142-
ret.mCaps |= CPU_CAP_NEON;
142+
ret.mCaps.set(CPUCap::NEON);
143143
#else
144144
#warning "Assuming NEON run-time support!"
145-
ret.mCaps |= CPU_CAP_NEON;
145+
ret.mCaps.set(CPUCap::NEON);
146146
#endif
147147
#endif
148148

core/cpu_caps.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,21 @@
44
#include <optional>
55
#include <string>
66

7+
#include "bitset.hpp"
78

8-
inline int CPUCapFlags{0};
9-
enum {
10-
CPU_CAP_SSE = 1<<0,
11-
CPU_CAP_SSE2 = 1<<1,
12-
CPU_CAP_SSE3 = 1<<2,
13-
CPU_CAP_SSE4_1 = 1<<3,
14-
CPU_CAP_NEON = 1<<4,
9+
10+
enum class CPUCap {
11+
SSE, SSE2, SSE3, SSE4_1, NEON,
12+
Count
1513
};
1614

15+
using CPUCapBitset = al::bitset<CPUCap>;
16+
inline CPUCapBitset CPUCapFlags;
17+
1718
struct CPUInfo {
1819
std::string mVendor;
1920
std::string mName;
20-
int mCaps{0};
21+
CPUCapBitset mCaps;
2122
};
2223

2324
std::optional<CPUInfo> GetCPUInfo();

core/fpu_ctrl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ auto disable_denormals() -> unsigned int
4545
auto sseState = state;
4646
sseState &= ~_MM_FLUSH_ZERO_MASK;
4747
sseState |= _MM_FLUSH_ZERO_ON;
48-
if((CPUCapFlags&CPU_CAP_SSE2))
48+
if(CPUCapFlags.test(CPUCap::SSE2))
4949
{
5050
sseState &= ~_MM_DENORMALS_ZERO_MASK;
5151
sseState |= _MM_DENORMALS_ZERO_ON;
@@ -81,7 +81,7 @@ auto FPUCtl::Set() noexcept -> unsigned int
8181
#else
8282

8383
#if HAVE_SSE
84-
if((CPUCapFlags&CPU_CAP_SSE))
84+
if(CPUCapFlags.test(CPUCap::SSE))
8585
return disable_denormals();
8686
#endif
8787
return 0u;
@@ -93,7 +93,7 @@ void FPUCtl::Reset(unsigned int state [[maybe_unused]]) noexcept
9393
#if HAVE_SSE_INTRINSICS
9494
reset_fpu(state);
9595
#elif HAVE_SSE
96-
if((CPUCapFlags&CPU_CAP_SSE))
96+
if(CPUCapFlags.test(CPUCap::SSE))
9797
reset_fpu(state);
9898
#endif
9999
}

core/voice.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ constinit auto MixHrtfBlendSamples = HrtfMixerBlendFunc{MixHrtfBlend_C};
7474
auto SelectMixer() -> MixerOutFunc
7575
{
7676
#if HAVE_NEON
77-
if((CPUCapFlags&CPU_CAP_NEON))
77+
if(CPUCapFlags.test(CPUCap::NEON))
7878
return Mix_NEON;
7979
#endif
8080
#if HAVE_SSE
81-
if((CPUCapFlags&CPU_CAP_SSE))
81+
if(CPUCapFlags.test(CPUCap::SSE))
8282
return Mix_SSE;
8383
#endif
8484
return Mix_C;
@@ -88,11 +88,11 @@ auto SelectMixer() -> MixerOutFunc
8888
auto SelectMixerOne() -> MixerOneFunc
8989
{
9090
#if HAVE_NEON
91-
if((CPUCapFlags&CPU_CAP_NEON))
91+
if(CPUCapFlags.test(CPUCap::NEON))
9292
return Mix_NEON;
9393
#endif
9494
#if HAVE_SSE
95-
if((CPUCapFlags&CPU_CAP_SSE))
95+
if(CPUCapFlags.test(CPUCap::SSE))
9696
return Mix_SSE;
9797
#endif
9898
return Mix_C;
@@ -101,11 +101,11 @@ auto SelectMixerOne() -> MixerOneFunc
101101
auto SelectHrtfMixer() -> HrtfMixerFunc
102102
{
103103
#if HAVE_NEON
104-
if((CPUCapFlags&CPU_CAP_NEON))
104+
if(CPUCapFlags.test(CPUCap::NEON))
105105
return MixHrtf_NEON;
106106
#endif
107107
#if HAVE_SSE
108-
if((CPUCapFlags&CPU_CAP_SSE))
108+
if(CPUCapFlags.test(CPUCap::SSE))
109109
return MixHrtf_SSE;
110110
#endif
111111
return MixHrtf_C;
@@ -114,11 +114,11 @@ auto SelectHrtfMixer() -> HrtfMixerFunc
114114
auto SelectHrtfBlendMixer() -> HrtfMixerBlendFunc
115115
{
116116
#if HAVE_NEON
117-
if((CPUCapFlags&CPU_CAP_NEON))
117+
if(CPUCapFlags.test(CPUCap::NEON))
118118
return MixHrtfBlend_NEON;
119119
#endif
120120
#if HAVE_SSE
121-
if((CPUCapFlags&CPU_CAP_SSE))
121+
if(CPUCapFlags.test(CPUCap::SSE))
122122
return MixHrtfBlend_SSE;
123123
#endif
124124
return MixHrtfBlend_C;

0 commit comments

Comments
 (0)