From 16228c08b4cbad0620fe09b8afb3da70e3fbb040 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 16 Jun 2008 17:04:06 +0000 Subject: Add support for icache invalidation on non-darwin ppc systems. Patch by Gary Benson! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52332 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPCJITInfo.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'lib/Target/PowerPC/PPCJITInfo.cpp') diff --git a/lib/Target/PowerPC/PPCJITInfo.cpp b/lib/Target/PowerPC/PPCJITInfo.cpp index cbc7353287..db36881ae5 100644 --- a/lib/Target/PowerPC/PPCJITInfo.cpp +++ b/lib/Target/PowerPC/PPCJITInfo.cpp @@ -333,9 +333,26 @@ extern "C" void sys_icache_invalidate(const void *Addr, size_t len); /// SyncICache - On PPC, the JIT emitted code must be explicitly refetched to /// ensure correct execution. static void SyncICache(const void *Addr, size_t len) { -#if (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \ -defined(__APPLE__) +#if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) + +#ifdef __APPLE__ sys_icache_invalidate(Addr, len); +#elif defined(__GNUC__) + const size_t LineSize = 32; + + const intptr_t Mask = ~(LineSize - 1); + const intptr_t StartLine = ((intptr_t) Addr) & Mask; + const intptr_t EndLine = ((intptr_t) Addr + len + LineSize - 1) & Mask; + + for (intptr_t Line = StartLine; Line < EndLine; Line += LineSize) + asm volatile("dcbf 0, %0" : : "r"(Line)); + asm volatile("sync"); + + for (intptr_t Line = StartLine; Line < EndLine; Line += LineSize) + asm volatile("icbi 0, %0" : : "r"(Line)); + asm volatile("isync"); +#endif + #endif } -- cgit v1.2.3