diff --git a/cpu_ref/rsCpuScript.cpp b/cpu_ref/rsCpuScript.cpp
index 35dfde1..29b1bf8 100644
--- a/cpu_ref/rsCpuScript.cpp
+++ b/cpu_ref/rsCpuScript.cpp
@@ -4,7 +4,7 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
-< *
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
@@ -190,8 +190,8 @@
     return loaded;
 }
 
+#else  // RS_COMPATIBILITY_LIB is not defined
 
-#else  // RS_COMPATIBILITY_LIB is defined
 static bool is_force_recompile() {
 #ifdef RS_SERVER
   return false;
@@ -424,46 +424,15 @@
         setupCompilerCallback(mCompilerDriver);
     }
 
-    const char *core_lib = bcc::RSInfo::LibCLCorePath;
-
     bcinfo::MetadataExtractor ME((const char *) bitcode, bitcodeSize);
     if (!ME.extract()) {
         ALOGE("Could not extract metadata from bitcode");
         return false;
     }
 
-    enum bcinfo::RSFloatPrecision prec = ME.getRSFloatPrecision();
-    switch (prec) {
-    case bcinfo::RS_FP_Imprecise:
-    case bcinfo::RS_FP_Relaxed:
-#if defined(ARCH_ARM_HAVE_NEON) && !defined(ARCH_ARM64_HAVE_NEON)
-        // NEON-capable ARMv7a devices can use an accelerated math library
-        // for all reduced precision scripts.
-        // ARMv8 does not use NEON, as ASIMD can be used with all precision
-        // levels.
-        core_lib = bcc::RSInfo::LibCLCoreNEONPath;
-#endif
-        break;
-    case bcinfo::RS_FP_Full:
-        break;
-    default:
-        ALOGE("Unknown precision for bitcode");
-        return false;
-    }
-
-#if defined(__i386__)
-    // x86 devices will use an optimized library.
-     core_lib = bcc::RSInfo::LibCLCoreX86Path;
-#endif
-
-    RSSelectRTCallback selectRTCallback = mCtx->getSelectRTCallback();
-    if (selectRTCallback != NULL) {
-        core_lib = selectRTCallback((const char *)bitcode, bitcodeSize);
-    }
+    const char* core_lib = findCoreLib(ME, (const char*)bitcode, bitcodeSize);
 
     if (mCtx->getContext()->getContextType() == RS_CONTEXT_TYPE_DEBUG) {
-        // Use the libclcore_debug.bc instead of the default library.
-        core_lib = bcc::RSInfo::LibCLCoreDebugPath;
         mCompilerDriver->setDebugContext(true);
         useRSDebugContext = true;
         // Skip the cache lookup
@@ -733,6 +702,51 @@
 #endif
 }
 
+#ifndef RS_COMPATIBILITY_LIB
+
+#ifdef __LP64__
+#define SYSLIBPATH "/system/lib64"
+#else
+#define SYSLIBPATH "/system/lib"
+#endif
+
+const char* RsdCpuScriptImpl::findCoreLib(const bcinfo::MetadataExtractor& ME, const char* bitcode,
+                                          size_t bitcodeSize) {
+    const char* defaultLib = SYSLIBPATH"/libclcore.bc";
+
+    // If we're debugging, use the debug library.
+    if (mCtx->getContext()->getContextType() == RS_CONTEXT_TYPE_DEBUG) {
+        return SYSLIBPATH"/libclcore_debug.bc";
+    }
+
+    // If a callback has been registered to specify a library, use that.
+    RSSelectRTCallback selectRTCallback = mCtx->getSelectRTCallback();
+    if (selectRTCallback != NULL) {
+        return selectRTCallback((const char*)bitcode, bitcodeSize);
+    }
+
+    // Check for a platform specific library
+#if defined(ARCH_ARM_HAVE_NEON) && !defined(DISABLE_CLCORE_NEON)
+    enum bcinfo::RSFloatPrecision prec = ME.getRSFloatPrecision();
+    if (prec == bcinfo::RS_FP_Imprecise || prec == bcinfo::RS_FP_Relaxed) {
+        // NEON-capable ARMv7a devices can use an accelerated math library
+        // for all reduced precision scripts.
+        // ARMv8 does not use NEON, as ASIMD can be used with all precision
+        // levels.
+        return SYSLIBPATH"/libclcore_neon.bc";
+    } else {
+        return defaultLib;
+    }
+#elif defined(__i386__) || defined(__x86_64__)
+    // x86 devices will use an optimized library.
+    return SYSLIBPATH"/libclcore_x86.bc";
+#else
+    return defaultLib;
+#endif
+}
+
+#endif
+
 void RsdCpuScriptImpl::populateScript(Script *script) {
 #ifndef RS_COMPATIBILITY_LIB
     // Copy info over to runtime
diff --git a/cpu_ref/rsCpuScript.h b/cpu_ref/rsCpuScript.h
index f26a1bc..151120d 100644
--- a/cpu_ref/rsCpuScript.h
+++ b/cpu_ref/rsCpuScript.h
@@ -35,6 +35,10 @@
     class RSExecutable;
 }
 
+namespace bcinfo {
+    class MetadataExtractor;
+}
+
 namespace android {
 namespace renderscript {
 
@@ -108,6 +112,8 @@
     const Script *mScript;
 
 #ifndef RS_COMPATIBILITY_LIB
+    const char* findCoreLib(const bcinfo::MetadataExtractor& ME, const char* bitcode,
+                            size_t bitcodeSize);
     int (*mRoot)();
     int (*mRootExpand)();
     void (*mInit)();
