1
1
forked from 0ad/0ad
0ad/source/lib/sysdep/cpu.h
prefect 6fc1f45fa6 Stab at fixing the VertexArray compile error on VC++.
Added float-to-byte color conversion, including an SSE assembler
version.
Model renderer: Push UV coordinates into a shared vertex array and use
bytes instead of floats for the color array, thereby, significantly
reducing
the total size of vertex arrays.

This was SVN commit r2827.
2005-10-03 03:41:42 +00:00

63 lines
1.5 KiB
C
Executable File

#ifndef SYSDEP_CPU_H
#define SYSDEP_CPU_H
#ifdef __cplusplus
extern "C" {
#endif
const size_t CPU_TYPE_LEN = 49; // processor brand string is <= 48 chars
extern char cpu_type[CPU_TYPE_LEN];
extern double cpu_freq;
// -1 if detect not yet called, or cannot be determined:
extern int cpus; // # packages (i.e. sockets; > 1 => SMP system)
extern int cpu_ht_units; // degree of hyperthreading, typically 2
extern int cpu_cores; // cores per package, typically 2
extern int cpu_speedstep;
extern void cpu_init(void);
// atomic "compare and swap". compare the machine word at <location> against
// <expected>; if not equal, return false; otherwise, overwrite it with
// <new_value> and return true.
extern bool CAS_(uintptr_t* location, uintptr_t expected, uintptr_t new_value);
// this is often used for pointers, so the macro coerces parameters to
// uinptr_t. invalid usage unfortunately also goes through without warnings.
// to catch cases where the caller has passed <expected> as <location> or
// similar mishaps, the implementation verifies <location> is a valid pointer.
#define CAS(l,o,n) CAS_((uintptr_t*)l, (uintptr_t)o, (uintptr_t)n)
extern void atomic_add(intptr_t* location, intptr_t increment);
// enforce strong memory ordering.
extern void mfence();
extern void serialize();
// Win32 CONTEXT field abstraction
// (there's no harm also defining this for other platforms)
#if CPU_AMD64
# define PC_ Rip
# define FP_ Rbp
# define SP_ Rsp
#elif CPU_IA32
# define PC_ Eip
# define FP_ Ebp
# define SP_ Esp
#endif
#ifdef __cplusplus
}
#endif
#endif