Add x86 target support

Change makefiles to allow targeting X86 along with ARM.

Add some #if statements in Runtime.{c,def} to allow targeting X86 along
wtih ARM.

Change-Id: I3b26ade0e2b464ad410d892bfec22897fa7f7009
diff --git a/Android.mk b/Android.mk
index a55d339..07cba90 100644
--- a/Android.mk
+++ b/Android.mk
@@ -62,45 +62,81 @@
 LOCAL_MODULE := libbcc
 LOCAL_MODULE_TAGS := optional
 LOCAL_SRC_FILES := \
-  $(libbcc_SRC_FILES) \
-  runtime/lib/arm/adddf3vfp.S \
-  runtime/lib/arm/addsf3vfp.S \
-  runtime/lib/arm/divdf3vfp.S \
-  runtime/lib/arm/divsf3vfp.S \
-  runtime/lib/arm/eqdf2vfp.S \
-  runtime/lib/arm/eqsf2vfp.S \
-  runtime/lib/arm/extendsfdf2vfp.S \
-  runtime/lib/arm/fixdfsivfp.S \
-  runtime/lib/arm/fixsfsivfp.S \
-  runtime/lib/arm/fixunsdfsivfp.S \
-  runtime/lib/arm/fixunssfsivfp.S \
-  runtime/lib/arm/floatsidfvfp.S \
-  runtime/lib/arm/floatsisfvfp.S \
-  runtime/lib/arm/floatunssidfvfp.S \
-  runtime/lib/arm/floatunssisfvfp.S \
-  runtime/lib/arm/gedf2vfp.S \
-  runtime/lib/arm/gesf2vfp.S \
-  runtime/lib/arm/gtdf2vfp.S \
-  runtime/lib/arm/gtsf2vfp.S \
-  runtime/lib/arm/ledf2vfp.S \
-  runtime/lib/arm/lesf2vfp.S \
-  runtime/lib/arm/ltdf2vfp.S \
-  runtime/lib/arm/ltsf2vfp.S \
-  runtime/lib/arm/muldf3vfp.S \
-  runtime/lib/arm/mulsf3vfp.S \
-  runtime/lib/arm/nedf2vfp.S \
-  runtime/lib/arm/negdf2vfp.S \
-  runtime/lib/arm/negsf2vfp.S \
-  runtime/lib/arm/nesf2vfp.S \
-  runtime/lib/arm/subdf3vfp.S \
-  runtime/lib/arm/subsf3vfp.S \
-  runtime/lib/arm/truncdfsf2vfp.S \
-  runtime/lib/arm/unorddf2vfp.S \
-  runtime/lib/arm/unordsf2vfp.S
+  $(libbcc_SRC_FILES)
 
-LOCAL_STATIC_LIBRARIES := \
-  libLLVMARMCodeGen \
-  libLLVMARMInfo \
+ifeq ($(TARGET_ARCH),arm)
+  LOCAL_SRC_FILES += \
+    runtime/lib/arm/adddf3vfp.S \
+    runtime/lib/arm/addsf3vfp.S \
+    runtime/lib/arm/divdf3vfp.S \
+    runtime/lib/arm/divsf3vfp.S \
+    runtime/lib/arm/eqdf2vfp.S \
+    runtime/lib/arm/eqsf2vfp.S \
+    runtime/lib/arm/extendsfdf2vfp.S \
+    runtime/lib/arm/fixdfsivfp.S \
+    runtime/lib/arm/fixsfsivfp.S \
+    runtime/lib/arm/fixunsdfsivfp.S \
+    runtime/lib/arm/fixunssfsivfp.S \
+    runtime/lib/arm/floatsidfvfp.S \
+    runtime/lib/arm/floatsisfvfp.S \
+    runtime/lib/arm/floatunssidfvfp.S \
+    runtime/lib/arm/floatunssisfvfp.S \
+    runtime/lib/arm/gedf2vfp.S \
+    runtime/lib/arm/gesf2vfp.S \
+    runtime/lib/arm/gtdf2vfp.S \
+    runtime/lib/arm/gtsf2vfp.S \
+    runtime/lib/arm/ledf2vfp.S \
+    runtime/lib/arm/lesf2vfp.S \
+    runtime/lib/arm/ltdf2vfp.S \
+    runtime/lib/arm/ltsf2vfp.S \
+    runtime/lib/arm/muldf3vfp.S \
+    runtime/lib/arm/mulsf3vfp.S \
+    runtime/lib/arm/nedf2vfp.S \
+    runtime/lib/arm/negdf2vfp.S \
+    runtime/lib/arm/negsf2vfp.S \
+    runtime/lib/arm/nesf2vfp.S \
+    runtime/lib/arm/subdf3vfp.S \
+    runtime/lib/arm/subsf3vfp.S \
+    runtime/lib/arm/truncdfsf2vfp.S \
+    runtime/lib/arm/unorddf2vfp.S \
+    runtime/lib/arm/unordsf2vfp.S
+else
+  ifeq ($(TARGET_ARCH),x86) # We don't support x86-64 right now
+    LOCAL_SRC_FILES += \
+      runtime/lib/i386/ashldi3.S \
+      runtime/lib/i386/ashrdi3.S \
+      runtime/lib/i386/divdi3.S \
+      runtime/lib/i386/floatdidf.S \
+      runtime/lib/i386/floatdisf.S \
+      runtime/lib/i386/floatdixf.S \
+      runtime/lib/i386/floatundidf.S \
+      runtime/lib/i386/floatundisf.S \
+      runtime/lib/i386/floatundixf.S \
+      runtime/lib/i386/lshrdi3.S \
+      runtime/lib/i386/moddi3.S \
+      runtime/lib/i386/muldi3.S \
+      runtime/lib/i386/udivdi3.S \
+      runtime/lib/i386/umoddi3.S
+  else
+    $(error Unsupported TARGET_ARCH $(TARGET_ARCH))
+  endif
+endif
+
+ifeq ($(TARGET_ARCH),arm)
+  LOCAL_STATIC_LIBRARIES := \
+    libLLVMARMCodeGen \
+    libLLVMARMInfo
+else
+  ifeq ($(TARGET_ARCH),x86) # We don't support x86-64 right now
+    LOCAL_STATIC_LIBRARIES := \
+      libLLVMX86CodeGen \
+      libLLVMX86Info
+  else
+    $(error Unsupported TARGET_ARCH $(TARGET_ARCH))
+  endif
+endif
+
+LOCAL_STATIC_LIBRARIES += \
   libLLVMBitReader \
   libLLVMSelectionDAG \
   libLLVMAsmPrinter \
@@ -129,11 +165,22 @@
   $(LOCAL_PATH)
 
 ifeq ($(libbcc_USE_DISASSEMBLER),1)
-LOCAL_STATIC_LIBRARIES := \
-  libLLVMARMDisassembler \
-  libLLVMARMAsmPrinter \
-  libLLVMMCParser \
-  $(LOCAL_STATIC_LIBRARIES)
+  ifeq ($(TARGET_ARCH),arm)
+    LOCAL_STATIC_LIBRARIES += \
+      libLLVMARMDisassembler \
+      libLLVMARMAsmPrinter
+  else
+    ifeq ($(TARGET_ARCH),x86)
+      LOCAL_STATIC_LIBRARIES += \
+        libLLVMX86Disassembler \
+        libLLVMX86AsmPrinter
+    else
+      $(error Unsupported TARGET_ARCH $(TARGET_ARCH))
+    endif
+  endif
+  LOCAL_STATIC_LIBRARIES += \
+    libLLVMMCParser \
+    $(LOCAL_STATIC_LIBRARIES)
 endif
 
 # This makes libclcore.bc get installed if and only if the target libbcc.so is installed.
@@ -143,7 +190,7 @@
 # and reduces the size of libbcc.so by about 800k.
 # As libLLVMBitReader:libLLVMCore:libLLVMSupport are used by pixelflinger2,
 # use below instead.
-LOCAL_LDFLAGS += -Wl,--exclude-libs=libLLVMARMDisassembler:libLLVMARMAsmPrinter:libLLVMMCParser:libLLVMARMCodeGen:libLLVMARMInfo:libLLVMSelectionDAG:libLLVMAsmPrinter:libLLVMCodeGen:libLLVMLinker:libLLVMJIT:libLLVMTarget:libLLVMMC:libLLVMScalarOpts:libLLVMInstCombine:libLLVMipo:libLLVMipa:libLLVMTransformUtils:libLLVMSystem:libLLVMAnalysis
+LOCAL_LDFLAGS += -Wl,--exclude-libs=libLLVMARMDisassembler:libLLVMARMAsmPrinter:libLLVMX86Disassembler:libLLVMX86AsmPrinter:libLLVMMCParser:libLLVMARMCodeGen:libLLVMARMInfo:libLLVMSelectionDAG:libLLVMAsmPrinter:libLLVMCodeGen:libLLVMLinker:libLLVMJIT:libLLVMTarget:libLLVMMC:libLLVMScalarOpts:libLLVMInstCombine:libLLVMipo:libLLVMipa:libLLVMTransformUtils:libLLVMSystem:libLLVMAnalysis
 
 include $(LLVM_ROOT_PATH)/llvm-device-build.mk
 include $(BUILD_SHARED_LIBRARY)
@@ -194,12 +241,24 @@
   $(LOCAL_PATH)
 
 # definitions for LLVM
-LOCAL_CFLAGS += -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -DFORCE_ARM_CODEGEN=1 -DDEBUG_CODEGEN=1
+LOCAL_CFLAGS += -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -DDEBUG_CODEGEN=1
+
+ifeq ($(TARGET_ARCH),arm)
+  LOCAL_CFLAGS += -DFORCE_ARM_CODEGEN=1
+else
+  ifeq ($(TARGET_ARCH),x86)
+    LOCAL_CFLAGS += -DFORCE_X86_CODEGEN=1
+  else
+    $(error Unsupported TARGET_ARCH $(TARGET_ARCH))
+  endif
+endif
 
 ifeq ($(libbcc_USE_DISASSEMBLER),1)
 LOCAL_STATIC_LIBRARIES := \
   libLLVMARMDisassembler \
   libLLVMARMAsmPrinter \
+  libLLVMX86Disassembler \
+  libLLVMX86AsmPrinter \
   libLLVMMCParser \
   $(LOCAL_STATIC_LIBRARIES)
 endif
diff --git a/lib/bcc/Runtime.c b/lib/bcc/Runtime.c
index 86f8615..77f79d8 100644
--- a/lib/bcc/Runtime.c
+++ b/lib/bcc/Runtime.c
@@ -18,7 +18,9 @@
 #include "runtime/lib/absvsi2.c"
 #include "runtime/lib/addvdi3.c"
 #include "runtime/lib/addvsi3.c"
-#include "runtime/lib/ashldi3.c"
+#if !defined(__i386__) && !defined(__SSE2__)
+#   include "runtime/lib/ashldi3.c"
+#endif
 #ifndef ANDROID
 #   include "runtime/lib/ashrdi3.c"
 #endif
@@ -30,7 +32,9 @@
 #ifndef ANDROID // no complex.h
 #   include "runtime/lib/divdc3.c"
 #endif
-#include "runtime/lib/divdi3.c"
+#if !defined(__i386__)
+#   include "runtime/lib/divdi3.c"
+#endif
 #ifndef ANDROID // no complex.h
 #   include "runtime/lib/divsc3.c"
 #endif
@@ -41,16 +45,22 @@
 #include "runtime/lib/fixunsdfsi.c"
 #include "runtime/lib/fixunssfdi.c"
 #include "runtime/lib/fixunssfsi.c"
-#include "runtime/lib/floatdidf.c"
-#include "runtime/lib/floatdisf.c"
-#include "runtime/lib/floatundidf.c"
-#include "runtime/lib/floatundisf.c"
-#include "runtime/lib/lshrdi3.c"
-#include "runtime/lib/moddi3.c"
+#if !defined(__i386__)
+#   include "runtime/lib/floatdidf.c"
+#   include "runtime/lib/floatdisf.c"
+#   include "runtime/lib/floatundidf.c"
+#   include "runtime/lib/floatundisf.c"
+#   include "runtime/lib/moddi3.c"
+#endif
+#if !defined(__i386__) && !defined(__SSE2__)
+#   include "runtime/lib/lshrdi3.c"
+#endif
 #ifndef ANDROID // no complex.h
 #   include "runtime/lib/muldc3.c"
 #endif
-#include "runtime/lib/muldi3.c"
+#if !defined(__i386__)
+#   include "runtime/lib/muldi3.c"
+#endif
 #ifndef ANDROID // no complex.h
 #   include "runtime/lib/mulsc3.c"
 #endif
@@ -68,10 +78,14 @@
 #include "runtime/lib/subvdi3.c"
 #include "runtime/lib/subvsi3.c"
 #include "runtime/lib/ucmpdi2.c"
-#include "runtime/lib/udivdi3.c"
+#if !defined(__i386__)
+#   include "runtime/lib/udivdi3.c"
+#endif
 #include "runtime/lib/udivsi3.c"
 #include "runtime/lib/udivmoddi4.c"
-#include "runtime/lib/umoddi3.c"
+#if !defined(__i386__)
+#   include "runtime/lib/umoddi3.c"
+#endif
 #include "runtime/lib/eprintf.c"
 
 #include <string.h>
diff --git a/lib/bcc/Runtime.def b/lib/bcc/Runtime.def
index 484915f..eac19ec 100644
--- a/lib/bcc/Runtime.def
+++ b/lib/bcc/Runtime.def
@@ -33,7 +33,9 @@
 
 DEF_LLVM_RUNTIME(__addvdi3)
 DEF_LLVM_RUNTIME(__addvsi3)
-DEF_LLVM_RUNTIME(__ashldi3)
+#if !defined(__i386__) && !defined(__SSE2__)
+    DEF_LLVM_RUNTIME(__ashldi3)
+#endif
 #ifndef ANDROID // has one in bionic
     DEF_LLVM_RUNTIME(__ashrdi3)
 #endif
@@ -55,7 +57,9 @@
 
 DEF_GENERIC_OR_VFP_RUNTIME(__divdf3)
 
-DEF_LLVM_RUNTIME(__divdi3)
+#if !defined(__i386__)
+    DEF_LLVM_RUNTIME(__divdi3)
+#endif
 
 #ifndef ANDROID // no complex extension
     DEF_LLVM_RUNTIME(__divsc3)
@@ -84,14 +88,18 @@
 
 DEF_LLVM_OR_VFP_RUNTIME(__fixunssfsi)
 
-DEF_LLVM_RUNTIME(__floatdidf)
-DEF_LLVM_RUNTIME(__floatdisf)
+#if !defined(__i386__)
+    DEF_LLVM_RUNTIME(__floatdidf)
+    DEF_LLVM_RUNTIME(__floatdisf)
+#endif
 
 DEF_GENERIC_OR_VFP_RUNTIME(__floatsidf)
 DEF_GENERIC_OR_VFP_RUNTIME(__floatsisf)
 
-DEF_LLVM_RUNTIME(__floatundidf)
-DEF_LLVM_RUNTIME(__floatundisf)
+#if !defined(__i386__)
+    DEF_LLVM_RUNTIME(__floatundidf)
+    DEF_LLVM_RUNTIME(__floatundisf)
+#endif
 
 DEF_GENERIC_RUNTIME(__floatunsidf)
 DEF_GENERIC_RUNTIME(__floatunsisf)
@@ -107,20 +115,26 @@
 DEF_GENERIC_OR_VFP_RUNTIME(__ledf2)
 DEF_GENERIC_OR_VFP_RUNTIME(__lesf2)
 
-DEF_LLVM_RUNTIME(__lshrdi3)
+#if !defined(__i386__) && !defined(__SSE2__)
+    DEF_LLVM_RUNTIME(__lshrdi3)
+#endif
 
 DEF_VFP_RUNTIME(__ltdf2)
 DEF_VFP_RUNTIME(__ltsf2)
 
-DEF_LLVM_RUNTIME(__moddi3)
+#if !defined(__i386__)
+    DEF_LLVM_RUNTIME(__moddi3)
+#endif
 
 #ifndef ANDROID // no complex extension
     DEF_LLVM_RUNTIME(__muldc3)
 #endif
 
 DEF_GENERIC_OR_VFP_RUNTIME(__muldf3)
-DEF_LLVM_RUNTIME(__muldi3)
-DEF_LLVM_RUNTIME(__muldsi3)
+#if !defined(__i386__)
+    DEF_LLVM_RUNTIME(__muldi3)
+    DEF_LLVM_RUNTIME(__muldsi3)
+#endif
 
 #ifndef ANDROID // no complex extension
     DEF_LLVM_RUNTIME(__mulsc3)
@@ -160,10 +174,14 @@
 DEF_GENERIC_OR_VFP_RUNTIME(__truncdfsf2)
 
 DEF_LLVM_RUNTIME(__ucmpdi2)
-DEF_LLVM_RUNTIME(__udivdi3)
+#if !defined(__i386__)
+    DEF_LLVM_RUNTIME(__udivdi3)
+#endif
 DEF_LLVM_RUNTIME(__udivmoddi4)
 DEF_LLVM_RUNTIME(__udivsi3)
-DEF_LLVM_RUNTIME(__umoddi3)
+#if !defined(__i386__)
+    DEF_LLVM_RUNTIME(__umoddi3)
+#endif
 
 DEF_GENERIC_OR_VFP_RUNTIME(__unorddf2)
 DEF_GENERIC_OR_VFP_RUNTIME(__unordsf2)