Line data Source code
1 : /* Copyright (C) 2022 Wildfire Games.
2 : *
3 : * Permission is hereby granted, free of charge, to any person obtaining
4 : * a copy of this software and associated documentation files (the
5 : * "Software"), to deal in the Software without restriction, including
6 : * without limitation the rights to use, copy, modify, merge, publish,
7 : * distribute, sublicense, and/or sell copies of the Software, and to
8 : * permit persons to whom the Software is furnished to do so, subject to
9 : * the following conditions:
10 : *
11 : * The above copyright notice and this permission notice shall be included
12 : * in all copies or substantial portions of the Software.
13 : *
14 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 : * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 : * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 : * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18 : * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19 : * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20 : * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 : */
22 :
23 : /*
24 : * CPU and memory detection.
25 : */
26 :
27 : #ifndef INCLUDED_CPU
28 : #define INCLUDED_CPU
29 :
30 : #include "lib/sysdep/compiler.h"
31 :
32 :
33 : namespace ERR
34 : {
35 : const Status CPU_FEATURE_MISSING = -130000;
36 : const Status CPU_UNKNOWN_OPCODE = -130001;
37 : const Status CPU_UNKNOWN_VENDOR = -130002;
38 :
39 : }
40 :
41 :
42 : //-----------------------------------------------------------------------------
43 : // CPU detection
44 :
45 : /**
46 : * @return string identifying the CPU (usually a cleaned-up version of the
47 : * brand string)
48 : **/
49 : const char* cpu_IdentifierString();
50 :
51 :
52 : //-----------------------------------------------------------------------------
53 : // lock-free support routines
54 :
55 : /**
56 : * add a signed value to a variable without the possibility of interference
57 : * from other threads/CPUs.
58 : *
59 : * @return the previous value.
60 : **/
61 : intptr_t cpu_AtomicAdd(volatile intptr_t* location, intptr_t increment);
62 :
63 : /**
64 : * atomic "compare and swap".
65 : *
66 : * @param location address of the word to compare and possibly overwrite
67 : * @param expected its expected value
68 : * @param newValue the value with which to replace it
69 : * @return false if the target word doesn't match the expected value,
70 : * otherwise true (also overwriting the contents of location)
71 : **/
72 : bool cpu_CAS(volatile intptr_t* location, intptr_t expected, intptr_t newValue);
73 : bool cpu_CAS64(volatile i64* location, i64 expected, i64 newValue);
74 :
75 : /**
76 : * specialization of cpu_CAS for pointer types. this avoids error-prone
77 : * casting in user code.
78 : **/
79 : template<typename T>
80 : inline bool cpu_CAS(volatile T* location, T expected, T new_value)
81 : {
82 : return cpu_CAS((volatile intptr_t*)location, (intptr_t)expected, (intptr_t)new_value);
83 : }
84 :
85 :
86 : void cpu_Test();
87 :
88 : /**
89 : * pause in spin-wait loops, as a performance optimisation.
90 : **/
91 0 : inline void cpu_Pause()
92 : {
93 : #if MSC_VERSION && ARCH_X86_X64
94 : _mm_pause();
95 : #elif GCC_VERSION && ARCH_X86_X64
96 0 : __asm__ __volatile__( "rep; nop" : : : "memory" );
97 : #endif
98 0 : }
99 :
100 : #endif // #ifndef INCLUDED_CPU
|