summaryrefslogtreecommitdiff
path: root/src/core/arm/skyeye_common
diff options
context:
space:
mode:
authorGravatar Lioncash2015-07-25 20:19:39 -0400
committerGravatar Lioncash2015-07-25 20:35:18 -0400
commit0191c26521930d439d5474dd2e861ef595405147 (patch)
tree2804060011f6f34e5ca71f7c25ecd5206a5be524 /src/core/arm/skyeye_common
parentdyncom: Move arminit.cpp and armsupp.cpp into skyeye_common (diff)
downloadyuzu-0191c26521930d439d5474dd2e861ef595405147.tar.gz
yuzu-0191c26521930d439d5474dd2e861ef595405147.tar.xz
yuzu-0191c26521930d439d5474dd2e861ef595405147.zip
dyncom: Move helper functions to their own header
Diffstat (limited to 'src/core/arm/skyeye_common')
-rw-r--r--src/core/arm/skyeye_common/armdefs.h34
-rw-r--r--src/core/arm/skyeye_common/armmmu.h1
-rw-r--r--src/core/arm/skyeye_common/armsupp.cpp9
-rw-r--r--src/core/arm/skyeye_common/armsupp.h42
4 files changed, 48 insertions, 38 deletions
diff --git a/src/core/arm/skyeye_common/armdefs.h b/src/core/arm/skyeye_common/armdefs.h
index a0ec108c7..f183b5098 100644
--- a/src/core/arm/skyeye_common/armdefs.h
+++ b/src/core/arm/skyeye_common/armdefs.h
@@ -22,9 +22,6 @@
22#include "common/common_types.h" 22#include "common/common_types.h"
23#include "core/arm/skyeye_common/arm_regformat.h" 23#include "core/arm/skyeye_common/arm_regformat.h"
24 24
25#define BITS(s, a, b) ((s << ((sizeof(s) * 8 - 1) - b)) >> (sizeof(s) * 8 - b + a - 1))
26#define BIT(s, n) ((s >> (n)) & 1)
27
28// Signal levels 25// Signal levels
29enum { 26enum {
30 LOW = 0, 27 LOW = 0,
@@ -47,9 +44,6 @@ enum {
47 ABORT_BASE_UPDATED = 2 44 ABORT_BASE_UPDATED = 2
48}; 45};
49 46
50#define POS(i) ( (~(i)) >> 31 )
51#define NEG(i) ( (i) >> 31 )
52
53typedef u64 ARMdword; // must be 64 bits wide 47typedef u64 ARMdword; // must be 64 bits wide
54typedef u32 ARMword; // must be 32 bits wide 48typedef u32 ARMword; // must be 32 bits wide
55typedef u16 ARMhword; // must be 16 bits wide 49typedef u16 ARMhword; // must be 16 bits wide
@@ -288,31 +282,3 @@ enum {
288 ONCE = 2, // Execute just one iteration 282 ONCE = 2, // Execute just one iteration
289 RUN = 3 // Continuous execution 283 RUN = 3 // Continuous execution
290}; 284};
291
292
293bool AddOverflow(ARMword, ARMword, ARMword);
294bool SubOverflow(ARMword, ARMword, ARMword);
295
296void ARMul_SelectProcessor(ARMul_State*, unsigned);
297
298u32 AddWithCarry(u32, u32, u32, bool*, bool*);
299bool ARMul_AddOverflowQ(ARMword, ARMword);
300
301u8 ARMul_SignedSaturatedAdd8(u8, u8);
302u8 ARMul_SignedSaturatedSub8(u8, u8);
303u16 ARMul_SignedSaturatedAdd16(u16, u16);
304u16 ARMul_SignedSaturatedSub16(u16, u16);
305
306u8 ARMul_UnsignedSaturatedAdd8(u8, u8);
307u16 ARMul_UnsignedSaturatedAdd16(u16, u16);
308u8 ARMul_UnsignedSaturatedSub8(u8, u8);
309u16 ARMul_UnsignedSaturatedSub16(u16, u16);
310u8 ARMul_UnsignedAbsoluteDifference(u8, u8);
311u32 ARMul_SignedSatQ(s32, u8, bool*);
312u32 ARMul_UnsignedSatQ(s32, u8, bool*);
313
314bool InBigEndianMode(ARMul_State*);
315bool InAPrivilegedMode(ARMul_State*);
316
317u32 ReadCP15Register(ARMul_State* cpu, u32 crn, u32 opcode_1, u32 crm, u32 opcode_2);
318void WriteCP15Register(ARMul_State* cpu, u32 value, u32 crn, u32 opcode_1, u32 crm, u32 opcode_2);
diff --git a/src/core/arm/skyeye_common/armmmu.h b/src/core/arm/skyeye_common/armmmu.h
index c67d7209b..6aa2e0771 100644
--- a/src/core/arm/skyeye_common/armmmu.h
+++ b/src/core/arm/skyeye_common/armmmu.h
@@ -24,6 +24,7 @@
24 24
25#include "core/memory.h" 25#include "core/memory.h"
26#include "core/arm/skyeye_common/armdefs.h" 26#include "core/arm/skyeye_common/armdefs.h"
27#include "core/arm/skyeye_common/armsupp.h"
27 28
28// Register numbers in the MMU 29// Register numbers in the MMU
29enum 30enum
diff --git a/src/core/arm/skyeye_common/armsupp.cpp b/src/core/arm/skyeye_common/armsupp.cpp
index 83f7f3e2c..e1d4509c4 100644
--- a/src/core/arm/skyeye_common/armsupp.cpp
+++ b/src/core/arm/skyeye_common/armsupp.cpp
@@ -18,8 +18,9 @@
18#include "common/logging/log.h" 18#include "common/logging/log.h"
19 19
20#include "core/mem_map.h" 20#include "core/mem_map.h"
21#include "core/arm/skyeye_common/armdefs.h"
22#include "core/arm/skyeye_common/arm_regformat.h" 21#include "core/arm/skyeye_common/arm_regformat.h"
22#include "core/arm/skyeye_common/armdefs.h"
23#include "core/arm/skyeye_common/armsupp.h"
23 24
24// Unsigned sum of absolute difference 25// Unsigned sum of absolute difference
25u8 ARMul_UnsignedAbsoluteDifference(u8 left, u8 right) 26u8 ARMul_UnsignedAbsoluteDifference(u8 left, u8 right)
@@ -47,21 +48,21 @@ u32 AddWithCarry(u32 left, u32 right, u32 carry_in, bool* carry_out_occurred, bo
47} 48}
48 49
49// Compute whether an addition of A and B, giving RESULT, overflowed. 50// Compute whether an addition of A and B, giving RESULT, overflowed.
50bool AddOverflow(ARMword a, ARMword b, ARMword result) 51bool AddOverflow(u32 a, u32 b, u32 result)
51{ 52{
52 return ((NEG(a) && NEG(b) && POS(result)) || 53 return ((NEG(a) && NEG(b) && POS(result)) ||
53 (POS(a) && POS(b) && NEG(result))); 54 (POS(a) && POS(b) && NEG(result)));
54} 55}
55 56
56// Compute whether a subtraction of A and B, giving RESULT, overflowed. 57// Compute whether a subtraction of A and B, giving RESULT, overflowed.
57bool SubOverflow(ARMword a, ARMword b, ARMword result) 58bool SubOverflow(u32 a, u32 b, u32 result)
58{ 59{
59 return ((NEG(a) && POS(b) && POS(result)) || 60 return ((NEG(a) && POS(b) && POS(result)) ||
60 (POS(a) && NEG(b) && NEG(result))); 61 (POS(a) && NEG(b) && NEG(result)));
61} 62}
62 63
63// Returns true if the Q flag should be set as a result of overflow. 64// Returns true if the Q flag should be set as a result of overflow.
64bool ARMul_AddOverflowQ(ARMword a, ARMword b) 65bool ARMul_AddOverflowQ(u32 a, u32 b)
65{ 66{
66 u32 result = a + b; 67 u32 result = a + b;
67 if (((result ^ a) & (u32)0x80000000) && ((a ^ b) & (u32)0x80000000) == 0) 68 if (((result ^ a) & (u32)0x80000000) && ((a ^ b) & (u32)0x80000000) == 0)
diff --git a/src/core/arm/skyeye_common/armsupp.h b/src/core/arm/skyeye_common/armsupp.h
new file mode 100644
index 000000000..d82b21107
--- /dev/null
+++ b/src/core/arm/skyeye_common/armsupp.h
@@ -0,0 +1,42 @@
1// Copyright 2014 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include "common/common_types.h"
8
9struct ARMul_State;
10
11#define BITS(s, a, b) ((s << ((sizeof(s) * 8 - 1) - b)) >> (sizeof(s) * 8 - b + a - 1))
12#define BIT(s, n) ((s >> (n)) & 1)
13
14#define POS(i) ( (~(i)) >> 31 )
15#define NEG(i) ( (i) >> 31 )
16
17bool AddOverflow(u32, u32, u32);
18bool SubOverflow(u32, u32, u32);
19
20void ARMul_SelectProcessor(ARMul_State*, unsigned);
21
22u32 AddWithCarry(u32, u32, u32, bool*, bool*);
23bool ARMul_AddOverflowQ(u32, u32);
24
25u8 ARMul_SignedSaturatedAdd8(u8, u8);
26u8 ARMul_SignedSaturatedSub8(u8, u8);
27u16 ARMul_SignedSaturatedAdd16(u16, u16);
28u16 ARMul_SignedSaturatedSub16(u16, u16);
29
30u8 ARMul_UnsignedSaturatedAdd8(u8, u8);
31u16 ARMul_UnsignedSaturatedAdd16(u16, u16);
32u8 ARMul_UnsignedSaturatedSub8(u8, u8);
33u16 ARMul_UnsignedSaturatedSub16(u16, u16);
34u8 ARMul_UnsignedAbsoluteDifference(u8, u8);
35u32 ARMul_SignedSatQ(s32, u8, bool*);
36u32 ARMul_UnsignedSatQ(s32, u8, bool*);
37
38bool InBigEndianMode(ARMul_State*);
39bool InAPrivilegedMode(ARMul_State*);
40
41u32 ReadCP15Register(ARMul_State* cpu, u32 crn, u32 opcode_1, u32 crm, u32 opcode_2);
42void WriteCP15Register(ARMul_State* cpu, u32 value, u32 crn, u32 opcode_1, u32 crm, u32 opcode_2);