Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(479)

Unified Diff: src/ia32/codegen-ia32.cc

Issue 504073: Optimize sine and cosine by checking up front if the fsin or fcos... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/ia32/codegen-ia32.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ia32/codegen-ia32.cc
===================================================================
--- src/ia32/codegen-ia32.cc (revision 3504)
+++ src/ia32/codegen-ia32.cc (working copy)
@@ -5390,9 +5390,17 @@
number.ToRegister();
frame_->Spill(number.reg());
FloatingPointHelper::LoadFloatOperand(masm_, number.reg());
+
+ // Check whether the exponent is so big that performing a sine or
+ // cosine operation could result in inaccurate results or an
+ // exception. In that case call the runtime routine.
+ __ and_(number.reg(), HeapNumber::kExponentMask);
+ __ cmp(Operand(number.reg()), Immediate(kTwoToThePowerOf63Exponent));
+ call_runtime.Branch(greater_equal, not_taken);
number.Unuse();
- // Perform the operation on the number.
+ // Perform the operation on the number. This will succeed since we
+ // already checked that it is in range.
switch (op) {
case SIN:
__ fsin();
@@ -5402,14 +5410,6 @@
break;
}
- // Go slow case if argument to operation is out of range.
- Result eax_reg = allocator_->Allocate(eax);
- ASSERT(eax_reg.is_valid());
- __ fnstsw_ax();
- __ sahf();
- eax_reg.Unuse();
- call_runtime.Branch(parity_even, not_taken);
-
// Allocate heap number for result if possible.
Result scratch1 = allocator()->Allocate();
Result scratch2 = allocator()->Allocate();
@@ -7465,9 +7465,8 @@
if (use_sse3) {
CpuFeatures::Scope scope(SSE3);
// Check whether the exponent is too big for a 64 bit signed integer.
- const uint32_t too_big_exponent =
- (HeapNumber::kExponentBias + 63) << HeapNumber::kExponentShift;
- __ cmp(Operand(scratch2), Immediate(too_big_exponent));
+ __ cmp(Operand(scratch2),
+ Immediate(CodeGenerator::kTwoToThePowerOf63Exponent));
__ j(greater_equal, conversion_failure);
// Load x87 register with heap number.
__ fld_d(FieldOperand(source, HeapNumber::kValueOffset));
« no previous file with comments | « src/ia32/codegen-ia32.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698