Wed, 15 Jun 2016 14:30:52 -0700
Merge
.hgtags | file | annotate | diff | comparison | revisions |
1.1 --- a/.hgtags Wed Jun 15 13:48:09 2016 -0700 1.2 +++ b/.hgtags Wed Jun 15 14:30:52 2016 -0700 1.3 @@ -861,6 +861,8 @@ 1.4 f3e1e734e2d29101a9537ddeb71ecad413fcd352 jdk8u92-b13 1.5 24a09407d71bb2cc4848bfa21660c890b4d722b1 jdk8u92-b14 1.6 445941ba41c0e3829fe02140690b144281ac2141 jdk8u92-b31 1.7 +f958bebdee267695e37aadd27753ac8b1e1823c8 jdk8u92-b32 1.8 +d1bb0e79ff79d21068388d9c62ca01e3c072fd0d jdk8u92-b33 1.9 b374548dcb4834eb8731a06b52faddd0f10bd45d jdk8u81-b00 1.10 ead07188d11107e877e8e4ad215ff6cb238a8a92 jdk8u101-b01 1.11 34429bad9986677f4991c80aeb22665842881cba jdk8u101-b02
2.1 --- a/src/cpu/x86/vm/macroAssembler_x86.cpp Wed Jun 15 13:48:09 2016 -0700 2.2 +++ b/src/cpu/x86/vm/macroAssembler_x86.cpp Wed Jun 15 14:30:52 2016 -0700 2.3 @@ -3202,7 +3202,24 @@ 2.4 jmp(done); 2.5 } else { 2.6 // Stack: X Y 2.7 - Label x_negative, y_odd; 2.8 + Label x_negative, y_not_2; 2.9 + 2.10 + static double two = 2.0; 2.11 + ExternalAddress two_addr((address)&two); 2.12 + 2.13 + // constant maybe too far on 64 bit 2.14 + lea(tmp2, two_addr); 2.15 + fld_d(Address(tmp2, 0)); // Stack: 2 X Y 2.16 + fcmp(tmp, 2, true, false); // Stack: X Y 2.17 + jcc(Assembler::parity, y_not_2); 2.18 + jcc(Assembler::notEqual, y_not_2); 2.19 + 2.20 + fxch(); fpop(); // Stack: X 2.21 + fmul(0); // Stack: X*X 2.22 + 2.23 + jmp(done); 2.24 + 2.25 + bind(y_not_2); 2.26 2.27 fldz(); // Stack: 0 X Y 2.28 fcmp(tmp, 1, true, false); // Stack: X Y
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/test/compiler/floatingpoint/TestPow2.java Wed Jun 15 14:30:52 2016 -0700 3.3 @@ -0,0 +1,73 @@ 3.4 +/* 3.5 + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3.7 + * 3.8 + * This code is free software; you can redistribute it and/or modify it 3.9 + * under the terms of the GNU General Public License version 2 only, as 3.10 + * published by the Free Software Foundation. 3.11 + * 3.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 3.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 3.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 3.15 + * version 2 for more details (a copy is included in the LICENSE file that 3.16 + * accompanied this code). 3.17 + * 3.18 + * You should have received a copy of the GNU General Public License version 3.19 + * 2 along with this work; if not, write to the Free Software Foundation, 3.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 3.21 + * 3.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 3.23 + * or visit www.oracle.com if you need additional information or have any 3.24 + * questions. 3.25 + */ 3.26 + 3.27 +/* 3.28 + * @test 3.29 + * @bug 8063086 3.30 + * @summary X^2 special case for C2 yields different result than interpreter 3.31 + * @library /testlibrary /testlibrary/whitebox /compiler/whitebox 3.32 + * @build TestPow2 3.33 + * @run main ClassFileInstaller sun.hotspot.WhiteBox 3.34 + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI 3.35 + * -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestPow2 3.36 + * 3.37 + */ 3.38 + 3.39 +import java.lang.reflect.*; 3.40 +import sun.hotspot.WhiteBox; 3.41 + 3.42 +public class TestPow2 { 3.43 + 3.44 + private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); 3.45 + 3.46 + private static final double base = 5350.456329377186; 3.47 + private static final double exp = 2.0; 3.48 + 3.49 + static double m() { 3.50 + return Math.pow(base, exp); 3.51 + } 3.52 + 3.53 + static public void main(String[] args) throws NoSuchMethodException { 3.54 + Method test_method = TestPow2.class.getDeclaredMethod("m"); 3.55 + 3.56 + double interpreter_result = m(); 3.57 + 3.58 + // Compile with C1 if possible 3.59 + WHITE_BOX.enqueueMethodForCompilation(test_method, CompilerWhiteBoxTest.COMP_LEVEL_SIMPLE); 3.60 + 3.61 + double c1_result = m(); 3.62 + 3.63 + WHITE_BOX.deoptimizeMethod(test_method); 3.64 + 3.65 + // Compile it with C2 if possible 3.66 + WHITE_BOX.enqueueMethodForCompilation(test_method, CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION); 3.67 + 3.68 + double c2_result = m(); 3.69 + 3.70 + if (interpreter_result != c1_result || interpreter_result != c2_result || 3.71 + c1_result != c2_result) { 3.72 + System.out.println("interpreter = " + interpreter_result + " c1 = " + c1_result + " c2 = " + c2_result); 3.73 + throw new RuntimeException("Test Failed"); 3.74 + } 3.75 + } 3.76 +}