early-access version 3477
This commit is contained in:
parent
62a9ef1546
commit
d0b302fe1e
7 changed files with 139 additions and 5 deletions
|
@ -210,7 +210,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
||||||
# =======================================================================
|
# =======================================================================
|
||||||
|
|
||||||
# Enforce the search mode of non-required packages for better and shorter failure messages
|
# Enforce the search mode of non-required packages for better and shorter failure messages
|
||||||
find_package(Boost 1.79.0 EXACT REQUIRED COMPONENTS context)
|
find_package(Boost 1.79.0 REQUIRED context)
|
||||||
find_package(enet 1.3 MODULE)
|
find_package(enet 1.3 MODULE)
|
||||||
find_package(fmt 9 REQUIRED)
|
find_package(fmt 9 REQUIRED)
|
||||||
find_package(inih 52 MODULE COMPONENTS INIReader)
|
find_package(inih 52 MODULE COMPONENTS INIReader)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 3476.
|
This is the source code for early-access 3477.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ add_library(common STATIC
|
||||||
common_precompiled_headers.h
|
common_precompiled_headers.h
|
||||||
common_types.h
|
common_types.h
|
||||||
concepts.h
|
concepts.h
|
||||||
|
container_hash.h
|
||||||
demangle.cpp
|
demangle.cpp
|
||||||
demangle.h
|
demangle.h
|
||||||
div_ceil.h
|
div_ceil.h
|
||||||
|
|
91
src/common/container_hash.h
Executable file
91
src/common/container_hash.h
Executable file
|
@ -0,0 +1,91 @@
|
||||||
|
// SPDX-FileCopyrightText: 2005-2014 Daniel James
|
||||||
|
// SPDX-FileCopyrightText: 2016 Austin Appleby
|
||||||
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <limits>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace Common {
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
requires std::is_unsigned_v<T>
|
||||||
|
inline std::size_t HashValue(T val) {
|
||||||
|
const unsigned int size_t_bits = std::numeric_limits<std::size_t>::digits;
|
||||||
|
const unsigned int length =
|
||||||
|
(std::numeric_limits<T>::digits - 1) / static_cast<unsigned int>(size_t_bits);
|
||||||
|
|
||||||
|
std::size_t seed = 0;
|
||||||
|
|
||||||
|
for (unsigned int i = length * size_t_bits; i > 0; i -= size_t_bits) {
|
||||||
|
seed ^= static_cast<size_t>(val >> i) + (seed << 6) + (seed >> 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
seed ^= static_cast<size_t>(val) + (seed << 6) + (seed >> 2);
|
||||||
|
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <size_t Bits>
|
||||||
|
struct HashCombineImpl {
|
||||||
|
template <typename T>
|
||||||
|
static inline T fn(T seed, T value) {
|
||||||
|
seed ^= value + 0x9e3779b9 + (seed << 6) + (seed >> 2);
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct HashCombineImpl<64> {
|
||||||
|
static inline std::uint64_t fn(std::uint64_t h, std::uint64_t k) {
|
||||||
|
const std::uint64_t m = (std::uint64_t(0xc6a4a793) << 32) + 0x5bd1e995;
|
||||||
|
const int r = 47;
|
||||||
|
|
||||||
|
k *= m;
|
||||||
|
k ^= k >> r;
|
||||||
|
k *= m;
|
||||||
|
|
||||||
|
h ^= k;
|
||||||
|
h *= m;
|
||||||
|
|
||||||
|
// Completely arbitrary number, to prevent 0's
|
||||||
|
// from hashing to 0.
|
||||||
|
h += 0xe6546b64;
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline void HashCombine(std::size_t& seed, const T& v) {
|
||||||
|
seed = detail::HashCombineImpl<sizeof(std::size_t) * CHAR_BIT>::fn(seed, detail::HashValue(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename It>
|
||||||
|
inline std::size_t HashRange(It first, It last) {
|
||||||
|
std::size_t seed = 0;
|
||||||
|
|
||||||
|
for (; first != last; ++first) {
|
||||||
|
HashCombine<typename std::iterator_traits<It>::value_type>(seed, *first);
|
||||||
|
}
|
||||||
|
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, size_t Size>
|
||||||
|
std::size_t HashValue(const std::array<T, Size>& v) {
|
||||||
|
return HashRange(v.cbegin(), v.cend());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Allocator>
|
||||||
|
std::size_t HashValue(const std::vector<T, Allocator>& v) {
|
||||||
|
return HashRange(v.cbegin(), v.cend());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Common
|
|
@ -4,6 +4,7 @@
|
||||||
add_executable(tests
|
add_executable(tests
|
||||||
common/bit_field.cpp
|
common/bit_field.cpp
|
||||||
common/cityhash.cpp
|
common/cityhash.cpp
|
||||||
|
common/container_hash.cpp
|
||||||
common/fibers.cpp
|
common/fibers.cpp
|
||||||
common/host_memory.cpp
|
common/host_memory.cpp
|
||||||
common/param_package.cpp
|
common/param_package.cpp
|
||||||
|
|
41
src/tests/common/container_hash.cpp
Executable file
41
src/tests/common/container_hash.cpp
Executable file
|
@ -0,0 +1,41 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include <catch2/catch_test_macros.hpp>
|
||||||
|
|
||||||
|
#include "common/common_types.h"
|
||||||
|
#include "common/container_hash.h"
|
||||||
|
|
||||||
|
TEST_CASE("ContainerHash", "[common]") {
|
||||||
|
constexpr std::array<u8, 32> U8Values{
|
||||||
|
114, 10, 238, 189, 199, 242, 86, 96, 53, 193, 195, 247, 249, 56, 253, 61,
|
||||||
|
205, 3, 172, 4, 210, 197, 43, 72, 103, 8, 99, 89, 5, 97, 68, 196,
|
||||||
|
};
|
||||||
|
constexpr std::array<u16, 32> U16Values{
|
||||||
|
61586, 49151, 3313, 11641, 31695, 54795, 46764, 20965, 23287, 14039, 19265,
|
||||||
|
49093, 58932, 22518, 27139, 42825, 57417, 54237, 48057, 14586, 42813, 32994,
|
||||||
|
33970, 45501, 5619, 15895, 33227, 27509, 25391, 37275, 60218, 17599,
|
||||||
|
};
|
||||||
|
constexpr std::array<u32, 32> U32Values{
|
||||||
|
3838402410, 2029146863, 1730869921, 985528872, 186773874, 2094639868, 3324775932,
|
||||||
|
1795512424, 2571165571, 3256934519, 2358691590, 2752682538, 1484336451, 378124520,
|
||||||
|
3463015699, 3395942161, 1263211979, 3473632889, 3039822212, 2068707357, 2223837919,
|
||||||
|
1823232191, 1583884041, 1264393380, 4087566993, 3188607101, 3933680362, 1464520765,
|
||||||
|
1786838406, 1311734848, 2773642241, 3993641692,
|
||||||
|
};
|
||||||
|
constexpr std::array<u64, 32> U64Values{
|
||||||
|
5908025796157537817, 10947547850358315100, 844798943576724669, 7999662937458523703,
|
||||||
|
4006550374705895164, 1832550525423503632, 9323088254855830976, 12028890075598379412,
|
||||||
|
6021511300787826236, 7864675007938747948, 18099387408859708806, 6438638299316820708,
|
||||||
|
9029399285648501543, 18195459433089960253, 17214335092761966083, 5549347964591337833,
|
||||||
|
14899526073304962015, 5058883181561464475, 7436311795731206973, 7535129567768649864,
|
||||||
|
1287169596809258072, 8237671246353565927, 1715230541978016153, 8443157615068813300,
|
||||||
|
6098675262328527839, 704652094100376853, 1303411723202926503, 7808312933946424854,
|
||||||
|
6863726670433556594, 9870361541383217495, 9273671094091079488, 17541434976160119010,
|
||||||
|
};
|
||||||
|
|
||||||
|
REQUIRE(Common::HashValue(U8Values) == 5867183267093890552);
|
||||||
|
REQUIRE(Common::HashValue(U16Values) == 9594135570564347135);
|
||||||
|
REQUIRE(Common::HashValue(U32Values) == 13123757214696618460);
|
||||||
|
REQUIRE(Common::HashValue(U64Values) == 7296500016546938380);
|
||||||
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <span>
|
#include <span>
|
||||||
|
|
||||||
#include <boost/container_hash/hash.hpp>
|
#include "common/container_hash.h"
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
|
@ -89,7 +89,7 @@ void MacroEngine::Execute(u32 method, const std::vector<u32>& parameters) {
|
||||||
|
|
||||||
if (!mid_method.has_value()) {
|
if (!mid_method.has_value()) {
|
||||||
cache_info.lle_program = Compile(macro_code->second);
|
cache_info.lle_program = Compile(macro_code->second);
|
||||||
cache_info.hash = boost::hash_value(macro_code->second);
|
cache_info.hash = Common::HashValue(macro_code->second);
|
||||||
if (Settings::values.dump_macros) {
|
if (Settings::values.dump_macros) {
|
||||||
Dump(cache_info.hash, macro_code->second);
|
Dump(cache_info.hash, macro_code->second);
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ void MacroEngine::Execute(u32 method, const std::vector<u32>& parameters) {
|
||||||
code.resize(macro_cached.size() - rebased_method);
|
code.resize(macro_cached.size() - rebased_method);
|
||||||
std::memcpy(code.data(), macro_cached.data() + rebased_method,
|
std::memcpy(code.data(), macro_cached.data() + rebased_method,
|
||||||
code.size() * sizeof(u32));
|
code.size() * sizeof(u32));
|
||||||
cache_info.hash = boost::hash_value(code);
|
cache_info.hash = Common::HashValue(code);
|
||||||
cache_info.lle_program = Compile(code);
|
cache_info.lle_program = Compile(code);
|
||||||
if (Settings::values.dump_macros) {
|
if (Settings::values.dump_macros) {
|
||||||
Dump(cache_info.hash, code);
|
Dump(cache_info.hash, code);
|
||||||
|
|
Loading…
Reference in a new issue