From 09764393e0ae2b4cc0414e35f36ddf38aa1a279f Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sat, 16 Oct 2021 10:42:31 +1000 Subject: [PATCH] Common: Add align helpers --- common/Align.h | 76 +++++++++++++++++++++++++++++++++++ common/CMakeLists.txt | 1 + common/common.vcxproj | 1 + common/common.vcxproj.filters | 3 ++ 4 files changed, 81 insertions(+) create mode 100644 common/Align.h diff --git a/common/Align.h b/common/Align.h new file mode 100644 index 0000000000..d240c17286 --- /dev/null +++ b/common/Align.h @@ -0,0 +1,76 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2021 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "common/Pcsx2Defs.h" + +namespace Common +{ + template + static constexpr __fi bool IsAligned(T value, unsigned int alignment) + { + return (value % static_cast(alignment)) == 0; + } + + template + static constexpr __fi T AlignUp(T value, unsigned int alignment) + { + return (value + static_cast(alignment - 1)) / static_cast(alignment) * static_cast(alignment); + } + + template + static constexpr __fi T AlignDown(T value, unsigned int alignment) + { + return value / static_cast(alignment) * static_cast(alignment); + } + + template + static constexpr __fi bool IsAlignedPow2(T value, unsigned int alignment) + { + return (value & static_cast(alignment - 1)) == 0; + } + + template + static constexpr __fi T AlignUpPow2(T value, unsigned int alignment) + { + return (value + static_cast(alignment - 1)) & static_cast(~static_cast(alignment - 1)); + } + + template + static constexpr __fi T AlignDownPow2(T value, unsigned int alignment) + { + return value & static_cast(~static_cast(alignment - 1)); + } + + template + static constexpr __fi bool IsPow2(T value) + { + return (value & (value - 1)) == 0; + } + + template + static constexpr __fi T PreviousPow2(T value) + { + if (value == static_cast(0)) + return 0; + + value |= (value >> 1); + value |= (value >> 2); + value |= (value >> 4); + value |= (value >> 8); + value |= (value >> 16); + return value - (value >> 1); + } +} // namespace Common diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 174f03eab5..21ff56415c 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -57,6 +57,7 @@ target_sources(common PRIVATE # x86emitter headers target_sources(common PRIVATE + Align.h Assertions.h boost_spsc_queue.hpp Console.h diff --git a/common/common.vcxproj b/common/common.vcxproj index 1279726b75..09c4f331bf 100644 --- a/common/common.vcxproj +++ b/common/common.vcxproj @@ -94,6 +94,7 @@ + diff --git a/common/common.vcxproj.filters b/common/common.vcxproj.filters index c35d5215d9..c134c67756 100644 --- a/common/common.vcxproj.filters +++ b/common/common.vcxproj.filters @@ -273,6 +273,9 @@ Header Files + + Header Files +