Support for cross compilation.

Refactor architecture specific files into arm and x86 name spaces. Make
assemblers and calling conventions use the factory pattern and an
instruction set specifier.

Change-Id: I20cd7aecacc1ae3d418221d98bbe1d69be9162a7
diff --git a/src/managed_register.h b/src/managed_register.h
index 2540895..5aa96e4 100644
--- a/src/managed_register.h
+++ b/src/managed_register.h
@@ -3,12 +3,52 @@
 #ifndef ART_SRC_MANAGED_REGISTER_H_
 #define ART_SRC_MANAGED_REGISTER_H_
 
-#if defined(__i386__)
-#include "managed_register_x86.h"
-#elif defined(__arm__)
-#include "managed_register_arm.h"
-#else
-#error Unknown architecture.
-#endif
+namespace art {
+
+namespace x86 {
+class X86ManagedRegister;
+}
+namespace arm {
+class ArmManagedRegister;
+}
+
+class ManagedRegister {
+ public:
+  // ManagedRegister is a value class. There exists no method to change the
+  // internal state. We therefore allow a copy constructor and an
+  // assignment-operator.
+  ManagedRegister(const ManagedRegister& other) : id_(other.id_) { }
+
+  ManagedRegister& operator=(const ManagedRegister& other) {
+    id_ = other.id_;
+    return *this;
+  }
+
+  x86::X86ManagedRegister AsX86() const;
+  arm::ArmManagedRegister AsArm() const;
+
+  // It is valid to invoke Equals on and with a NoRegister.
+  bool Equals(const ManagedRegister& other) const {
+    return id_ == other.id_;
+  }
+
+  bool IsNoRegister() const {
+    return id_ == kNoRegister;
+  }
+
+  static ManagedRegister NoRegister() {
+    return ManagedRegister();
+  }
+
+ protected:
+  static const int kNoRegister = -1;
+
+  ManagedRegister() : id_(kNoRegister) { }
+  ManagedRegister(int reg_id) : id_(reg_id) { }
+
+  int id_;
+};
+
+}  // namespace art
 
 #endif  // ART_SRC_MANAGED_REGISTER_H_