From ccc3cd884efcf76314c66848c341fa63bd3f9a5d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 1 Oct 2015 10:26:16 -0400 Subject: [PATCH 1/3] DSPCore: Use std::array to represent ifx_regs --- Source/Core/Core/DSP/DSPCore.h | 2 +- Source/Core/Core/DSP/DSPHWInterface.cpp | 5 +---- Source/Core/Core/HW/DSPLLE/DSPLLE.cpp | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Source/Core/Core/DSP/DSPCore.h b/Source/Core/Core/DSP/DSPCore.h index 6fa8498268c0..6819a4dcdf0e 100644 --- a/Source/Core/Core/DSP/DSPCore.h +++ b/Source/Core/Core/DSP/DSPCore.h @@ -242,7 +242,7 @@ struct SDSP std::atomic mbox[2]; // Accelerator / DMA / other hardware registers. Not GPRs. - u16 ifx_regs[256]; + std::array ifx_regs; // When state saving, all of the above can just be memcpy'd into the save state. // The below needs special handling. diff --git a/Source/Core/Core/DSP/DSPHWInterface.cpp b/Source/Core/Core/DSP/DSPHWInterface.cpp index 08ba2fa40f3e..b8c1f70bd4b2 100644 --- a/Source/Core/Core/DSP/DSPHWInterface.cpp +++ b/Source/Core/Core/DSP/DSPHWInterface.cpp @@ -21,10 +21,7 @@ static void gdsp_do_dma(); void gdsp_ifx_init() { - for (int i = 0; i < 256; i++) - { - g_dsp.ifx_regs[i] = 0; - } + g_dsp.ifx_regs.fill(0); g_dsp.mbox[0].store(0); g_dsp.mbox[1].store(0); diff --git a/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp b/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp index bbaf19f7cca1..d01540773f5a 100644 --- a/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp +++ b/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp @@ -74,7 +74,7 @@ void DSPLLE::DoState(PointerWrap &p) } p.Do(g_dsp.step_counter); - p.Do(g_dsp.ifx_regs); + p.DoArray(g_dsp.ifx_regs); p.Do(g_dsp.mbox[0]); p.Do(g_dsp.mbox[1]); UnWriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false); From 73f312863df472db36c117cd79808be77d29ccb9 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 1 Oct 2015 11:02:32 -0400 Subject: [PATCH 2/3] DSPCore: Compress common fill loops into std::fill --- Source/Core/Core/DSP/DSPCore.cpp | 35 ++++++++++---------------------- 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/Source/Core/Core/DSP/DSPCore.cpp b/Source/Core/Core/DSP/DSPCore.cpp index bfe7c64b6c10..8c8ad36f0fbc 100644 --- a/Source/Core/Core/DSP/DSPCore.cpp +++ b/Source/Core/Core/DSP/DSPCore.cpp @@ -3,6 +3,9 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. +#include + +#include "Common/CommonFuncs.h" #include "Common/CommonTypes.h" #include "Common/Event.h" #include "Common/FileUtil.h" @@ -115,33 +118,20 @@ bool DSPCore_Init(const DSPInitOptions& opts) memset(&g_dsp.r,0,sizeof(g_dsp.r)); - for (int i = 0; i < 4; i++) - { - g_dsp.reg_stack_ptr[i] = 0; - for (int j = 0; j < DSP_STACK_DEPTH; j++) - { - g_dsp.reg_stack[i][j] = 0; - } - } + std::fill(std::begin(g_dsp.reg_stack_ptr), std::end(g_dsp.reg_stack_ptr), 0); + + for (size_t i = 0; i < ArraySize(g_dsp.reg_stack); i++) + std::fill(std::begin(g_dsp.reg_stack[i]), std::end(g_dsp.reg_stack[i]), 0); // Fill IRAM with HALT opcodes. - for (int i = 0; i < DSP_IRAM_SIZE; i++) - { - g_dsp.iram[i] = 0x0021; // HALT opcode - } + std::fill(g_dsp.iram, g_dsp.iram + DSP_IRAM_SIZE, 0x0021); // Just zero out DRAM. - for (int i = 0; i < DSP_DRAM_SIZE; i++) - { - g_dsp.dram[i] = 0; - } + std::fill(g_dsp.dram, g_dsp.dram + DSP_DRAM_SIZE, 0); // Copied from a real console after the custom UCode has been loaded. // These are the indexing wrapping registers. - g_dsp.r.wr[0] = 0xffff; - g_dsp.r.wr[1] = 0xffff; - g_dsp.r.wr[2] = 0xffff; - g_dsp.r.wr[3] = 0xffff; + std::fill(std::begin(g_dsp.r.wr), std::end(g_dsp.r.wr), 0xffff); g_dsp.r.sr |= SR_INT_ENABLE; g_dsp.r.sr |= SR_EXT_INT_ENABLE; @@ -184,10 +174,7 @@ void DSPCore_Reset() { g_dsp.pc = DSP_RESET_VECTOR; - g_dsp.r.wr[0] = 0xffff; - g_dsp.r.wr[1] = 0xffff; - g_dsp.r.wr[2] = 0xffff; - g_dsp.r.wr[3] = 0xffff; + std::fill(std::begin(g_dsp.r.wr), std::end(g_dsp.r.wr), 0xffff); DSPAnalyzer::Analyze(); } From 75907d83c6e33f6299b828917ced1b35b462d6b6 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 1 Oct 2015 11:45:29 -0400 Subject: [PATCH 3/3] DSPCore: Get rid of division for determining array size in VerifyRoms --- Source/Core/Core/DSP/DSPCore.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Source/Core/Core/DSP/DSPCore.cpp b/Source/Core/Core/DSP/DSPCore.cpp index 8c8ad36f0fbc..2c945a0dd163 100644 --- a/Source/Core/Core/DSP/DSPCore.cpp +++ b/Source/Core/Core/DSP/DSPCore.cpp @@ -4,6 +4,7 @@ // Refer to the license.txt file included. #include +#include #include "Common/CommonFuncs.h" #include "Common/CommonTypes.h" @@ -36,7 +37,9 @@ static bool VerifyRoms() { u32 hash_irom; // dsp_rom.bin u32 hash_drom; // dsp_coef.bin - } KNOWN_ROMS[] = { + }; + + static const std::array known_roms = {{ // Official Nintendo ROM { 0x66f334fe, 0xf3b93527 }, @@ -49,17 +52,17 @@ static bool VerifyRoms() // above with improved resampling coefficients { 0xd9907f71, 0xdb6880c1 } - }; + }}; u32 hash_irom = HashAdler32((u8*)g_dsp.irom, DSP_IROM_BYTE_SIZE); u32 hash_drom = HashAdler32((u8*)g_dsp.coef, DSP_COEF_BYTE_SIZE); int rom_idx = -1; - for (u32 i = 0; i < sizeof (KNOWN_ROMS) / sizeof (KNOWN_ROMS[0]); ++i) + for (size_t i = 0; i < known_roms.size(); ++i) { - DspRomHashes& rom = KNOWN_ROMS[i]; + const DspRomHashes& rom = known_roms[i]; if (hash_irom == rom.hash_irom && hash_drom == rom.hash_drom) - rom_idx = i; + rom_idx = static_cast(i); } if (rom_idx < 0)