Revision: 12535
Author: [email protected]
Date: Tue Sep 18 01:04:31 2012
Log: Improve the assembly code for power function with integer
exponential on x64
The change removes one unused multiply and reschedules
the shift, multiply and jump instructions to reduce
stall. Experiment shows it improve about 20% performance
on x64 for exponetials from about 100 to 2000.
Review URL: https://chromiumcodereview.appspot.com/10939013
Patch from Xi Qian <[email protected]>.
http://code.google.com/p/v8/source/detail?r=12535
Modified:
/branches/bleeding_edge/src/ia32/code-stubs-ia32.cc
/branches/bleeding_edge/src/x64/code-stubs-x64.cc
=======================================
--- /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Mon Sep 17 00:45:54
2012
+++ /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Tue Sep 18 01:04:31
2012
@@ -3213,7 +3213,7 @@
__ movsd(double_scratch2, double_result); // Load double_exponent with
1.
// Get absolute value of exponent.
- Label no_neg, while_true, no_multiply, while_false;
+ Label no_neg, while_true, while_false;
__ test(scratch, scratch);
__ j(positive, &no_neg, Label::kNear);
__ neg(scratch);
=======================================
--- /branches/bleeding_edge/src/x64/code-stubs-x64.cc Fri Sep 14 05:01:12
2012
+++ /branches/bleeding_edge/src/x64/code-stubs-x64.cc Tue Sep 18 01:04:31
2012
@@ -2262,21 +2262,28 @@
__ movsd(double_scratch2, double_result); // Load double_exponent with
1.
// Get absolute value of exponent.
- Label no_neg, while_true, no_multiply;
+ Label no_neg, while_true, while_false;
__ testl(scratch, scratch);
__ j(positive, &no_neg, Label::kNear);
__ negl(scratch);
__ bind(&no_neg);
- __ bind(&while_true);
+ __ j(zero, &while_false, Label::kNear);
__ shrl(scratch, Immediate(1));
- __ j(not_carry, &no_multiply, Label::kNear);
- __ mulsd(double_result, double_scratch);
- __ bind(&no_multiply);
+ // Above condition means CF==0 && ZF==0. This means that the
+ // bit that has been shifted out is 0 and the result is not 0.
+ __ j(above, &while_true, Label::kNear);
+ __ movsd(double_result, double_scratch);
+ __ j(zero, &while_false, Label::kNear);
+ __ bind(&while_true);
+ __ shrl(scratch, Immediate(1));
__ mulsd(double_scratch, double_scratch);
+ __ j(above, &while_true, Label::kNear);
+ __ mulsd(double_result, double_scratch);
__ j(not_zero, &while_true);
+ __ bind(&while_false);
// If the exponent is negative, return 1/result.
__ testl(exponent, exponent);
__ j(greater, &done);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev