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_