diff --git a/Common/Math/math_util.cpp b/Common/Math/math_util.cpp index 6e72791f87..9b1a59a755 100644 --- a/Common/Math/math_util.cpp +++ b/Common/Math/math_util.cpp @@ -1,5 +1,44 @@ #include "Common/Math/math_util.h" +#include -#include +// QNX can only use RunFast mode and it is already the default. +#if defined(__ARM_ARCH_7A__) +// Enables 'RunFast' VFP mode. +void EnableFZ() { + int x; + asm( + "fmrx %[result],FPSCR \r\n" + "orr %[result],%[result],#16777216 \r\n" + "fmxr FPSCR,%[result]" + :[result] "=r" (x) : : + ); + //printf("ARM FPSCR: %08x\n",x); +} -// Could delete this file, but might find use again. +// New fastmode code from: http://pandorawiki.org/Floating_Point_Optimization +// These settings turbocharge the slow VFP unit on Cortex-A8 based chips by setting +// restrictions that permit running VFP instructions on the NEON unit. +// Denormal flush-to-zero, for example. +void FPU_SetFastMode() { + static const unsigned int x = 0x04086060; + static const unsigned int y = 0x03000000; + int r; + asm volatile ( + "fmrx %0, fpscr \n\t" //r0 = FPSCR + "and %0, %0, %1 \n\t" //r0 = r0 & 0x04086060 + "orr %0, %0, %2 \n\t" //r0 = r0 | 0x03000000 + "fmxr fpscr, %0 \n\t" //FPSCR = r0 + : "=r"(r) + : "r"(x), "r"(y) + ); +} + +#else + +void EnableFZ() { + // TODO +} + +void FPU_SetFastMode() {} + +#endif diff --git a/Common/Math/math_util.h b/Common/Math/math_util.h index 8f8962cab4..fd47662b54 100644 --- a/Common/Math/math_util.h +++ b/Common/Math/math_util.h @@ -189,3 +189,12 @@ inline uint16_t ShrinkToHalf(float full) { FP16 fp = float_to_half_fast3(fp32); return fp.u; } + +// FPU control. +void EnableFZ(); + +// Enable both FZ and Default-NaN. Is documented to flip some ARM implementation into a "run-fast" mode +// where they can schedule VFP instructions on the NEON unit (these implementations have +// very slow VFP units). +// http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0274h/Babffifj.html +void FPU_SetFastMode(); diff --git a/Qt/QtMain.cpp b/Qt/QtMain.cpp index c6381a112d..bba1f1ae2b 100644 --- a/Qt/QtMain.cpp +++ b/Qt/QtMain.cpp @@ -316,6 +316,7 @@ static int mainInternal(QApplication &a) { emugl->resize(pixel_xres, pixel_yres); emugl->showFullScreen(); #endif + EnableFZ(); // Disable screensaver #if defined(QT_HAS_SYSTEMINFO) QScreenSaver ssObject(emugl); diff --git a/SDL/SDLMain.cpp b/SDL/SDLMain.cpp index 0a6daa5361..da966cabae 100644 --- a/SDL/SDLMain.cpp +++ b/SDL/SDLMain.cpp @@ -807,6 +807,7 @@ int main(int argc, char *argv[]) { } else { joystick = nullptr; } + EnableFZ(); int framecount = 0; bool mouseDown = false; diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 63d241cf46..c90c30a22a 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -807,3 +807,6 @@ void bindDefaultFBO() { [sharedViewController bindDefaultFBO]; } + +void EnableFZ(){}; +void DisableFZ(){};