Add CMake options for disabling SIMD flavors.

BUG=aomedia:733

Change-Id: I7044c55611a3ea9555347f9c4fef03e3042560e2
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8f1f7b1..d724b60 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -29,6 +29,24 @@
 option(ENABLE_TOOLS "Enable applications in tools sub directory." ON)
 option(ENABLE_WERROR "Converts warnings to errors at compile time." OFF)
 
+# ARM assembly/intrinsics flags.
+option(ENABLE_NEON "Enables NEON optimizations on ARM targets." ON)
+option(ENABLE_NEON_ASM "Enables NEON ASM optimizations on ARM targets." ON)
+
+# MIPS assembly/intrinsics flags.
+option(ENABLE_DSPR2 "Enables DSPR2 optimizations on MIPS targets." OFF)
+option(ENABLE_MSA "Enables MSA optimizations on MIPS targets." OFF)
+
+# x86/x86_64 assembly/intrinsics flags.
+option(ENABLE_MMX "Enables MMX optimizations on x86/x86_64 targets." ON)
+option(ENABLE_SSE "Enables SSE optimizations on x86/x86_64 targets." ON)
+option(ENABLE_SSE2 "Enables SSE2 optimizations on x86/x86_64 targets." ON)
+option(ENABLE_SSE3 "Enables SSE3 optimizations on x86/x86_64 targets." ON)
+option(ENABLE_SSSE3 "Enables SSSE3 optimizations on x86/x86_64 targets." ON)
+option(ENABLE_SSE4_1 "Enables SSE4_1 optimizations on x86/x86_64 targets." ON)
+option(ENABLE_AVX "Enables AVX optimizations on x86/x86_64 targets." ON)
+option(ENABLE_AVX2 "Enables AVX2 optimizations on x86/x86_64 targets." ON)
+
 # $BUILD_SHARED_LIBS is a CMake built-in-- it's listed here for visibility.
 option(BUILD_SHARED_LIBS "CMake should generate a shared library build." OFF)
 
diff --git a/build/cmake/cpu.cmake b/build/cmake/cpu.cmake
index 5d0b1a6..4225c3d 100644
--- a/build/cmake/cpu.cmake
+++ b/build/cmake/cpu.cmake
@@ -8,35 +8,64 @@
 ## Media Patent License 1.0 was not distributed with this source code in the
 ## PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 ##
+
+
 if ("${AOM_TARGET_CPU}" STREQUAL "arm64")
   set(ARCH_ARM 1)
-  set(HAVE_NEON 1)
   set(RTCD_ARCH_ARM "yes")
-  set(RTCD_HAVE_NEON "yes")
+
+  if (ENABLE_NEON)
+    set(HAVE_NEON 1)
+    set(RTCD_HAVE_NEON "yes")
+  else ()
+    set(HAVE_NEON 0)
+    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-neon)
+  endif ()
 elseif ("${AOM_TARGET_CPU}" MATCHES "^armv7")
   set(ARCH_ARM 1)
-  set(HAVE_NEON 1)
-  set(HAVE_NEON_ASM 1)
   set(RTCD_ARCH_ARM "yes")
-  set(RTCD_HAVE_NEON "yes")
-  set(RTCD_HAVE_NEON_ASM "yes")
+
+  if (ENABLE_NEON)
+    set(HAVE_NEON 1)
+    set(RTCD_HAVE_NEON "yes")
+  else ()
+    set(HAVE_NEON 0)
+    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-neon)
+  endif ()
+
+  if (ENABLE_NEON_ASM)
+    set(HAVE_NEON_ASM 1)
+    set(RTCD_HAVE_NEON_ASM "yes")
+  else ()
+    set(HAVE_NEON_ASM 0)
+  endif ()
+    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-neon_asm)
 elseif ("${AOM_TARGET_CPU}" MATCHES "^mips")
   set(ARCH_MIPS 1)
+  set(RTCD_ARCH_MIPS "yes")
 
   if ("${AOM_TARGET_CPU}" STREQUAL "mips32")
     set(HAVE_MIPS32 1)
+    set(RTCD_HAVE_MIPS32 "yes")
   elseif ("${AOM_TARGET_CPU}" STREQUAL "mips64")
     set(HAVE_MIPS64 1)
+    set(RTCD_HAVE_MIPS64 "yes")
   endif ()
 
-  set(RTCD_ARCH_MIPS "yes")
-
-  if (HAVE_DSPR2)
+  # HAVE_DSPR2 is set by mips toolchain files.
+  if (ENABLE_DSPR2 AND HAVE_DSPR2)
     set(RTCD_HAVE_DSPR2 "yes")
+  else ()
+    set(HAVE_DSPR2 0)
+    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-dspr2)
   endif ()
 
-  if (HAVE_MSA)
+  # HAVE_MSA is set by mips toolchain files.
+  if (ENABLE_MSA AND HAVE_MSA)
     set(RTCD_HAVE_MSA "yes")
+  else ()
+    set(HAVE_MSA 0)
+    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-msa)
   endif ()
 elseif ("${AOM_TARGET_CPU}" MATCHES "^x86")
   if ("${AOM_TARGET_CPU}" STREQUAL "x86")
@@ -47,22 +76,18 @@
     set(RTCD_ARCH_X86_64 "yes")
   endif ()
 
-  set(HAVE_MMX 1)
-  set(HAVE_SSE 1)
-  set(HAVE_SSE2 1)
-  set(HAVE_SSE3 1)
-  set(HAVE_SSSE3 1)
-  set(HAVE_SSE4_1 1)
-  set(HAVE_AVX 1)
-  set(HAVE_AVX2 1)
-  set(RTCD_HAVE_MMX "yes")
-  set(RTCD_HAVE_SSE "yes")
-  set(RTCD_HAVE_SSE2 "yes")
-  set(RTCD_HAVE_SSE3 "yes")
-  set(RTCD_HAVE_SSSE3 "yes")
-  set(RTCD_HAVE_SSE4_1 "yes")
-  set(RTCD_HAVE_AVX "yes")
-  set(RTCD_HAVE_AVX2 "yes")
+  set(X86_FLAVORS "MMX;SSE;SSE2;SSE3;SSSE3;SSE4_1;AVX;AVX2")
+  foreach (flavor ${X86_FLAVORS})
+    if (ENABLE_${flavor} AND NOT disable_remaining_flavors)
+      set(HAVE_${flavor} 1)
+      set(RTCD_HAVE_${flavor} "yes")
+    else ()
+      set(disable_remaining_flavors 1)
+      set(HAVE_${flavor} 0)
+      string(TOLOWER ${flavor} flavor)
+      set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-${flavor})
+    endif ()
+  endforeach ()
 endif ()
 
 foreach (config_var ${AOM_CONFIG_VARS})