summaryrefslogtreecommitdiff
path: root/Runtime/Utilities/Prefetch.h
diff options
context:
space:
mode:
Diffstat (limited to 'Runtime/Utilities/Prefetch.h')
-rw-r--r--Runtime/Utilities/Prefetch.h52
1 files changed, 52 insertions, 0 deletions
diff --git a/Runtime/Utilities/Prefetch.h b/Runtime/Utilities/Prefetch.h
new file mode 100644
index 0000000..d18922f
--- /dev/null
+++ b/Runtime/Utilities/Prefetch.h
@@ -0,0 +1,52 @@
+#ifndef PREFETCH_H
+#define PREFETCH_H
+
+#if UNITY_PS3
+#include <ppu_intrinsics.h>
+#endif
+
+// This assembly will not work for Jungle. TODO: use arm version check here
+#if defined(__arm__) && !UNITY_LINUX && !UNITY_WINRT
+
+inline void Prefetch(const void* p)
+{
+ unsigned char* pCurr = (unsigned char*)p;
+ asm volatile(
+ "pld [%0] \n\t"
+ : "=r" (pCurr)
+ : "0" (pCurr)
+ : "r0");
+}
+
+inline void Prefetch(const void* p, size_t size)
+{
+ unsigned char* pCurr = (unsigned char*)p;
+ unsigned char* pEnd = pCurr + size;
+
+ while (pCurr < pEnd)
+ {
+ asm volatile(
+ "pld [%0] \n\t"
+ : "=r" (pCurr)
+ : "0" (pCurr)
+ : "r0");
+ pCurr += 32;
+ }
+}
+
+#elif defined(_XBOX)
+__forceinline void Prefetch(const void* p, size_t size = 32)
+{
+ __dcbt(0, p);
+}
+#elif UNITY_PS3
+inline void Prefetch(const void* p, size_t size = 32)
+{
+ __dcbt(p);
+}
+#else
+//@TODO: gcc __builtin_prefetch(p); profile & enable
+inline void Prefetch(const void* /*p*/, size_t /*size*/ = 32) { }
+#endif
+
+#endif