Pyrogenesis  trunk
cpu.h
Go to the documentation of this file.
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 inline void cpu_Pause()
92 {
93 #if MSC_VERSION && ARCH_X86_X64
94  _mm_pause();
95 #elif GCC_VERSION && ARCH_X86_X64
96  __asm__ __volatile__( "rep; nop" : : : "memory" );
97 #endif
98 }
99 
100 #endif // #ifndef INCLUDED_CPU
int64_t i64
Definition: types.h:35
void cpu_Test()
Definition: cpu.cpp:66
bool cpu_CAS(volatile intptr_t *location, intptr_t expected, intptr_t newValue)
atomic "compare and swap".
Definition: aarch64.cpp:36
intptr_t cpu_AtomicAdd(volatile intptr_t *location, intptr_t increment)
add a signed value to a variable without the possibility of interference from other threads/CPUs...
Definition: aarch64.cpp:31
i64 Status
Error handling system.
Definition: status.h:169
#define T(string_literal)
Definition: secure_crt.cpp:77
const Status CPU_UNKNOWN_OPCODE
Definition: cpu.h:36
const Status CPU_FEATURE_MISSING
Definition: cpu.h:35
Introduction
Definition: debug.h:407
const Status CPU_UNKNOWN_VENDOR
Definition: cpu.h:37
bool cpu_CAS64(volatile i64 *location, i64 expected, i64 newValue)
Definition: aarch64.cpp:41
const char * cpu_IdentifierString()
Definition: aarch64.cpp:46
void cpu_Pause()
pause in spin-wait loops, as a performance optimisation.
Definition: cpu.h:91