Add a basic enum for ARM InstructionSet / cpu features.

That way, we don't have to use -mattr=sse2 for ARM in
cross tests, etc.

Default to NEON for now. Also put in an entry for HW
divide in ARM mode. There's bunches of features that are
possible though, e.g.,:

https://github.com/llvm-mirror/llvm/blob/master/lib/Target/ARM/ARM.td

BUG= https://code.google.com/p/nativeclient/issues/detail?id=4076
R=stichnot@chromium.org

Review URL: https://codereview.chromium.org/1191573003.
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
index a4aa517..2d3c5c1 100644
--- a/src/IceTargetLoweringARM32.cpp
+++ b/src/IceTargetLoweringARM32.cpp
@@ -135,8 +135,21 @@
 } // end of anonymous namespace
 
 TargetARM32::TargetARM32(Cfg *Func)
-    : TargetLowering(Func), UsesFramePointer(false), NeedsStackAlignment(false),
-      MaybeLeafFunc(true), SpillAreaSizeBytes(0) {
+    : TargetLowering(Func), InstructionSet(ARM32InstructionSet::Begin),
+      UsesFramePointer(false), NeedsStackAlignment(false), MaybeLeafFunc(true),
+      SpillAreaSizeBytes(0) {
+  static_assert(
+      (ARM32InstructionSet::End - ARM32InstructionSet::Begin) ==
+          (TargetInstructionSet::ARM32InstructionSet_End -
+           TargetInstructionSet::ARM32InstructionSet_Begin),
+      "ARM32InstructionSet range different from TargetInstructionSet");
+  if (Func->getContext()->getFlags().getTargetInstructionSet() !=
+      TargetInstructionSet::BaseInstructionSet) {
+    InstructionSet = static_cast<ARM32InstructionSet>(
+        (Func->getContext()->getFlags().getTargetInstructionSet() -
+         TargetInstructionSet::ARM32InstructionSet_Begin) +
+        ARM32InstructionSet::Begin);
+  }
   // TODO: Don't initialize IntegerRegisters and friends every time.
   // Instead, initialize in some sort of static initializer for the
   // class.