merge in jb-release history after reset to jb-dev
diff --git a/Android.mk b/Android.mk
index 2aca0da..3285f93 100644
--- a/Android.mk
+++ b/Android.mk
@@ -147,6 +147,10 @@
 # installed.
 LOCAL_REQUIRED_MODULES := libclcore.bc libbcc.so.sha1
 
+ifeq ($(ARCH_ARM_HAVE_NEON),true)
+LOCAL_REQUIRED_MODULES += libclcore_neon.bc
+endif
+
 # Link-Time Optimization on libbcc.so
 #
 # -Wl,--exclude-libs=ALL only applies to library archives. It would hide most
diff --git a/lib/ExecutionEngine/Compiler.cpp b/lib/ExecutionEngine/Compiler.cpp
index 58a49c5..cf18ef6 100644
--- a/lib/ExecutionEngine/Compiler.cpp
+++ b/lib/ExecutionEngine/Compiler.cpp
@@ -186,19 +186,13 @@
 #  endif
 #  endif
 
-#  if defined(ARCH_ARM_HAVE_NEON)
+#  if defined(ARCH_ARM_HAVE_NEON) && !defined(DISABLE_ARCH_ARM_HAVE_NEON)
     Features.push_back("+neon");
     Features.push_back("+neonfp");
 #  else
     Features.push_back("-neon");
     Features.push_back("-neonfp");
 #  endif
-
-// FIXME(all): Turn NEON back on after debugging the rebase.
-#  if 1 || defined(DISABLE_ARCH_ARM_HAVE_NEON)
-    Features.push_back("-neon");
-    Features.push_back("-neonfp");
-#  endif
   }
 
   // Register the scheduler
@@ -252,6 +246,8 @@
   llvm::TargetData *TD = NULL;
   llvm::TargetMachine *TM = NULL;
 
+  std::vector<std::string> ExtraFeatures;
+
   std::string FeaturesStr;
 
   if (mModule == NULL)  // No module was loaded
@@ -305,12 +301,12 @@
 #if defined(ARCH_ARM_HAVE_NEON)
   // Full-precision means we have to disable NEON
   if (ME.getRSFloatPrecision() == bcinfo::RS_FP_Full) {
-    Features.push_back("-neon");
-    Features.push_back("-neonfp");
+    ExtraFeatures.push_back("-neon");
+    ExtraFeatures.push_back("-neonfp");
   }
 #endif
 
-  if (!CPU.empty() || !Features.empty()) {
+  if (!CPU.empty() || !Features.empty() || !ExtraFeatures.empty()) {
     llvm::SubtargetFeatures F;
 
     for (std::vector<std::string>::const_iterator
@@ -318,6 +314,11 @@
       F.AddFeature(*I);
     }
 
+    for (std::vector<std::string>::const_iterator
+         I = ExtraFeatures.begin(), E = ExtraFeatures.end(); I != E; I++) {
+      F.AddFeature(*I);
+    }
+
     FeaturesStr = F.getString();
   }
 
diff --git a/lib/ScriptCRT/Android.mk b/lib/ScriptCRT/Android.mk
index d439181..f8b6d80 100644
--- a/lib/ScriptCRT/Android.mk
+++ b/lib/ScriptCRT/Android.mk
@@ -16,10 +16,27 @@
 
 LOCAL_PATH := $(call my-dir)
 
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclcore.bc
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+# C/LLVM-IR source files for the library
+clcore_base_files := \
+    rs_allocation.c \
+    rs_cl.c \
+    rs_core.c \
+    rs_element.c \
+    rs_mesh.c \
+    rs_program.c \
+    rs_sample.c \
+    rs_sampler.c \
+    convert.ll \
+    matrix.ll \
+    pixel_packing.ll
+
+clcore_files := \
+    $(clcore_base_files) \
+    clamp.c
+
+clcore_neon_files := \
+    $(clcore_base_files) \
+    neon/clamp.ll
 
 ifeq "REL" "$(PLATFORM_VERSION_CODENAME)"
   RS_VERSION := $(PLATFORM_SDK_VERSION)
@@ -30,56 +47,22 @@
   RS_VERSION := "(1 + $(PLATFORM_SDK_VERSION))"
 endif
 
-# C source files for the library
-clcore_c_files := \
-    clamp.c \
-    rs_allocation.c \
-    rs_cl.c \
-    rs_core.c \
-    rs_element.c \
-    rs_mesh.c \
-    rs_program.c \
-    rs_sample.c \
-    rs_sampler.c
+# Build the base version of the library
+include $(CLEAR_VARS)
+LOCAL_MODULE := libclcore.bc
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_SRC_FILES := $(clcore_files)
 
-# Hand-written bitcode for the library
-clcore_ll_files := \
-    convert.ll \
-    matrix.ll \
-    pixel_packing.ll
+include $(LOCAL_PATH)/build_bc_lib.mk
 
-include $(BUILD_SYSTEM)/base_rules.mk
+# Build a NEON-enabled version of the library (if possible)
+ifeq ($(ARCH_ARM_HAVE_NEON),true)
+include $(CLEAR_VARS)
+LOCAL_MODULE := libclcore_neon.bc
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_SRC_FILES := $(clcore_neon_files)
 
-clcore_CLANG := $(HOST_OUT_EXECUTABLES)/clang$(HOST_EXECUTABLE_SUFFIX)
-clcore_LLVM_LINK := $(HOST_OUT_EXECUTABLES)/llvm-link$(HOST_EXECUTABLE_SUFFIX)
-clcore_LLVM_LD := $(HOST_OUT_EXECUTABLES)/llvm-ld$(HOST_EXECUTABLE_SUFFIX)
-clcore_LLVM_AS := $(HOST_OUT_EXECUTABLES)/llvm-as$(HOST_EXECUTABLE_SUFFIX)
-clcore_LLVM_DIS := $(HOST_OUT_EXECUTABLES)/llvm-dis$(HOST_EXECUTABLE_SUFFIX)
-
-clcore_c_bc_files := $(patsubst %.c,%.bc, \
-    $(addprefix $(intermediates)/, $(clcore_c_files)))
-
-clcore_ll_bc_files := $(patsubst %.ll,%.bc, \
-    $(addprefix $(intermediates)/, $(clcore_ll_files)))
-
-$(clcore_c_bc_files): PRIVATE_INCLUDES := \
-    frameworks/rs/scriptc \
-    external/clang/lib/Headers
-
-$(clcore_c_bc_files): $(intermediates)/%.bc: $(LOCAL_PATH)/%.c  $(clcore_CLANG)
-	@mkdir -p $(dir $@)
-	$(hide) $(clcore_CLANG) $(addprefix -I, $(PRIVATE_INCLUDES)) -MD -DRS_VERSION=$(RS_VERSION) -std=c99 -c -O3 -fno-builtin -emit-llvm -ccc-host-triple armv7-none-linux-gnueabi -fsigned-char $< -o $@
-
-$(clcore_ll_bc_files): $(intermediates)/%.bc: $(LOCAL_PATH)/%.ll $(clcore_LLVM_AS)
-	@mkdir -p $(dir $@)
-	$(hide) $(clcore_LLVM_AS) $< -o $@
-
--include $(clcore_c_bc_files:%.bc=%.d)
--include $(clcore_ll_bc_files:%.bc=%.d)
-
-$(LOCAL_BUILT_MODULE): PRIVATE_BC_FILES := $(clcore_c_bc_files) $(clcore_ll_bc_files)
-$(LOCAL_BUILT_MODULE): $(clcore_c_bc_files) $(clcore_ll_bc_files)
-$(LOCAL_BUILT_MODULE): $(clcore_LLVM_LINK) $(clcore_LLVM_LD)
-$(LOCAL_BUILT_MODULE): $(clcore_LLVM_AS) $(clcore_LLVM_DIS)
-	@mkdir -p $(dir $@)
-	$(hide) $(clcore_LLVM_LINK) $(PRIVATE_BC_FILES) -o $@
+include $(LOCAL_PATH)/build_bc_lib.mk
+endif
diff --git a/lib/ScriptCRT/build_bc_lib.mk b/lib/ScriptCRT/build_bc_lib.mk
new file mode 100644
index 0000000..fd5bc9c
--- /dev/null
+++ b/lib/ScriptCRT/build_bc_lib.mk
@@ -0,0 +1,58 @@
+#
+# Copyright (C) 2012 The Android Open Source Project
+#
+# 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
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+bc_cflags := -MD \
+             -DRS_VERSION=$(RS_VERSION) \
+             -std=c99 \
+             -c \
+             -O3 \
+             -fno-builtin \
+             -emit-llvm \
+             -ccc-host-triple armv7-none-linux-gnueabi \
+             -fsigned-char
+
+c_sources := $(filter %.c,$(LOCAL_SRC_FILES))
+ll_sources := $(filter %.ll,$(LOCAL_SRC_FILES))
+
+c_bc_files := $(patsubst %.c,%.bc, \
+    $(addprefix $(intermediates)/, $(c_sources)))
+
+ll_bc_files := $(patsubst %.ll,%.bc, \
+    $(addprefix $(intermediates)/, $(ll_sources)))
+
+$(c_bc_files): PRIVATE_INCLUDES := \
+    frameworks/rs/scriptc \
+    external/clang/lib/Headers
+
+$(c_bc_files): $(intermediates)/%.bc: $(LOCAL_PATH)/%.c  $(CLANG)
+	@mkdir -p $(dir $@)
+	$(hide) $(CLANG) $(addprefix -I, $(PRIVATE_INCLUDES)) $(bc_cflags) $< -o $@
+
+$(ll_bc_files): $(intermediates)/%.bc: $(LOCAL_PATH)/%.ll $(LLVM_AS)
+	@mkdir -p $(dir $@)
+	$(hide) $(LLVM_AS) $< -o $@
+
+-include $(c_bc_files:%.bc=%.d)
+-include $(ll_bc_files:%.bc=%.d)
+
+$(LOCAL_BUILT_MODULE): PRIVATE_BC_FILES := $(c_bc_files) $(ll_bc_files)
+$(LOCAL_BUILT_MODULE): $(c_bc_files) $(ll_bc_files)
+$(LOCAL_BUILT_MODULE): $(LLVM_LINK) $(clcore_LLVM_LD)
+$(LOCAL_BUILT_MODULE): $(LLVM_AS)
+	@mkdir -p $(dir $@)
+	$(hide) $(LLVM_LINK) $(PRIVATE_BC_FILES) -o $@