MIPS: Implement Math.tan in generated code.
Port r10067 (593c1ea) and r10069 (87a06dc). BUG= TEST= Review URL: http://codereview.chromium.org/8743009 Patch from Daniel Kalmar <kalmard@homejinni.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10098 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
5371508b4f
commit
d117e9d925
@ -3360,6 +3360,9 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) {
|
|||||||
__ Branch(&calculate, ne, a2, Operand(t0));
|
__ Branch(&calculate, ne, a2, Operand(t0));
|
||||||
__ Branch(&calculate, ne, a3, Operand(t1));
|
__ Branch(&calculate, ne, a3, Operand(t1));
|
||||||
// Cache hit. Load result, cleanup and return.
|
// Cache hit. Load result, cleanup and return.
|
||||||
|
Counters* counters = masm->isolate()->counters();
|
||||||
|
__ IncrementCounter(
|
||||||
|
counters->transcendental_cache_hit(), 1, scratch0, scratch1);
|
||||||
if (tagged) {
|
if (tagged) {
|
||||||
// Pop input value from stack and load result into v0.
|
// Pop input value from stack and load result into v0.
|
||||||
__ Drop(1);
|
__ Drop(1);
|
||||||
@ -3372,6 +3375,9 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) {
|
|||||||
} // if (CpuFeatures::IsSupported(FPU))
|
} // if (CpuFeatures::IsSupported(FPU))
|
||||||
|
|
||||||
__ bind(&calculate);
|
__ bind(&calculate);
|
||||||
|
Counters* counters = masm->isolate()->counters();
|
||||||
|
__ IncrementCounter(
|
||||||
|
counters->transcendental_cache_miss(), 1, scratch0, scratch1);
|
||||||
if (tagged) {
|
if (tagged) {
|
||||||
__ bind(&invalid_cache);
|
__ bind(&invalid_cache);
|
||||||
__ TailCallExternalReference(ExternalReference(RuntimeFunction(),
|
__ TailCallExternalReference(ExternalReference(RuntimeFunction(),
|
||||||
@ -3455,20 +3461,25 @@ void TranscendentalCacheStub::GenerateCallCFunction(MacroAssembler* masm,
|
|||||||
__ mov_d(f12, f4);
|
__ mov_d(f12, f4);
|
||||||
}
|
}
|
||||||
AllowExternalCallThatCantCauseGC scope(masm);
|
AllowExternalCallThatCantCauseGC scope(masm);
|
||||||
|
Isolate* isolate = masm->isolate();
|
||||||
switch (type_) {
|
switch (type_) {
|
||||||
case TranscendentalCache::SIN:
|
case TranscendentalCache::SIN:
|
||||||
__ CallCFunction(
|
__ CallCFunction(
|
||||||
ExternalReference::math_sin_double_function(masm->isolate()),
|
ExternalReference::math_sin_double_function(isolate),
|
||||||
0, 1);
|
0, 1);
|
||||||
break;
|
break;
|
||||||
case TranscendentalCache::COS:
|
case TranscendentalCache::COS:
|
||||||
__ CallCFunction(
|
__ CallCFunction(
|
||||||
ExternalReference::math_cos_double_function(masm->isolate()),
|
ExternalReference::math_cos_double_function(isolate),
|
||||||
|
0, 1);
|
||||||
|
break;
|
||||||
|
case TranscendentalCache::TAN:
|
||||||
|
__ CallCFunction(ExternalReference::math_tan_double_function(isolate),
|
||||||
0, 1);
|
0, 1);
|
||||||
break;
|
break;
|
||||||
case TranscendentalCache::LOG:
|
case TranscendentalCache::LOG:
|
||||||
__ CallCFunction(
|
__ CallCFunction(
|
||||||
ExternalReference::math_log_double_function(masm->isolate()),
|
ExternalReference::math_log_double_function(isolate),
|
||||||
0, 1);
|
0, 1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -3484,6 +3495,7 @@ Runtime::FunctionId TranscendentalCacheStub::RuntimeFunction() {
|
|||||||
// Add more cases when necessary.
|
// Add more cases when necessary.
|
||||||
case TranscendentalCache::SIN: return Runtime::kMath_sin;
|
case TranscendentalCache::SIN: return Runtime::kMath_sin;
|
||||||
case TranscendentalCache::COS: return Runtime::kMath_cos;
|
case TranscendentalCache::COS: return Runtime::kMath_cos;
|
||||||
|
case TranscendentalCache::TAN: return Runtime::kMath_tan;
|
||||||
case TranscendentalCache::LOG: return Runtime::kMath_log;
|
case TranscendentalCache::LOG: return Runtime::kMath_log;
|
||||||
default:
|
default:
|
||||||
UNIMPLEMENTED();
|
UNIMPLEMENTED();
|
||||||
|
@ -3201,6 +3201,19 @@ void FullCodeGenerator::EmitMathCos(CallRuntime* expr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FullCodeGenerator::EmitMathTan(CallRuntime* expr) {
|
||||||
|
// Load the argument on the stack and call the stub.
|
||||||
|
TranscendentalCacheStub stub(TranscendentalCache::TAN,
|
||||||
|
TranscendentalCacheStub::TAGGED);
|
||||||
|
ZoneList<Expression*>* args = expr->arguments();
|
||||||
|
ASSERT(args->length() == 1);
|
||||||
|
VisitForStackValue(args->at(0));
|
||||||
|
__ mov(a0, result_register()); // Stub requires parameter in a0 and on tos.
|
||||||
|
__ CallStub(&stub);
|
||||||
|
context()->Plug(v0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void FullCodeGenerator::EmitMathLog(CallRuntime* expr) {
|
void FullCodeGenerator::EmitMathLog(CallRuntime* expr) {
|
||||||
// Load the argument on the stack and call the stub.
|
// Load the argument on the stack and call the stub.
|
||||||
TranscendentalCacheStub stub(TranscendentalCache::LOG,
|
TranscendentalCacheStub stub(TranscendentalCache::LOG,
|
||||||
|
@ -3070,6 +3070,14 @@ void LCodeGen::DoMathLog(LUnaryMathOperation* instr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LCodeGen::DoMathTan(LUnaryMathOperation* instr) {
|
||||||
|
ASSERT(ToDoubleRegister(instr->result()).is(f4));
|
||||||
|
TranscendentalCacheStub stub(TranscendentalCache::TAN,
|
||||||
|
TranscendentalCacheStub::UNTAGGED);
|
||||||
|
CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void LCodeGen::DoMathCos(LUnaryMathOperation* instr) {
|
void LCodeGen::DoMathCos(LUnaryMathOperation* instr) {
|
||||||
ASSERT(ToDoubleRegister(instr->result()).is(f4));
|
ASSERT(ToDoubleRegister(instr->result()).is(f4));
|
||||||
TranscendentalCacheStub stub(TranscendentalCache::COS,
|
TranscendentalCacheStub stub(TranscendentalCache::COS,
|
||||||
@ -3109,6 +3117,9 @@ void LCodeGen::DoUnaryMathOperation(LUnaryMathOperation* instr) {
|
|||||||
case kMathSin:
|
case kMathSin:
|
||||||
DoMathSin(instr);
|
DoMathSin(instr);
|
||||||
break;
|
break;
|
||||||
|
case kMathTan:
|
||||||
|
DoMathTan(instr);
|
||||||
|
break;
|
||||||
case kMathLog:
|
case kMathLog:
|
||||||
DoMathLog(instr);
|
DoMathLog(instr);
|
||||||
break;
|
break;
|
||||||
|
@ -242,6 +242,7 @@ class LCodeGen BASE_EMBEDDED {
|
|||||||
void DoMathSqrt(LUnaryMathOperation* instr);
|
void DoMathSqrt(LUnaryMathOperation* instr);
|
||||||
void DoMathPowHalf(LUnaryMathOperation* instr);
|
void DoMathPowHalf(LUnaryMathOperation* instr);
|
||||||
void DoMathLog(LUnaryMathOperation* instr);
|
void DoMathLog(LUnaryMathOperation* instr);
|
||||||
|
void DoMathTan(LUnaryMathOperation* instr);
|
||||||
void DoMathCos(LUnaryMathOperation* instr);
|
void DoMathCos(LUnaryMathOperation* instr);
|
||||||
void DoMathSin(LUnaryMathOperation* instr);
|
void DoMathSin(LUnaryMathOperation* instr);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user