Chromium Code Reviews| Index: runtime/vm/intermediate_language_x64.cc |
| =================================================================== |
| --- runtime/vm/intermediate_language_x64.cc (revision 27941) |
| +++ runtime/vm/intermediate_language_x64.cc (working copy) |
| @@ -4228,19 +4228,18 @@ |
| Register temp = locs()->temp(0).reg(); |
| XmmRegister zero_temp = locs()->temp(1).fpu_reg(); |
| - Label check_base_is_one; |
| // Check if exponent is 0.0 -> return 1.0; |
| __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0)), PP); |
| __ movsd(zero_temp, FieldAddress(temp, Double::value_offset())); |
| __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1)), PP); |
| __ movsd(result, FieldAddress(temp, Double::value_offset())); |
| // 'result' contains 1.0. |
| + Label exp_is_nan; |
| __ comisd(exp, zero_temp); |
| - __ j(PARITY_EVEN, &check_base_is_one, Assembler::kNearJump); // NaN. |
| + __ j(PARITY_EVEN, &exp_is_nan, Assembler::kNearJump); // NaN. |
| __ j(EQUAL, &skip_call, Assembler::kNearJump); // exp is 0, result is 1.0. |
| Label base_is_nan; |
| - __ Bind(&check_base_is_one); |
| // Checks if base == 1.0. |
| __ comisd(base, result); |
| __ j(PARITY_EVEN, &base_is_nan, Assembler::kNearJump); |
| @@ -4251,7 +4250,14 @@ |
| // Returns NaN. |
| __ movsd(result, base); |
| __ jmp(&skip_call, Assembler::kNearJump); |
| - // exp is Nan case is handled correctly in the C-library. |
| + |
| + __ Bind(&exp_is_nan); |
| + // Checks if base == 1.0. |
| + __ comisd(base, result); |
| + __ j(PARITY_EVEN, &base_is_nan, Assembler::kNearJump); |
| + __ j(EQUAL, &skip_call, Assembler::kNearJump); // base and result are 1.0 |
| + __ movsd(result, exp); |
|
srdjan
2013/09/26 13:09:22
Add comment: result is NaN
Florian Schneider
2013/09/26 13:11:28
Done.
|
| + __ jmp(&skip_call, Assembler::kNearJump); |
| } |
| __ Bind(&do_call); |
| __ CallRuntime(TargetFunction(), InputCount()); |