| Index: src/ia32/codegen-ia32.cc
|
| diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc
|
| index 28b0f4ad82f133b60f7c69c03e16b21f29e92f9e..84a4d238bd427ac0d3e916fd849bab069207d407 100644
|
| --- a/src/ia32/codegen-ia32.cc
|
| +++ b/src/ia32/codegen-ia32.cc
|
| @@ -177,11 +177,6 @@ UnaryMathFunction CreateSqrtFunction() {
|
| #undef __
|
| #define __ ACCESS_MASM(masm)
|
|
|
| -// Keep around global pointers to these objects so that Valgrind won't complain.
|
| -static size_t* medium_handlers = NULL;
|
| -static size_t* small_handlers = NULL;
|
| -
|
| -
|
| enum Direction { FORWARD, BACKWARD };
|
| enum Alignment { MOVE_ALIGNED, MOVE_UNALIGNED };
|
|
|
| @@ -253,12 +248,24 @@ void MemMoveEmitPopAndReturn(MacroAssembler* masm) {
|
| #define __ masm.
|
|
|
|
|
| +class LabelConverter {
|
| + public:
|
| + explicit LabelConverter(byte* buffer) : buffer_(buffer) {}
|
| + int32_t address(Label* l) const {
|
| + return reinterpret_cast<int32_t>(buffer_) + l->pos();
|
| + }
|
| + private:
|
| + byte* buffer_;
|
| +};
|
| +
|
| +
|
| OS::MemMoveFunction CreateMemMoveFunction() {
|
| size_t actual_size;
|
| // Allocate buffer in executable space.
|
| byte* buffer = static_cast<byte*>(OS::Allocate(1 * KB, &actual_size, true));
|
| if (buffer == NULL) return NULL;
|
| MacroAssembler masm(NULL, buffer, static_cast<int>(actual_size));
|
| + LabelConverter conv(buffer);
|
|
|
| // Generated code is put into a fixed, unmovable buffer, and not into
|
| // the V8 heap. We can't, and don't, refer to any relocatable addresses
|
| @@ -452,7 +459,7 @@ OS::MemMoveFunction CreateMemMoveFunction() {
|
| // Special handlers for 9 <= copy_size < 64. No assumptions about
|
| // alignment or move distance, so all reads must be unaligned and
|
| // must happen before any writes.
|
| - Label f9_16, f17_32, f33_48, f49_63;
|
| + Label medium_handlers, f9_16, f17_32, f33_48, f49_63;
|
|
|
| __ bind(&f9_16);
|
| __ movdbl(xmm0, Operand(src, 0));
|
| @@ -488,11 +495,11 @@ OS::MemMoveFunction CreateMemMoveFunction() {
|
| __ movdqu(Operand(dst, count, times_1, -0x10), xmm3);
|
| MemMoveEmitPopAndReturn(&masm);
|
|
|
| - medium_handlers = new size_t[4];
|
| - medium_handlers[0] = reinterpret_cast<intptr_t>(buffer) + f9_16.pos();
|
| - medium_handlers[1] = reinterpret_cast<intptr_t>(buffer) + f17_32.pos();
|
| - medium_handlers[2] = reinterpret_cast<intptr_t>(buffer) + f33_48.pos();
|
| - medium_handlers[3] = reinterpret_cast<intptr_t>(buffer) + f49_63.pos();
|
| + __ bind(&medium_handlers);
|
| + __ dd(conv.address(&f9_16));
|
| + __ dd(conv.address(&f17_32));
|
| + __ dd(conv.address(&f33_48));
|
| + __ dd(conv.address(&f49_63));
|
|
|
| __ bind(&medium_size); // Entry point into this block.
|
| __ mov(eax, count);
|
| @@ -505,13 +512,12 @@ OS::MemMoveFunction CreateMemMoveFunction() {
|
| __ int3();
|
| __ bind(&ok);
|
| }
|
| - __ mov(eax, Operand(eax, times_4,
|
| - reinterpret_cast<intptr_t>(medium_handlers)));
|
| + __ mov(eax, Operand(eax, times_4, conv.address(&medium_handlers)));
|
| __ jmp(eax);
|
| }
|
| {
|
| // Specialized copiers for copy_size <= 8 bytes.
|
| - Label f0, f1, f2, f3, f4, f5_8;
|
| + Label small_handlers, f0, f1, f2, f3, f4, f5_8;
|
| __ bind(&f0);
|
| MemMoveEmitPopAndReturn(&masm);
|
|
|
| @@ -544,16 +550,16 @@ OS::MemMoveFunction CreateMemMoveFunction() {
|
| __ mov(Operand(dst, count, times_1, -4), edx);
|
| MemMoveEmitPopAndReturn(&masm);
|
|
|
| - small_handlers = new size_t[9];
|
| - small_handlers[0] = reinterpret_cast<intptr_t>(buffer) + f0.pos();
|
| - small_handlers[1] = reinterpret_cast<intptr_t>(buffer) + f1.pos();
|
| - small_handlers[2] = reinterpret_cast<intptr_t>(buffer) + f2.pos();
|
| - small_handlers[3] = reinterpret_cast<intptr_t>(buffer) + f3.pos();
|
| - small_handlers[4] = reinterpret_cast<intptr_t>(buffer) + f4.pos();
|
| - small_handlers[5] = reinterpret_cast<intptr_t>(buffer) + f5_8.pos();
|
| - small_handlers[6] = reinterpret_cast<intptr_t>(buffer) + f5_8.pos();
|
| - small_handlers[7] = reinterpret_cast<intptr_t>(buffer) + f5_8.pos();
|
| - small_handlers[8] = reinterpret_cast<intptr_t>(buffer) + f5_8.pos();
|
| + __ bind(&small_handlers);
|
| + __ dd(conv.address(&f0));
|
| + __ dd(conv.address(&f1));
|
| + __ dd(conv.address(&f2));
|
| + __ dd(conv.address(&f3));
|
| + __ dd(conv.address(&f4));
|
| + __ dd(conv.address(&f5_8));
|
| + __ dd(conv.address(&f5_8));
|
| + __ dd(conv.address(&f5_8));
|
| + __ dd(conv.address(&f5_8));
|
|
|
| __ bind(&small_size); // Entry point into this block.
|
| if (FLAG_debug_code) {
|
| @@ -563,8 +569,7 @@ OS::MemMoveFunction CreateMemMoveFunction() {
|
| __ int3();
|
| __ bind(&ok);
|
| }
|
| - __ mov(eax, Operand(count, times_4,
|
| - reinterpret_cast<intptr_t>(small_handlers)));
|
| + __ mov(eax, Operand(count, times_4, conv.address(&small_handlers)));
|
| __ jmp(eax);
|
| }
|
| } else {
|
|
|