Minor decoder optimizations, kernel fixes, cpu backend fixes
This commit is contained in:
@@ -21,8 +21,11 @@ namespace xe {
|
||||
"bad definition for " #type ": must be " #size " bytes")
|
||||
|
||||
// We rely on assert being compiled out in NDEBUG.
|
||||
#if defined(NDEBUG)
|
||||
#define xenia_assert static_cast<void>
|
||||
#else
|
||||
#define xenia_assert assert
|
||||
|
||||
#endif
|
||||
#define __XENIA_EXPAND(x) x
|
||||
#define __XENIA_ARGC(...) \
|
||||
__XENIA_EXPAND(__XENIA_ARGC_IMPL(__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, \
|
||||
|
||||
@@ -170,8 +170,10 @@ CommandVar<T>::CommandVar(const char* name, T* default_value,
|
||||
const char* description)
|
||||
: name_(name),
|
||||
default_value_(*default_value),
|
||||
description_(description),
|
||||
current_value_(default_value) {}
|
||||
current_value_(default_value),
|
||||
commandline_value_(),
|
||||
description_(description)
|
||||
{}
|
||||
|
||||
template <class T>
|
||||
ConfigVar<T>::ConfigVar(const char* name, T* default_value,
|
||||
|
||||
@@ -149,7 +149,7 @@ class Win32FileHandle : public FileHandle {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
bool SetLength(size_t length) {
|
||||
bool SetLength(size_t length) override {
|
||||
LARGE_INTEGER position;
|
||||
position.QuadPart = length;
|
||||
if (!SetFilePointerEx(handle_, position, nullptr, SEEK_SET)) {
|
||||
|
||||
@@ -59,7 +59,7 @@ static void XeCopy16384StreamingAVX(CacheLine* XE_RESTRICT to,
|
||||
|
||||
CacheLine* dest4 = to + (NUM_CACHELINES_IN_PAGE * 3);
|
||||
CacheLine* src4 = from + (NUM_CACHELINES_IN_PAGE * 3);
|
||||
#pragma loop(no_vector)
|
||||
|
||||
for (uint32_t i = 0; i < num_lines_for_8k; ++i) {
|
||||
xe::swcache::CacheLine line0, line1, line2, line3;
|
||||
|
||||
@@ -92,7 +92,6 @@ static void XeCopy16384Movdir64M(CacheLine* XE_RESTRICT to,
|
||||
|
||||
CacheLine* dest4 = to + (NUM_CACHELINES_IN_PAGE * 3);
|
||||
CacheLine* src4 = from + (NUM_CACHELINES_IN_PAGE * 3);
|
||||
#pragma loop(no_vector)
|
||||
for (uint32_t i = 0; i < num_lines_for_8k; ++i) {
|
||||
_movdir64b(dest1 + i, src1 + i);
|
||||
_movdir64b(dest2 + i, src2 + i);
|
||||
|
||||
@@ -620,23 +620,23 @@ static void Prefetch(const void* addr) {
|
||||
}
|
||||
|
||||
template <>
|
||||
void Prefetch<PrefetchTag::Write>(const void* addr) {
|
||||
XE_MAYBE_UNUSED void Prefetch<PrefetchTag::Write>(const void* addr) {
|
||||
PrefetchW(addr);
|
||||
}
|
||||
template <>
|
||||
void Prefetch<PrefetchTag::Nontemporal>(const void* addr) {
|
||||
XE_MAYBE_UNUSED void Prefetch<PrefetchTag::Nontemporal>(const void* addr) {
|
||||
PrefetchNTA(addr);
|
||||
}
|
||||
template <>
|
||||
void Prefetch<PrefetchTag::Level3>(const void* addr) {
|
||||
XE_MAYBE_UNUSED void Prefetch<PrefetchTag::Level3>(const void* addr) {
|
||||
PrefetchL3(addr);
|
||||
}
|
||||
template <>
|
||||
void Prefetch<PrefetchTag::Level2>(const void* addr) {
|
||||
XE_MAYBE_UNUSED void Prefetch<PrefetchTag::Level2>(const void* addr) {
|
||||
PrefetchL2(addr);
|
||||
}
|
||||
template <>
|
||||
void Prefetch<PrefetchTag::Level1>(const void* addr) {
|
||||
XE_MAYBE_UNUSED void Prefetch<PrefetchTag::Level1>(const void* addr) {
|
||||
PrefetchL1(addr);
|
||||
}
|
||||
// todo: does aarch64 have streaming stores/loads?
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace xe {
|
||||
*/
|
||||
|
||||
class alignas(4096) xe_global_mutex {
|
||||
XE_MAYBE_UNUSED
|
||||
char detail[64];
|
||||
|
||||
public:
|
||||
@@ -38,6 +39,7 @@ class alignas(4096) xe_global_mutex {
|
||||
using global_mutex_type = xe_global_mutex;
|
||||
|
||||
class alignas(64) xe_fast_mutex {
|
||||
XE_MAYBE_UNUSED
|
||||
char detail[64];
|
||||
|
||||
public:
|
||||
@@ -62,8 +64,6 @@ class xe_unlikely_mutex {
|
||||
~xe_unlikely_mutex() { mut = 0; }
|
||||
|
||||
void lock() {
|
||||
uint32_t lock_expected = 0;
|
||||
|
||||
if (XE_LIKELY(_tryget())) {
|
||||
return;
|
||||
} else {
|
||||
|
||||
@@ -144,9 +144,11 @@
|
||||
#define XE_MSVC_OPTIMIZE_SMALL()
|
||||
#define XE_MSVC_OPTIMIZE_REVERT()
|
||||
#endif
|
||||
|
||||
#if XE_COMPILER_HAS_GNU_EXTENSIONS == 1
|
||||
#define XE_LIKELY_IF(...) if (XE_LIKELY(__VA_ARGS__))
|
||||
#define XE_UNLIKELY_IF(...) if (XE_UNLIKELY(__VA_ARGS__))
|
||||
#define XE_MAYBE_UNUSED __attribute__((unused))
|
||||
#else
|
||||
#if __cplusplus >= 202002
|
||||
#define XE_LIKELY_IF(...) if (!!(__VA_ARGS__)) [[likely]]
|
||||
@@ -155,6 +157,7 @@
|
||||
#define XE_LIKELY_IF(...) if (!!(__VA_ARGS__))
|
||||
#define XE_UNLIKELY_IF(...) if (!!(__VA_ARGS__))
|
||||
#endif
|
||||
#define XE_MAYBE_UNUSED
|
||||
#endif
|
||||
// only use __restrict if MSVC, for clang/gcc we can use -fstrict-aliasing which
|
||||
// acts as __restrict across the board todo: __restrict is part of the type
|
||||
|
||||
@@ -78,7 +78,9 @@ size_t RingBuffer::Read(uint8_t* buffer, size_t _count) {
|
||||
if (read_offset_ < write_offset_) {
|
||||
assert_true(read_offset_ + count <= write_offset_);
|
||||
} else if (read_offset_ + count >= capacity_) {
|
||||
XE_MAYBE_UNUSED
|
||||
ring_size_t left_half = capacity_ - read_offset_;
|
||||
|
||||
assert_true(count - left_half <= write_offset_);
|
||||
}
|
||||
|
||||
@@ -107,6 +109,7 @@ size_t RingBuffer::Write(const uint8_t* buffer, size_t _count) {
|
||||
if (write_offset_ < read_offset_) {
|
||||
assert_true(write_offset_ + count <= read_offset_);
|
||||
} else if (write_offset_ + count >= capacity_) {
|
||||
XE_MAYBE_UNUSED
|
||||
size_t left_half = capacity_ - write_offset_;
|
||||
assert_true(count - left_half <= read_offset_);
|
||||
}
|
||||
|
||||
@@ -68,7 +68,6 @@ class RingBuffer {
|
||||
ring_size_t offset_delta = write_offs - read_offs;
|
||||
ring_size_t wrap_read_count = (cap - read_offs) + write_offs;
|
||||
|
||||
ring_size_t comparison_value = read_offs <= write_offs;
|
||||
|
||||
if (XE_LIKELY(read_offs <= write_offs)) {
|
||||
return offset_delta; // will be 0 if they are equal, semantically
|
||||
|
||||
@@ -67,8 +67,6 @@ class split_map {
|
||||
void InsertAt(TKey k, TValue v, uint32_t idx) {
|
||||
uint32_t old_size = size();
|
||||
|
||||
bool needs_shiftup = idx != old_size;
|
||||
|
||||
values_.insert(values_.begin() + idx, v);
|
||||
keys_.insert(keys_.begin() + idx, k);
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ void set_name(const std::string_view name) {
|
||||
|
||||
// checked ntoskrnl, it does not modify delay, so we can place this as a
|
||||
// constant and avoid creating a stack variable
|
||||
static const LARGE_INTEGER sleepdelay0_for_maybeyield{0LL};
|
||||
static const LARGE_INTEGER sleepdelay0_for_maybeyield{{0LL}};
|
||||
|
||||
void MaybeYield() {
|
||||
#if 0
|
||||
@@ -314,7 +314,8 @@ class Win32Event : public Win32Handle<Event> {
|
||||
}
|
||||
#endif
|
||||
|
||||
EventInfo Query() { EventInfo result{};
|
||||
EventInfo Query() override {
|
||||
EventInfo result{};
|
||||
NtQueryEventPointer.invoke(handle_, 0, &result, sizeof(EventInfo), nullptr);
|
||||
return result;
|
||||
}
|
||||
@@ -429,7 +430,7 @@ class Win32Timer : public Win32Handle<Timer> {
|
||||
}
|
||||
bool SetRepeatingAt(GClock_::time_point due_time,
|
||||
std::chrono::milliseconds period,
|
||||
std::function<void()> opt_callback = nullptr) {
|
||||
std::function<void()> opt_callback = nullptr) override {
|
||||
return SetRepeatingAt(date::clock_cast<WClock_>(due_time), period,
|
||||
std::move(opt_callback));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user