19
19
20
20
#include " gui/widgets/memory_observer.h"
21
21
22
+ #ifdef MEMORY_OBSERVER_X86
22
23
#include < xbyak_util.h>
24
+ #endif
23
25
24
26
#include < magic_enum/include/magic_enum.hpp>
25
27
26
28
#include " core/psxemulator.h"
27
29
#include " core/psxmem.h"
28
30
#include " core/system.h"
29
31
32
+ PCSX::Widgets::MemoryObserver::MemoryObserver () {
33
+ #ifdef MEMORY_OBSERVER_X86
34
+ const auto cpu = Xbyak::util::Cpu ();
35
+ m_useSIMD = cpu.has (Xbyak::util::Cpu::tAVX2);
36
+ #endif
37
+ }
38
+
30
39
void PCSX::Widgets::MemoryObserver::draw (const char * title) {
31
40
if (!ImGui::Begin (title, &m_show)) {
32
41
ImGui::End ();
@@ -204,10 +213,7 @@ void PCSX::Widgets::MemoryObserver::draw(const char* title) {
204
213
}
205
214
206
215
if (ImGui::BeginTabItem (_ (" Pattern search" ))) {
207
- const auto cpu = Xbyak::util::Cpu ();
208
- const bool bHasAvx2 = cpu.has (Xbyak::util::Cpu::tAVX2);
209
-
210
- if (bHasAvx2) {
216
+ if (m_useSIMD) {
211
217
ImGui::Text (_ (" Sequence size: " ));
212
218
ImGui::SameLine ();
213
219
ImGui::RadioButton (_ (" 8 bytes (fast)" ), &m_sequenceSize, 8 );
@@ -222,10 +228,10 @@ void PCSX::Widgets::MemoryObserver::draw(const char* title) {
222
228
ImGui::InputInt (_ (" Step" ), &m_step);
223
229
224
230
if (ImGui::Button (_ (" Search" ))) {
225
- if (bHasAvx2 && m_sequenceSize == 8 ) {
226
- avx2_populateAddressList <8 >(memData, memBase, memSize);
227
- } else if (bHasAvx2 && m_sequenceSize == 16 ) {
228
- avx2_populateAddressList <16 >(memData, memBase, memSize);
231
+ if (m_useSIMD && m_sequenceSize == 8 ) {
232
+ simd_populateAddressList <8 >(memData, memBase, memSize);
233
+ } else if (m_useSIMD && m_sequenceSize == 16 ) {
234
+ simd_populateAddressList <16 >(memData, memBase, memSize);
229
235
} else {
230
236
populateAddressList (memData, memBase, memSize);
231
237
}
@@ -282,6 +288,7 @@ int PCSX::Widgets::MemoryObserver::getMemValue(uint32_t absoluteAddress, const u
282
288
return memValue;
283
289
}
284
290
291
+ #ifdef MEMORY_OBSERVER_X86
285
292
bool PCSX::Widgets::MemoryObserver::all_equal (__m256i input) {
286
293
const auto lane0 = _mm256_castsi256_si128 (input);
287
294
const auto tmp = _mm_shuffle_epi8 (lane0, _mm_setzero_si128 ());
@@ -290,6 +297,7 @@ bool PCSX::Widgets::MemoryObserver::all_equal(__m256i input) {
290
297
291
298
return (static_cast <uint32_t >(_mm256_movemask_epi8 (eq)) == 0xffffffff );
292
299
}
300
+ #endif // MEMORY_OBSERVER_X86
293
301
294
302
std::vector<uint8_t > PCSX::Widgets::MemoryObserver::getShuffleResultsFor (const std::vector<uint8_t >& buffer) {
295
303
const size_t bufferSize = buffer.size ();
0 commit comments