Skip to content

Commit

Permalink
Revert change 5989, which causes failures in some benchmarks.
Browse files Browse the repository at this point in the history
  • Loading branch information
whesse@chromium.org committed Dec 13, 2010
1 parent 49f4c39 commit fdf44a4
Show file tree
Hide file tree
Showing 14 changed files with 52 additions and 301 deletions.
3 changes: 0 additions & 3 deletions src/arm/lithium-arm.cc
Expand Up @@ -1354,9 +1354,6 @@ LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
case kMathPowHalf:
Abort("MathPowHalf LUnaryMathOperation not implemented");
return NULL;
case kMathLog:
Abort("MathLog LUnaryMathOperation not implemented");
return NULL;
default:
UNREACHABLE();
return NULL;
Expand Down
1 change: 0 additions & 1 deletion src/code-stubs.h
Expand Up @@ -56,7 +56,6 @@ namespace internal {
V(FastNewContext) \
V(FastCloneShallowArray) \
V(TranscendentalCache) \
V(TranscendentalCacheSSE2) \
V(GenericUnaryOp) \
V(RevertToNumber) \
V(ToBoolean) \
Expand Down
3 changes: 1 addition & 2 deletions src/heap.h
Expand Up @@ -2054,9 +2054,8 @@ class TranscendentalCache {

// 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];
Expand Down
2 changes: 0 additions & 2 deletions src/hydrogen-instructions.h
Expand Up @@ -1380,7 +1380,6 @@ class HUnaryMathOperation: public HUnaryOperation {
break;
case kMathSqrt:
case kMathPowHalf:
case kMathLog:
default:
set_representation(Representation::Double());
}
Expand All @@ -1400,7 +1399,6 @@ class HUnaryMathOperation: public HUnaryOperation {
case kMathCeil:
case kMathSqrt:
case kMathPowHalf:
case kMathLog:
return Representation::Double();
break;
case kMathAbs:
Expand Down
1 change: 0 additions & 1 deletion src/hydrogen.cc
Expand Up @@ -4087,7 +4087,6 @@ bool HGraphBuilder::TryMathFunctionInline(Call* expr) {
case kMathFloor:
case kMathAbs:
case kMathSqrt:
case kMathLog:
if (argument_count == 2) {
HValue* argument = Pop();
Drop(1); // Receiver.
Expand Down
41 changes: 2 additions & 39 deletions src/ia32/assembler-ia32.cc
Expand Up @@ -2409,7 +2409,6 @@ void Assembler::movsd(XMMRegister dst, const Operand& src) {
emit_sse_operand(dst, src);
}


void Assembler::movsd(XMMRegister dst, XMMRegister src) {
ASSERT(CpuFeatures::IsEnabled(SSE2));
EnsureSpace ensure_space(this);
Expand All @@ -2432,17 +2431,6 @@ void Assembler::movd(XMMRegister dst, const Operand& 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) {
ASSERT(CpuFeatures::IsEnabled(SSE2));
EnsureSpace ensure_space(this);
Expand Down Expand Up @@ -2477,40 +2465,15 @@ void Assembler::ptest(XMMRegister dst, XMMRegister src) {
}


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_;
EMIT(0x66);
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);
}


Expand Down
5 changes: 1 addition & 4 deletions src/ia32/assembler-ia32.h
Expand Up @@ -905,16 +905,13 @@ class Assembler : public Malloced {
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);
Expand Down
131 changes: 0 additions & 131 deletions src/ia32/code-stubs-ia32.cc
Expand Up @@ -2683,137 +2683,6 @@ void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) {
}


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
// is faster than using the built-in instructions on floating point registers.
// Trashes edi and ebx. Dest is ecx. Source cannot be ecx or one of the
Expand Down
19 changes: 0 additions & 19 deletions src/ia32/code-stubs-ia32.h
Expand Up @@ -45,32 +45,13 @@ class TranscendentalCacheStub: public CodeStub {
void Generate(MacroAssembler* masm);
private:
TranscendentalCache::Type type_;

Major MajorKey() { return TranscendentalCache; }
int MinorKey() { return type_; }
Runtime::FunctionId RuntimeFunction();
void GenerateOperation(MacroAssembler* masm);
};


// 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() { }
Expand Down

0 comments on commit fdf44a4

Please sign in to comment.