Revision: 5991
Author: [email protected]
Date: Mon Dec 13 08:34:59 2010
Log: Revert change 5989, which causes failures in some benchmarks.
Review URL: http://codereview.chromium.org/5804003
http://code.google.com/p/v8/source/detail?r=5991
Modified:
/branches/bleeding_edge/src/arm/lithium-arm.cc
/branches/bleeding_edge/src/code-stubs.h
/branches/bleeding_edge/src/heap.h
/branches/bleeding_edge/src/hydrogen-instructions.h
/branches/bleeding_edge/src/hydrogen.cc
/branches/bleeding_edge/src/ia32/assembler-ia32.cc
/branches/bleeding_edge/src/ia32/assembler-ia32.h
/branches/bleeding_edge/src/ia32/code-stubs-ia32.cc
/branches/bleeding_edge/src/ia32/code-stubs-ia32.h
/branches/bleeding_edge/src/ia32/disasm-ia32.cc
/branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc
/branches/bleeding_edge/src/ia32/lithium-codegen-ia32.h
/branches/bleeding_edge/src/ia32/lithium-ia32.cc
/branches/bleeding_edge/src/math.js
=======================================
--- /branches/bleeding_edge/src/arm/lithium-arm.cc Mon Dec 13 06:37:19 2010
+++ /branches/bleeding_edge/src/arm/lithium-arm.cc Mon Dec 13 08:34:59 2010
@@ -1354,9 +1354,6 @@
case kMathPowHalf:
Abort("MathPowHalf LUnaryMathOperation not implemented");
return NULL;
- case kMathLog:
- Abort("MathLog LUnaryMathOperation not implemented");
- return NULL;
default:
UNREACHABLE();
return NULL;
=======================================
--- /branches/bleeding_edge/src/code-stubs.h Mon Dec 13 06:37:19 2010
+++ /branches/bleeding_edge/src/code-stubs.h Mon Dec 13 08:34:59 2010
@@ -56,7 +56,6 @@
V(FastNewContext) \
V(FastCloneShallowArray) \
V(TranscendentalCache) \
- V(TranscendentalCacheSSE2) \
V(GenericUnaryOp) \
V(RevertToNumber) \
V(ToBoolean) \
=======================================
--- /branches/bleeding_edge/src/heap.h Mon Dec 13 06:37:19 2010
+++ /branches/bleeding_edge/src/heap.h Mon Dec 13 08:34:59 2010
@@ -2054,9 +2054,8 @@
// Allow access to the caches_ array as an ExternalReference.
friend class ExternalReference;
- // Inline implementation of the cache.
+ // Inline implementation of the caching.
friend class TranscendentalCacheStub;
- friend class TranscendentalCacheSSE2Stub;
static TranscendentalCache* caches_[kNumberOfCaches];
Element elements_[kCacheSize];
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.h Mon Dec 13 06:37:19
2010
+++ /branches/bleeding_edge/src/hydrogen-instructions.h Mon Dec 13 08:34:59
2010
@@ -1380,7 +1380,6 @@
break;
case kMathSqrt:
case kMathPowHalf:
- case kMathLog:
default:
set_representation(Representation::Double());
}
@@ -1400,7 +1399,6 @@
case kMathCeil:
case kMathSqrt:
case kMathPowHalf:
- case kMathLog:
return Representation::Double();
break;
case kMathAbs:
=======================================
--- /branches/bleeding_edge/src/hydrogen.cc Mon Dec 13 08:29:47 2010
+++ /branches/bleeding_edge/src/hydrogen.cc Mon Dec 13 08:34:59 2010
@@ -4087,7 +4087,6 @@
case kMathFloor:
case kMathAbs:
case kMathSqrt:
- case kMathLog:
if (argument_count == 2) {
HValue* argument = Pop();
Drop(1); // Receiver.
=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32.cc Mon Dec 13 06:37:19
2010
+++ /branches/bleeding_edge/src/ia32/assembler-ia32.cc Mon Dec 13 08:34:59
2010
@@ -2408,7 +2408,6 @@
EMIT(0x10); // load
emit_sse_operand(dst, src);
}
-
void Assembler::movsd(XMMRegister dst, XMMRegister src) {
ASSERT(CpuFeatures::IsEnabled(SSE2));
@@ -2430,17 +2429,6 @@
EMIT(0x6E);
emit_sse_operand(dst, src);
}
-
-
-void Assembler::movd(const Operand& dst, XMMRegister src) {
- ASSERT(CpuFeatures::IsEnabled(SSE2));
- EnsureSpace ensure_space(this);
- last_pc_ = pc_;
- EMIT(0x66);
- EMIT(0x0F);
- EMIT(0x7E);
- emit_sse_operand(src, dst);
-}
void Assembler::pand(XMMRegister dst, XMMRegister src) {
@@ -2477,7 +2465,7 @@
}
-void Assembler::psllq(XMMRegister reg, int8_t shift) {
+void Assembler::psllq(XMMRegister reg, int8_t imm8) {
ASSERT(CpuFeatures::IsEnabled(SSE2));
EnsureSpace ensure_space(this);
last_pc_ = pc_;
@@ -2485,32 +2473,7 @@
EMIT(0x0F);
EMIT(0x73);
emit_sse_operand(esi, reg); // esi == 6
- EMIT(shift);
-}
-
-
-void Assembler::pshufd(XMMRegister dst, XMMRegister src, int8_t shuffle) {
- ASSERT(CpuFeatures::IsEnabled(SSE2));
- EnsureSpace ensure_space(this);
- last_pc_ = pc_;
- EMIT(0x66);
- EMIT(0x0F);
- EMIT(0x70);
- emit_sse_operand(dst, src);
- EMIT(shuffle);
-}
-
-
-void Assembler::pextrd(const Operand& dst, XMMRegister src, int8_t offset)
{
- ASSERT(CpuFeatures::IsEnabled(SSE2));
- EnsureSpace ensure_space(this);
- last_pc_ = pc_;
- EMIT(0x66);
- EMIT(0x0F);
- EMIT(0x3A);
- EMIT(0x16);
- emit_sse_operand(src, dst);
- EMIT(offset);
+ EMIT(imm8);
}
=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32.h Mon Dec 13 06:37:19
2010
+++ /branches/bleeding_edge/src/ia32/assembler-ia32.h Mon Dec 13 08:34:59
2010
@@ -905,16 +905,13 @@
void movdbl(const Operand& dst, XMMRegister src);
void movd(XMMRegister dst, const Operand& src);
- void movd(const Operand& src, XMMRegister dst);
void movsd(XMMRegister dst, XMMRegister src);
void pand(XMMRegister dst, XMMRegister src);
void pxor(XMMRegister dst, XMMRegister src);
void ptest(XMMRegister dst, XMMRegister src);
- void psllq(XMMRegister reg, int8_t shift);
- void pshufd(XMMRegister dst, XMMRegister src, int8_t shuffle);
- void pextrd(const Operand& dst, XMMRegister src, int8_t offset);
+ void psllq(XMMRegister reg, int8_t imm8);
// Parallel XMM operations.
void movntdqa(XMMRegister src, const Operand& dst);
=======================================
--- /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Mon Dec 13 06:37:19
2010
+++ /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Mon Dec 13 08:34:59
2010
@@ -2681,137 +2681,6 @@
__ fyl2x();
}
}
-
-
-void TranscendentalCacheSSE2Stub::Generate(MacroAssembler* masm) {
- // Input on stack:
- // esp[0]: return address.
- // Input in registers:
- // xmm1: untagged double input argument.
- // Output:
- // xmm1: untagged double result.
- Label skip_cache;
- Label call_runtime;
-
- // Input is an untagged double in xmm1.
- // Compute hash (the shifts are arithmetic):
- // h = (low ^ high); h ^= h >> 16; h ^= h >> 8; h = h & (cacheSize -
1);
- __ pextrd(Operand(edx), xmm1, 0x1); // copy xmm1[63..32] to edx.
- __ movd(Operand(ebx), xmm1);
-
- // xmm1 = double value
- // ebx = low 32 bits of double value
- // edx = high 32 bits of double value
- // Compute hash (the shifts are arithmetic):
- // h = (low ^ high); h ^= h >> 16; h ^= h >> 8; h = h & (cacheSize -
1);
- __ mov(ecx, ebx);
- __ xor_(ecx, Operand(edx));
- __ mov(eax, ecx);
- __ sar(eax, 16);
- __ xor_(ecx, Operand(eax));
- __ mov(eax, ecx);
- __ sar(eax, 8);
- __ xor_(ecx, Operand(eax));
- ASSERT(IsPowerOf2(TranscendentalCache::kCacheSize));
- __ and_(Operand(ecx), Immediate(TranscendentalCache::kCacheSize - 1));
-
- // xmm1 = double value.
- // ebx = low 32 bits of double value.
- // edx = high 32 bits of double value.
- // ecx = TranscendentalCache::hash(double value).
- __ mov(eax,
-
Immediate(ExternalReference::transcendental_cache_array_address()));
- // Eax points to cache array.
- __ mov(eax, Operand(eax, type_ *
sizeof(TranscendentalCache::caches_[0])));
- // Eax points to the cache for the type type_.
- // If NULL, the cache hasn't been initialized yet, so go through runtime.
- __ test(eax, Operand(eax));
- __ j(zero, &call_runtime);
-#ifdef DEBUG
- // Check that the layout of cache elements match expectations.
- { TranscendentalCache::Element test_elem[2];
- char* elem_start = reinterpret_cast<char*>(&test_elem[0]);
- char* elem2_start = reinterpret_cast<char*>(&test_elem[1]);
- char* elem_in0 = reinterpret_cast<char*>(&(test_elem[0].in[0]));
- char* elem_in1 = reinterpret_cast<char*>(&(test_elem[0].in[1]));
- char* elem_out = reinterpret_cast<char*>(&(test_elem[0].output));
- CHECK_EQ(12, elem2_start - elem_start); // Two uint_32's and a
pointer.
- CHECK_EQ(0, elem_in0 - elem_start);
- CHECK_EQ(kIntSize, elem_in1 - elem_start);
- CHECK_EQ(2 * kIntSize, elem_out - elem_start);
- }
-#endif
- // Find the address of the ecx'th entry in the cache, i.e., &eax[ecx*12].
- __ lea(ecx, Operand(ecx, ecx, times_2, 0));
- __ lea(ecx, Operand(eax, ecx, times_4, 0));
- // Check if cache matches: Double value is stored in uint32_t[2] array.
- NearLabel cache_miss;
- __ cmp(ebx, Operand(ecx, 0));
- __ j(not_equal, &cache_miss);
- __ cmp(edx, Operand(ecx, kIntSize));
- __ j(not_equal, &cache_miss);
- // Cache hit!
- __ mov(eax, Operand(ecx, 2 * kIntSize));
- __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset));
- __ Ret();
-
- __ bind(&cache_miss);
- // Update cache with new value.
- // We are short on registers, so use no_reg as scratch.
- // This gives slightly larger code.
- __ AllocateHeapNumber(eax, edi, no_reg, &skip_cache);
- __ sub(Operand(esp), Immediate(sizeof(double)));
- __ movdbl(Operand(esp, 0), xmm1);
- __ fld_d(Operand(esp, 0));
- __ add(Operand(esp), Immediate(sizeof(double)));
- GenerateOperation(masm);
- __ mov(Operand(ecx, 0), ebx);
- __ mov(Operand(ecx, kIntSize), edx);
- __ mov(Operand(ecx, 2 * kIntSize), eax);
- __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset));
- __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset));
- __ Ret();
-
- __ bind(&skip_cache);
- __ sub(Operand(esp), Immediate(2 * kPointerSize));
- __ movdbl(Operand(esp, 0), xmm1);
- __ fld_d(Operand(esp, 0));
- GenerateOperation(masm);
- __ fstp_d(Operand(esp, 0));
- __ movdbl(xmm1, Operand(esp, 0));
- __ add(Operand(esp), Immediate(2 * kPointerSize));
- __ Ret();
-
- __ bind(&call_runtime);
- __ AllocateHeapNumber(eax, edi, no_reg, &skip_cache);
- __ push(eax);
- __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm1);
- __ CallRuntime(RuntimeFunction(), 1);
- __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset));
- __ Ret();
-}
-
-
-Runtime::FunctionId TranscendentalCacheSSE2Stub::RuntimeFunction() {
- switch (type_) {
- // Add more cases when necessary.
- case TranscendentalCache::LOG: return Runtime::kMath_log;
- default:
- UNIMPLEMENTED();
- return Runtime::kAbort;
- }
-}
-
-
-void TranscendentalCacheSSE2Stub::GenerateOperation(MacroAssembler* masm) {
- // Only free register is edi.
- // Input value is on FP stack and in xmm1.
-
- ASSERT(type_ == TranscendentalCache::LOG);
- __ fldln2();
- __ fxch();
- __ fyl2x();
-}
// Get the integer part of a heap number. Surprisingly, all this bit
twiddling
=======================================
--- /branches/bleeding_edge/src/ia32/code-stubs-ia32.h Mon Dec 13 06:37:19
2010
+++ /branches/bleeding_edge/src/ia32/code-stubs-ia32.h Mon Dec 13 08:34:59
2010
@@ -45,7 +45,6 @@
void Generate(MacroAssembler* masm);
private:
TranscendentalCache::Type type_;
-
Major MajorKey() { return TranscendentalCache; }
int MinorKey() { return type_; }
Runtime::FunctionId RuntimeFunction();
@@ -53,24 +52,6 @@
};
-// Check the transcendental cache, or generate the result, using SSE2.
-// The argument and result will be in xmm1.
-// Only supports TranscendentalCache::LOG at this point.
-class TranscendentalCacheSSE2Stub: public CodeStub {
- public:
- explicit TranscendentalCacheSSE2Stub(TranscendentalCache::Type type)
- : type_(type) {}
- void Generate(MacroAssembler* masm);
- private:
- TranscendentalCache::Type type_;
-
- Major MajorKey() { return TranscendentalCacheSSE2; }
- int MinorKey() { return type_; }
- Runtime::FunctionId RuntimeFunction();
- void GenerateOperation(MacroAssembler* masm);
-};
-
-
class ToBooleanStub: public CodeStub {
public:
ToBooleanStub() { }
=======================================
--- /branches/bleeding_edge/src/ia32/disasm-ia32.cc Mon Dec 13 06:37:19 2010
+++ /branches/bleeding_edge/src/ia32/disasm-ia32.cc Mon Dec 13 08:34:59 2010
@@ -1107,21 +1107,6 @@
} else {
UnimplementedInstruction();
}
- } else if (*data == 0x3A) {
- data++;
- if (*data == 0x16) {
- data++;
- int mod, regop, rm;
- get_modrm(*data, &mod, ®op, &rm);
- int8_t imm8 = static_cast<int8_t>(data[1]);
- AppendToBuffer("pextrd %s,%s,%d",
- NameOfXMMRegister(regop),
- NameOfXMMRegister(rm),
- static_cast<int>(imm8));
- data += 2;
- } else {
- UnimplementedInstruction();
- }
} else if (*data == 0x2E || *data == 0x2F) {
const char* mnem = (*data == 0x2E) ? "ucomisd" : "comisd";
data++;
@@ -1144,14 +1129,6 @@
NameOfCPURegister(regop),
NameOfXMMRegister(rm));
data++;
- } else if (*data == 0x54) {
- data++;
- int mod, regop, rm;
- get_modrm(*data, &mod, ®op, &rm);
- AppendToBuffer("andpd %s,%s",
- NameOfXMMRegister(regop),
- NameOfXMMRegister(rm));
- data++;
} else if (*data == 0x57) {
data++;
int mod, regop, rm;
@@ -1172,25 +1149,6 @@
get_modrm(*data, &mod, ®op, &rm);
AppendToBuffer("movdqa %s,", NameOfXMMRegister(regop));
data += PrintRightOperand(data);
- } else if (*data == 0x70) {
- data++;
- int mod, regop, rm;
- get_modrm(*data, &mod, ®op, &rm);
- int8_t imm8 = static_cast<int8_t>(data[1]);
- AppendToBuffer("pshufd %s,%s,%d",
- NameOfXMMRegister(regop),
- NameOfXMMRegister(rm),
- static_cast<int>(imm8));
- data += 2;
- } else if (*data == 0x73) {
- data++;
- int mod, regop, rm;
- get_modrm(*data, &mod, ®op, &rm);
- int8_t imm8 = static_cast<int8_t>(data[1]);
- AppendToBuffer("psllq %s,%d",
- NameOfXMMRegister(rm),
- static_cast<int>(imm8));
- data += 2;
} else if (*data == 0x7F) {
AppendToBuffer("movdqa ");
data++;
@@ -1198,21 +1156,6 @@
get_modrm(*data, &mod, ®op, &rm);
data += PrintRightOperand(data);
AppendToBuffer(",%s", NameOfXMMRegister(regop));
- } else if (*data == 0x7E) {
- data++;
- int mod, regop, rm;
- get_modrm(*data, &mod, ®op, &rm);
- AppendToBuffer("movd ");
- data += PrintRightOperand(data);
- AppendToBuffer(",%s", NameOfXMMRegister(regop));
- } else if (*data == 0xDB) {
- data++;
- int mod, regop, rm;
- get_modrm(*data, &mod, ®op, &rm);
- AppendToBuffer("pand %s,%s",
- NameOfXMMRegister(regop),
- NameOfXMMRegister(rm));
- data++;
} else if (*data == 0xE7) {
AppendToBuffer("movntdq ");
data++;
@@ -1221,13 +1164,38 @@
data += PrintRightOperand(data);
AppendToBuffer(",%s", NameOfXMMRegister(regop));
} else if (*data == 0xEF) {
- data++;
- int mod, regop, rm;
- get_modrm(*data, &mod, ®op, &rm);
- AppendToBuffer("pxor %s,%s",
- NameOfXMMRegister(regop),
- NameOfXMMRegister(rm));
- data++;
+ data++;
+ int mod, regop, rm;
+ get_modrm(*data, &mod, ®op, &rm);
+ AppendToBuffer("pxor %s,%s",
+ NameOfXMMRegister(regop),
+ NameOfXMMRegister(rm));
+ data++;
+ } else if (*data == 0xDB) {
+ data++;
+ int mod, regop, rm;
+ get_modrm(*data, &mod, ®op, &rm);
+ AppendToBuffer("pand %s,%s",
+ NameOfXMMRegister(regop),
+ NameOfXMMRegister(rm));
+ data++;
+ } else if (*data == 0x73) {
+ data++;
+ int mod, regop, rm;
+ get_modrm(*data, &mod, ®op, &rm);
+ int8_t imm8 = static_cast<int8_t>(data[1]);
+ AppendToBuffer("psllq %s,%d",
+ NameOfXMMRegister(rm),
+ static_cast<int>(imm8));
+ data += 2;
+ } else if (*data == 0x54) {
+ data++;
+ int mod, regop, rm;
+ get_modrm(*data, &mod, ®op, &rm);
+ AppendToBuffer("andpd %s,%s",
+ NameOfXMMRegister(regop),
+ NameOfXMMRegister(rm));
+ data++;
} else {
UnimplementedInstruction();
}
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Mon Dec 13
06:37:19 2010
+++ /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Mon Dec 13
08:34:59 2010
@@ -2233,13 +2233,6 @@
__ movdbl(ToDoubleRegister(instr->result()), Operand(esp, 0));
__ add(Operand(esp), Immediate(kDoubleSize));
}
-
-
-void LCodeGen::DoMathLog(LUnaryMathOperation* instr) {
- ASSERT(ToDoubleRegister(instr->result()).is(xmm1));
- TranscendentalCacheSSE2Stub stub(TranscendentalCache::LOG);
- CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
-}
void LCodeGen::DoUnaryMathOperation(LUnaryMathOperation* instr) {
@@ -2259,10 +2252,6 @@
case kMathPowHalf:
DoMathPowHalf(instr);
break;
- case kMathLog:
- DoMathLog(instr);
- break;
-
default:
UNREACHABLE();
}
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.h Mon Dec 13
06:37:19 2010
+++ /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.h Mon Dec 13
08:34:59 2010
@@ -176,7 +176,6 @@
void DoMathRound(LUnaryMathOperation* instr);
void DoMathSqrt(LUnaryMathOperation* instr);
void DoMathPowHalf(LUnaryMathOperation* instr);
- void DoMathLog(LUnaryMathOperation* instr);
// Support for recording safepoint and position information.
void RecordSafepoint(LPointerMap* pointers, int deoptimization_index);
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.cc Mon Dec 13 06:37:19
2010
+++ /branches/bleeding_edge/src/ia32/lithium-ia32.cc Mon Dec 13 08:34:59
2010
@@ -1355,28 +1355,22 @@
LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation*
instr) {
MathFunctionId op = instr->op();
- if (op == kMathLog) {
- LOperand* input = UseFixedDouble(instr->value(), xmm1);
- LInstruction* result = new LUnaryMathOperation(input);
- return MarkAsCall(DefineFixedDouble(result, xmm1), instr);
- } else {
- LOperand* input = UseRegisterAtStart(instr->value());
- LInstruction* result = new LUnaryMathOperation(input);
- switch (op) {
- case kMathAbs:
- return
AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
- case kMathFloor:
- return AssignEnvironment(DefineAsRegister(result));
- case kMathRound:
- return AssignEnvironment(DefineAsRegister(result));
- case kMathSqrt:
- return DefineSameAsFirst(result);
- case kMathPowHalf:
- return AssignEnvironment(DefineSameAsFirst(result));
- default:
- UNREACHABLE();
- return NULL;
- }
+ LOperand* input = UseRegisterAtStart(instr->value());
+ LInstruction* result = new LUnaryMathOperation(input);
+ switch (op) {
+ case kMathAbs:
+ return
AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
+ case kMathFloor:
+ return AssignEnvironment(DefineAsRegister(result));
+ case kMathRound:
+ return AssignEnvironment(DefineAsRegister(result));
+ case kMathSqrt:
+ return DefineSameAsFirst(result);
+ case kMathPowHalf:
+ return AssignEnvironment(DefineSameAsFirst(result));
+ default:
+ UNREACHABLE();
+ return NULL;
}
}
=======================================
--- /branches/bleeding_edge/src/math.js Mon Dec 13 06:37:19 2010
+++ /branches/bleeding_edge/src/math.js Mon Dec 13 08:34:59 2010
@@ -265,7 +265,6 @@
%SetMathFunctionId($Math.abs, 4);
%SetMathFunctionId($Math.sqrt, 0xd);
%SetMathFunctionId($Math.pow, 0xe);
- %SetMathFunctionId($Math.log, 5);
// TODO(erikcorry): Set the id of the other functions so they can be
// optimized.
};
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev