| Index: src/ia32/assembler-ia32.h
|
| ===================================================================
|
| --- src/ia32/assembler-ia32.h (revision 6800)
|
| +++ src/ia32/assembler-ia32.h (working copy)
|
| @@ -30,7 +30,7 @@
|
|
|
| // The original source code covered by the above license above has been
|
| // modified significantly by Google Inc.
|
| -// Copyright 2010 the V8 project authors. All rights reserved.
|
| +// Copyright 2011 the V8 project authors. All rights reserved.
|
|
|
| // A light-weight IA32 Assembler.
|
|
|
| @@ -64,30 +64,14 @@
|
| // and best performance in optimized code.
|
| //
|
| struct Register {
|
| - static const int kNumAllocatableRegisters = 5;
|
| + static const int kNumAllocatableRegisters = 6;
|
| static const int kNumRegisters = 8;
|
|
|
| - static int ToAllocationIndex(Register reg) {
|
| - ASSERT(reg.code() < 4 || reg.code() == 7);
|
| - return (reg.code() == 7) ? 4 : reg.code();
|
| - }
|
| + static inline const char* AllocationIndexToString(int index);
|
|
|
| - static Register FromAllocationIndex(int index) {
|
| - ASSERT(index >= 0 && index < kNumAllocatableRegisters);
|
| - return (index == 4) ? from_code(7) : from_code(index);
|
| - }
|
| + static inline int ToAllocationIndex(Register reg);
|
|
|
| - static const char* AllocationIndexToString(int index) {
|
| - ASSERT(index >= 0 && index < kNumAllocatableRegisters);
|
| - const char* const names[] = {
|
| - "eax",
|
| - "ecx",
|
| - "edx",
|
| - "ebx",
|
| - "edi"
|
| - };
|
| - return names[index];
|
| - }
|
| + static inline Register FromAllocationIndex(int index);
|
|
|
| static Register from_code(int code) {
|
| ASSERT(code >= 0);
|
| @@ -112,6 +96,7 @@
|
| int code_;
|
| };
|
|
|
| +
|
| const Register eax = { 0 };
|
| const Register ecx = { 1 };
|
| const Register edx = { 2 };
|
| @@ -123,6 +108,26 @@
|
| const Register no_reg = { -1 };
|
|
|
|
|
| +inline const char* Register::AllocationIndexToString(int index) {
|
| + ASSERT(index >= 0 && index < kNumAllocatableRegisters);
|
| + // 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) {
|
| + ASSERT(reg.is_valid() && !reg.is(esp) && !reg.is(ebp));
|
| + return (reg.code() >= 6) ? reg.code() - 2 : reg.code();
|
| +}
|
| +
|
| +
|
| +inline Register Register::FromAllocationIndex(int index) {
|
| + ASSERT(index >= 0 && index < kNumAllocatableRegisters);
|
| + return (index >= 4) ? from_code(index + 2) : from_code(index);
|
| +}
|
| +
|
| +
|
| struct XMMRegister {
|
| static const int kNumAllocatableRegisters = 7;
|
| static const int kNumRegisters = 8;
|
| @@ -921,11 +926,16 @@
|
|
|
| void pand(XMMRegister dst, XMMRegister src);
|
| void pxor(XMMRegister dst, XMMRegister src);
|
| + void por(XMMRegister dst, XMMRegister src);
|
| void ptest(XMMRegister dst, XMMRegister src);
|
|
|
| void psllq(XMMRegister reg, int8_t shift);
|
| + void psllq(XMMRegister dst, XMMRegister src);
|
| + void psrlq(XMMRegister reg, int8_t shift);
|
| + void psrlq(XMMRegister dst, XMMRegister src);
|
| void pshufd(XMMRegister dst, XMMRegister src, int8_t shuffle);
|
| void pextrd(const Operand& dst, XMMRegister src, int8_t offset);
|
| + void pinsrd(XMMRegister dst, const Operand& src, int8_t offset);
|
|
|
| // Parallel XMM operations.
|
| void movntdqa(XMMRegister src, const Operand& dst);
|
| @@ -949,8 +959,9 @@
|
| void RecordDebugBreakSlot();
|
|
|
| // Record a comment relocation entry that can be used by a disassembler.
|
| - // Use --code-comments to enable.
|
| - void RecordComment(const char* msg);
|
| + // Use --code-comments to enable, or provide "force = true" flag to always
|
| + // write a comment.
|
| + void RecordComment(const char* msg, bool force = false);
|
|
|
| // Writes a single byte or word of data in the code stream. Used for
|
| // inline tables, e.g., jump-tables.
|
|
|