summaryrefslogtreecommitdiff
path: root/Source/Core/Common
diff options
context:
space:
mode:
authorLéo Lam <leo@innovatetechnologi.es>2016-11-27 11:56:22 +0100
committerLéo Lam <leo@innovatetechnologi.es>2016-12-06 20:33:53 +0100
commit31ccfffd386cdf7bfafdccda240a179431ecc98c (patch)
tree820bdb640091e5726e4c52d42f819956f82bfd28 /Source/Core/Common
parent7192789c1162e2deb5923151d05158f459448ab9 (diff)
Common: Add alignment header
Gets rid of duplicated alignment code.
Diffstat (limited to 'Source/Core/Common')
-rw-r--r--Source/Core/Common/Align.h24
-rw-r--r--Source/Core/Common/Arm64Emitter.cpp6
-rw-r--r--Source/Core/Common/Common.vcxproj3
-rw-r--r--Source/Core/Common/Common.vcxproj.filters3
-rw-r--r--Source/Core/Common/MathUtil.h3
5 files changed, 31 insertions, 8 deletions
diff --git a/Source/Core/Common/Align.h b/Source/Core/Common/Align.h
new file mode 100644
index 0000000000..40c45766d3
--- /dev/null
+++ b/Source/Core/Common/Align.h
@@ -0,0 +1,24 @@
+// This file is under the public domain.
+
+#pragma once
+
+#include <cstddef>
+#include <type_traits>
+
+namespace Common
+{
+template <typename T>
+constexpr T AlignUp(T value, size_t size)
+{
+ static_assert(std::is_unsigned<T>(), "T must be an unsigned value.");
+ return static_cast<T>(value + (size - value % size) % size);
+}
+
+template <typename T>
+constexpr T AlignDown(T value, size_t size)
+{
+ static_assert(std::is_unsigned<T>(), "T must be an unsigned value.");
+ return static_cast<T>(value - value % size);
+}
+
+} // namespace Common
diff --git a/Source/Core/Common/Arm64Emitter.cpp b/Source/Core/Common/Arm64Emitter.cpp
index 3b5a662d70..4fe3b6f0b3 100644
--- a/Source/Core/Common/Arm64Emitter.cpp
+++ b/Source/Core/Common/Arm64Emitter.cpp
@@ -7,10 +7,10 @@
#include <cstring>
#include <vector>
+#include "Common/Align.h"
#include "Common/Arm64Emitter.h"
#include "Common/Assert.h"
#include "Common/CommonTypes.h"
-#include "Common/MathUtil.h"
namespace Arm64Gen
{
@@ -2079,14 +2079,14 @@ bool ARM64XEmitter::MOVI2R2(ARM64Reg Rd, u64 imm1, u64 imm2)
void ARM64XEmitter::ABI_PushRegisters(BitSet32 registers)
{
- int num_regs = registers.Count();
+ unsigned int num_regs = registers.Count();
if (num_regs % 2)
{
bool first = true;
// Stack is required to be quad-word aligned.
- u32 stack_size = ROUND_UP(num_regs * 8, 16);
+ u32 stack_size = Common::AlignUp(num_regs * 8, 16);
u32 current_offset = 0;
std::vector<ARM64Reg> reg_pair;
diff --git a/Source/Core/Common/Common.vcxproj b/Source/Core/Common/Common.vcxproj
index b6cb26cf94..1e88bd5e33 100644
--- a/Source/Core/Common/Common.vcxproj
+++ b/Source/Core/Common/Common.vcxproj
@@ -35,6 +35,7 @@
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemGroup>
+ <ClInclude Include="Align.h" />
<ClInclude Include="Analytics.h" />
<ClInclude Include="Assert.h" />
<ClInclude Include="Atomic.h" />
@@ -211,4 +212,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/Source/Core/Common/Common.vcxproj.filters b/Source/Core/Common/Common.vcxproj.filters
index 8b4876f638..3ad3825e23 100644
--- a/Source/Core/Common/Common.vcxproj.filters
+++ b/Source/Core/Common/Common.vcxproj.filters
@@ -18,6 +18,7 @@
</Filter>
</ItemGroup>
<ItemGroup>
+ <ClInclude Include="Align.h" />
<ClInclude Include="Atomic.h" />
<ClInclude Include="Atomic_GCC.h" />
<ClInclude Include="Atomic_Win32.h" />
@@ -293,4 +294,4 @@
<ItemGroup>
<Natvis Include="BitField.natvis" />
</ItemGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/Source/Core/Common/MathUtil.h b/Source/Core/Common/MathUtil.h
index a38e49bf6d..71bc985456 100644
--- a/Source/Core/Common/MathUtil.h
+++ b/Source/Core/Common/MathUtil.h
@@ -180,9 +180,6 @@ struct Rectangle
float MathFloatVectorSum(const std::vector<float>&);
-#define ROUND_UP(x, a) (((x) + (a)-1) & ~((a)-1))
-#define ROUND_DOWN(x, a) ((x) & ~((a)-1))
-
// Rounds down. 0 -> undefined
inline int IntLog2(u64 val)
{