--- /dev/null 2017-01-22 10:16:57.869617664 -0800 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopSpilling.java 2017-02-15 17:03:27.372310428 -0800 @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.graalvm.compiler.jtt.loop; + +import org.junit.Test; + +import org.graalvm.compiler.jtt.JTTTest; + +public class LoopSpilling extends JTTTest { + + private static final int ITERATION = 64; + + /** + * Modification of sun.security.provider.SHA2.implCompress(). + */ + void test(int[] state) { + + int a1 = state[0]; + int b1 = state[1]; + int c1 = state[2]; + int d1 = state[3]; + int e1 = state[4]; + int f1 = state[5]; + int g1 = state[6]; + int h1 = state[7]; + + // 2nd + int a2 = state[8]; + int b2 = state[9]; + int c2 = state[10]; + int d2 = state[11]; + int e2 = state[12]; + int f2 = state[13]; + int g2 = state[14]; + int h2 = state[15]; + + for (int i = 0; i < ITERATION; i++) { + h1 = g1; + g1 = f1; + f1 = e1; + e1 = d1; + d1 = c1; + c1 = b1; + b1 = a1; + a1 = h1; + // 2nd + h2 = g2; + g2 = f2; + f2 = e2; + e2 = d2; + d2 = c2; + c2 = b2; + b2 = a2; + a2 = h2; + } + state[0] += a1; + state[1] += b1; + state[2] += c1; + state[3] += d1; + state[4] += e1; + state[5] += f1; + state[6] += g1; + state[7] += h1; + // 2nd + state[8] += a2; + state[9] += b2; + state[10] += c2; + state[11] += d2; + state[12] += e2; + state[13] += f2; + state[14] += g2; + state[15] += h2; + } + + private static final int[] INITIAL_HASHES = {0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4, 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; + + @Test + public void run0() throws Throwable { + runTest("test", supply(() -> INITIAL_HASHES.clone())); + } + +}