1.1 --- a/src/cpu/x86/vm/macroAssembler_x86.cpp Wed May 18 11:06:00 2016 +0200 1.2 +++ b/src/cpu/x86/vm/macroAssembler_x86.cpp Tue May 24 17:49:06 2016 +0530 1.3 @@ -3202,7 +3202,24 @@ 1.4 jmp(done); 1.5 } else { 1.6 // Stack: X Y 1.7 - Label x_negative, y_odd; 1.8 + Label x_negative, y_not_2; 1.9 + 1.10 + static double two = 2.0; 1.11 + ExternalAddress two_addr((address)&two); 1.12 + 1.13 + // constant maybe too far on 64 bit 1.14 + lea(tmp2, two_addr); 1.15 + fld_d(Address(tmp2, 0)); // Stack: 2 X Y 1.16 + fcmp(tmp, 2, true, false); // Stack: X Y 1.17 + jcc(Assembler::parity, y_not_2); 1.18 + jcc(Assembler::notEqual, y_not_2); 1.19 + 1.20 + fxch(); fpop(); // Stack: X 1.21 + fmul(0); // Stack: X*X 1.22 + 1.23 + jmp(done); 1.24 + 1.25 + bind(y_not_2); 1.26 1.27 fldz(); // Stack: 0 X Y 1.28 fcmp(tmp, 1, true, false); // Stack: X Y