21
21
22
22
#include < stdint.h>
23
23
24
+ #include < array>
24
25
#include < vector>
25
26
26
27
#include " imgui.h"
27
-
28
- #include < array>
29
28
#include " immintrin.h"
30
29
31
30
namespace PCSX {
32
31
33
32
namespace Widgets {
34
33
35
34
class MemoryObserver {
36
- public:
35
+ public:
37
36
void draw (const char * title);
38
37
bool m_show = false ;
39
38
40
- private:
39
+ private:
41
40
static int getMemValue (uint32_t absoluteAddress, const uint8_t * memData, uint32_t memSize, uint32_t memBase,
42
41
uint8_t stride);
43
42
@@ -56,11 +55,7 @@ class MemoryObserver {
56
55
UnknownInitialValue
57
56
};
58
57
59
- enum class ScanAlignment : uint8_t {
60
- OneByte = 1 ,
61
- TwoBytes = 2 ,
62
- FourBytes = 4
63
- };
58
+ enum class ScanAlignment : uint8_t { OneByte = 1 , TwoBytes = 2 , FourBytes = 4 };
64
59
65
60
struct AddressValuePair {
66
61
uint32_t address = 0 ;
@@ -89,44 +84,29 @@ class MemoryObserver {
89
84
90
85
switch (mask) {
91
86
case 0 : {
92
- const auto firstShuffleMask = _mm256_set_epi8 (
93
- 3 , 2 , 1 , 0 , 7 , 6 , 5 , 4 ,
94
- 2 , 1 , 0 , 7 , 6 , 5 , 4 , 3 ,
95
- 1 , 0 , 7 , 6 , 5 , 4 , 3 , 2 ,
96
- 0 , 7 , 6 , 5 , 4 , 3 , 2 , 1
97
- );
87
+ const auto firstShuffleMask = _mm256_set_epi8 (3 , 2 , 1 , 0 , 7 , 6 , 5 , 4 , 2 , 1 , 0 , 7 , 6 , 5 , 4 , 3 , 1 , 0 , 7 ,
88
+ 6 , 5 , 4 , 3 , 2 , 0 , 7 , 6 , 5 , 4 , 3 , 2 , 1 );
98
89
const auto firstShuffle = _mm256_shuffle_epi8 (twoCopies, firstShuffleMask);
99
90
return _mm256_cmpeq_epi8 (twoCopies, firstShuffle);
100
91
}
101
92
case 1 : {
102
- const auto secondShuffleMask = _mm256_set_epi8 (
103
- 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 ,
104
- 6 , 5 , 4 , 3 , 2 , 1 , 0 , 7 ,
105
- 5 , 4 , 3 , 2 , 1 , 0 , 7 , 6 ,
106
- 4 , 3 , 2 , 1 , 0 , 7 , 6 , 5
107
- );
93
+ const auto secondShuffleMask = _mm256_set_epi8 (7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 , 6 , 5 , 4 , 3 , 2 , 1 , 0 , 7 , 5 , 4 , 3 ,
94
+ 2 , 1 , 0 , 7 , 6 , 4 , 3 , 2 , 1 , 0 , 7 , 6 , 5 );
108
95
const auto secondShuffle = _mm256_shuffle_epi8 (twoCopies, secondShuffleMask);
109
96
return _mm256_cmpeq_epi8 (twoCopies, secondShuffle);
110
97
}
111
98
case 2 : {
112
99
assert (bufferSize == 16 );
113
- const auto thirdShuffleMask = _mm256_set_epi8 (
114
- 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 ,
115
- 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 ,
116
- 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 ,
117
- 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1
118
- );
100
+ const auto thirdShuffleMask = _mm256_set_epi8 (11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 9 , 8 ,
101
+ 7 , 6 , 5 , 4 , 3 , 2 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 );
119
102
const auto thirdShuffle = _mm256_shuffle_epi8 (twoCopies, thirdShuffleMask);
120
103
return _mm256_cmpeq_epi8 (twoCopies, thirdShuffle);
121
104
}
122
105
case 3 : {
123
106
assert (bufferSize == 16 );
124
- const auto fourthShuffleMask = _mm256_set_epi8 (
125
- 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 ,
126
- 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 ,
127
- 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 ,
128
- 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5
129
- );
107
+ const auto fourthShuffleMask =
108
+ _mm256_set_epi8 (15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 13 , 12 , 11 , 10 , 9 , 8 , 7 ,
109
+ 6 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 );
130
110
const auto fourthShuffle = _mm256_shuffle_epi8 (twoCopies, fourthShuffleMask);
131
111
return _mm256_cmpeq_epi8 (twoCopies, fourthShuffle);
132
112
}
@@ -139,15 +119,13 @@ class MemoryObserver {
139
119
void avx2_populateAddressList (const uint8_t * memData, uint32_t memBase, uint32_t memSize) {
140
120
static_assert (bufferSize == 8 || bufferSize == 16 );
141
121
142
- alignas (32 ) auto buffer = std::array<uint8_t , bufferSize>{};
143
- alignas (32 ) auto extendedBuffer = std::array<uint8_t , 32 >{};
122
+ alignas (32 ) auto buffer = std::array<uint8_t , bufferSize>{};
123
+ alignas (32 ) auto extendedBuffer = std::array<uint8_t , 32 >{};
144
124
145
125
const auto sequenceSize = m_sequenceSize;
146
126
std::copy_n (m_sequence, sequenceSize, buffer.data ());
147
- auto patternShuffleResults = std::vector<__m256i>{
148
- avx2_getShuffleResultsFor (buffer, extendedBuffer, 0 ),
149
- avx2_getShuffleResultsFor (buffer, extendedBuffer, 1 )
150
- };
127
+ auto patternShuffleResults = std::vector<__m256i>{avx2_getShuffleResultsFor (buffer, extendedBuffer, 0 ),
128
+ avx2_getShuffleResultsFor (buffer, extendedBuffer, 1 )};
151
129
if constexpr (bufferSize == 16 ) {
152
130
patternShuffleResults.push_back (avx2_getShuffleResultsFor (buffer, extendedBuffer, 2 ));
153
131
patternShuffleResults.push_back (avx2_getShuffleResultsFor (buffer, extendedBuffer, 3 ));
@@ -160,8 +138,8 @@ class MemoryObserver {
160
138
161
139
bool bAllEqual = true ;
162
140
for (auto j = 0u ; j < patternShuffleResults.size (); ++j) {
163
- bAllEqual = all_equal (_mm256_cmpeq_epi8 (patternShuffleResults[j],
164
- avx2_getShuffleResultsFor (buffer, extendedBuffer, j)));
141
+ bAllEqual = all_equal (
142
+ _mm256_cmpeq_epi8 (patternShuffleResults[j], avx2_getShuffleResultsFor (buffer, extendedBuffer, j)));
165
143
if (!bAllEqual) {
166
144
break ;
167
145
}
@@ -184,6 +162,6 @@ class MemoryObserver {
184
162
std::vector<uint32_t > m_addresses;
185
163
};
186
164
187
- }
165
+ } // namespace Widgets
188
166
189
- }
167
+ } // namespace PCSX
0 commit comments