MIPS: Fix kraken 1.1 benchmark failure.

This makes sure that the DoubleToIStub::Generate method
does not overwrite the value of the f12 register.

TEST=bencnhmarks/kraken/stanford-crypto-pbkdf2
BUG=
R=plind44@gmail.com

Review URL: https://codereview.chromium.org/33463002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17306 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
palfia@homejinni.com 2013-10-21 22:22:03 +00:00
parent 26e02eea57
commit f687039bd8

View File

@ -547,23 +547,27 @@ void DoubleToIStub::Generate(MacroAssembler* masm) {
GetRegisterThatIsNotOneOf(input_reg, result_reg, scratch);
Register scratch3 =
GetRegisterThatIsNotOneOf(input_reg, result_reg, scratch, scratch2);
DoubleRegister double_scratch = kLithiumScratchDouble.low();
DoubleRegister double_input = f12;
DoubleRegister double_scratch = kLithiumScratchDouble;
__ Push(scratch, scratch2, scratch3);
__ ldc1(double_input, MemOperand(input_reg, double_offset));
if (!skip_fastpath()) {
// Load double input.
__ ldc1(double_scratch, MemOperand(input_reg, double_offset));
// Clear cumulative exception flags and save the FCSR.
__ cfc1(scratch2, FCSR);
__ ctc1(zero_reg, FCSR);
// Try a conversion to a signed integer.
__ trunc_w_d(double_scratch, double_input);
__ Trunc_w_d(double_scratch, double_scratch);
// Move the converted value into the result register.
__ mfc1(result_reg, double_scratch);
// Retrieve and restore the FCSR.
__ cfc1(scratch, FCSR);
__ ctc1(scratch2, FCSR);
// Check for overflow and NaNs.
__ And(
scratch, scratch,
@ -576,7 +580,9 @@ void DoubleToIStub::Generate(MacroAssembler* masm) {
// Load the double value and perform a manual truncation.
Register input_high = scratch2;
Register input_low = scratch3;
__ Move(input_low, input_high, double_input);
__ lw(input_low, MemOperand(input_reg, double_offset));
__ lw(input_high, MemOperand(input_reg, double_offset + kIntSize));
Label normal_exponent, restore_sign;
// Extract the biased exponent in result.