Index: src/ia32/assembler-ia32.h |
diff --git a/src/ia32/assembler-ia32.h b/src/ia32/assembler-ia32.h |
index 82ab9135461da2e794c5caaff0c88a2daa0acf6e..fd5cf1ae82e84e8ec1efa933a69af387367f43d6 100644 |
--- a/src/ia32/assembler-ia32.h |
+++ b/src/ia32/assembler-ia32.h |
@@ -42,47 +42,9 @@ |
#include "src/assembler.h" |
#include "src/compiler.h" |
#include "src/isolate.h" |
-#include "src/utils.h" |
namespace v8 { |
namespace internal { |
- |
-#define GENERAL_REGISTERS(V) \ |
- V(eax) \ |
- V(ecx) \ |
- V(edx) \ |
- V(ebx) \ |
- V(esp) \ |
- V(ebp) \ |
- V(esi) \ |
- V(edi) |
- |
-#define ALLOCATABLE_GENERAL_REGISTERS(V) \ |
- V(eax) \ |
- V(ecx) \ |
- V(edx) \ |
- V(ebx) \ |
- V(esi) \ |
- V(edi) |
- |
-#define DOUBLE_REGISTERS(V) \ |
- V(xmm0) \ |
- V(xmm1) \ |
- V(xmm2) \ |
- V(xmm3) \ |
- V(xmm4) \ |
- V(xmm5) \ |
- V(xmm6) \ |
- V(xmm7) |
- |
-#define ALLOCATABLE_DOUBLE_REGISTERS(V) \ |
- V(xmm1) \ |
- V(xmm2) \ |
- V(xmm3) \ |
- V(xmm4) \ |
- V(xmm5) \ |
- V(xmm6) \ |
- V(xmm7) |
// CPU Registers. |
// |
@@ -106,86 +68,151 @@ |
// and best performance in optimized code. |
// |
struct Register { |
- enum Code { |
-#define REGISTER_CODE(R) kCode_##R, |
- GENERAL_REGISTERS(REGISTER_CODE) |
-#undef REGISTER_CODE |
- kAfterLast, |
- kCode_no_reg = -1 |
- }; |
- |
- static const int kNumRegisters = Code::kAfterLast; |
+ static const int kMaxNumAllocatableRegisters = 6; |
+ static int NumAllocatableRegisters() { |
+ return kMaxNumAllocatableRegisters; |
+ } |
+ static const int kNumRegisters = 8; |
+ |
+ static inline const char* AllocationIndexToString(int index); |
+ |
+ static inline int ToAllocationIndex(Register reg); |
+ |
+ static inline Register FromAllocationIndex(int index); |
static Register from_code(int code) { |
DCHECK(code >= 0); |
DCHECK(code < kNumRegisters); |
- Register r = {code}; |
+ Register r = { code }; |
return r; |
} |
- const char* ToString(); |
- bool IsAllocatable() const; |
- bool is_valid() const { return 0 <= reg_code && reg_code < kNumRegisters; } |
- bool is(Register reg) const { return reg_code == reg.reg_code; } |
+ bool is_valid() const { return 0 <= code_ && code_ < kNumRegisters; } |
+ bool is(Register reg) const { return code_ == reg.code_; } |
+ // eax, ebx, ecx and edx are byte registers, the rest are not. |
+ bool is_byte_register() const { return code_ <= 3; } |
int code() const { |
DCHECK(is_valid()); |
- return reg_code; |
+ return code_; |
} |
int bit() const { |
DCHECK(is_valid()); |
- return 1 << reg_code; |
- } |
- |
- bool is_byte_register() const { return reg_code <= 3; } |
+ return 1 << code_; |
+ } |
// Unfortunately we can't make this private in a struct. |
- int reg_code; |
+ int code_; |
}; |
- |
-#define DECLARE_REGISTER(R) const Register R = {Register::kCode_##R}; |
-GENERAL_REGISTERS(DECLARE_REGISTER) |
-#undef DECLARE_REGISTER |
-const Register no_reg = {Register::kCode_no_reg}; |
- |
- |
-struct DoubleRegister { |
- enum Code { |
-#define REGISTER_CODE(R) kCode_##R, |
- DOUBLE_REGISTERS(REGISTER_CODE) |
-#undef REGISTER_CODE |
- kAfterLast, |
- kCode_no_reg = -1 |
- }; |
- |
- static const int kMaxNumRegisters = Code::kAfterLast; |
- |
- static DoubleRegister from_code(int code) { |
- DoubleRegister result = {code}; |
+const int kRegister_eax_Code = 0; |
+const int kRegister_ecx_Code = 1; |
+const int kRegister_edx_Code = 2; |
+const int kRegister_ebx_Code = 3; |
+const int kRegister_esp_Code = 4; |
+const int kRegister_ebp_Code = 5; |
+const int kRegister_esi_Code = 6; |
+const int kRegister_edi_Code = 7; |
+const int kRegister_no_reg_Code = -1; |
+ |
+const Register eax = { kRegister_eax_Code }; |
+const Register ecx = { kRegister_ecx_Code }; |
+const Register edx = { kRegister_edx_Code }; |
+const Register ebx = { kRegister_ebx_Code }; |
+const Register esp = { kRegister_esp_Code }; |
+const Register ebp = { kRegister_ebp_Code }; |
+const Register esi = { kRegister_esi_Code }; |
+const Register edi = { kRegister_edi_Code }; |
+const Register no_reg = { kRegister_no_reg_Code }; |
+ |
+ |
+inline const char* Register::AllocationIndexToString(int index) { |
+ DCHECK(index >= 0 && index < kMaxNumAllocatableRegisters); |
+ // This is the mapping of allocation indices to registers. |
+ const char* const kNames[] = { "eax", "ecx", "edx", "ebx", "esi", "edi" }; |
+ return kNames[index]; |
+} |
+ |
+ |
+inline int Register::ToAllocationIndex(Register reg) { |
+ DCHECK(reg.is_valid() && !reg.is(esp) && !reg.is(ebp)); |
+ return (reg.code() >= 6) ? reg.code() - 2 : reg.code(); |
+} |
+ |
+ |
+inline Register Register::FromAllocationIndex(int index) { |
+ DCHECK(index >= 0 && index < kMaxNumAllocatableRegisters); |
+ return (index >= 4) ? from_code(index + 2) : from_code(index); |
+} |
+ |
+ |
+struct XMMRegister { |
+ static const int kMaxNumAllocatableRegisters = 7; |
+ static const int kMaxNumRegisters = 8; |
+ static int NumAllocatableRegisters() { |
+ return kMaxNumAllocatableRegisters; |
+ } |
+ |
+ // TODO(turbofan): Proper support for float32. |
+ static int NumAllocatableAliasedRegisters() { |
+ return NumAllocatableRegisters(); |
+ } |
+ |
+ static int ToAllocationIndex(XMMRegister reg) { |
+ DCHECK(reg.code() != 0); |
+ return reg.code() - 1; |
+ } |
+ |
+ static XMMRegister FromAllocationIndex(int index) { |
+ DCHECK(index >= 0 && index < kMaxNumAllocatableRegisters); |
+ return from_code(index + 1); |
+ } |
+ |
+ static XMMRegister from_code(int code) { |
+ XMMRegister result = { code }; |
return result; |
} |
- bool IsAllocatable() const; |
- bool is_valid() const { return 0 <= reg_code && reg_code < kMaxNumRegisters; } |
+ bool is_valid() const { |
+ return 0 <= code_ && code_ < kMaxNumRegisters; |
+ } |
int code() const { |
DCHECK(is_valid()); |
- return reg_code; |
- } |
- |
- bool is(DoubleRegister reg) const { return reg_code == reg.reg_code; } |
- |
- const char* ToString(); |
- |
- int reg_code; |
+ return code_; |
+ } |
+ |
+ bool is(XMMRegister reg) const { return code_ == reg.code_; } |
+ |
+ static const char* AllocationIndexToString(int index) { |
+ DCHECK(index >= 0 && index < kMaxNumAllocatableRegisters); |
+ const char* const names[] = { |
+ "xmm1", |
+ "xmm2", |
+ "xmm3", |
+ "xmm4", |
+ "xmm5", |
+ "xmm6", |
+ "xmm7" |
+ }; |
+ return names[index]; |
+ } |
+ |
+ int code_; |
}; |
-#define DECLARE_REGISTER(R) \ |
- const DoubleRegister R = {DoubleRegister::kCode_##R}; |
-DOUBLE_REGISTERS(DECLARE_REGISTER) |
-#undef DECLARE_REGISTER |
-const DoubleRegister no_double_reg = {DoubleRegister::kCode_no_reg}; |
- |
-typedef DoubleRegister XMMRegister; |
+ |
+typedef XMMRegister DoubleRegister; |
+ |
+ |
+const XMMRegister xmm0 = { 0 }; |
+const XMMRegister xmm1 = { 1 }; |
+const XMMRegister xmm2 = { 2 }; |
+const XMMRegister xmm3 = { 3 }; |
+const XMMRegister xmm4 = { 4 }; |
+const XMMRegister xmm5 = { 5 }; |
+const XMMRegister xmm6 = { 6 }; |
+const XMMRegister xmm7 = { 7 }; |
+const XMMRegister no_xmm_reg = { -1 }; |
+ |
enum Condition { |
// any value < 0 is considered no_condition |