Mercurial > hg > release > icedtea7-forest-2.6 > hotspot
changeset 6445:da12b61bf5a2
8154537, PR3100: AArch64: some integer rotate instructions are never emitted
Reviewed-by: aph, adinn, kvn
author | roland |
---|---|
date | Tue, 19 Apr 2016 19:52:39 -0700 |
parents | 4b50705cd316 |
children | b96466d40a92 |
files | src/cpu/aarch64/vm/aarch64.ad test/compiler/codegen/IntRotateWithImmediate.java |
diffstat | 2 files changed, 26 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/cpu/aarch64/vm/aarch64.ad Fri Jul 08 01:58:45 2016 +0100 +++ b/src/cpu/aarch64/vm/aarch64.ad Tue Apr 19 19:52:39 2016 -0700 @@ -9156,21 +9156,21 @@ %} %} -instruct rorI_rReg_Var_C_32(iRegLNoSp dst, iRegL src, iRegI shift, immI_32 c_32, rFlagsReg cr) +instruct rorI_rReg_Var_C_32(iRegINoSp dst, iRegI src, iRegI shift, immI_32 c_32, rFlagsReg cr) %{ match(Set dst (OrI (URShiftI src shift) (LShiftI src (SubI c_32 shift)))); expand %{ - rorL_rReg(dst, src, shift, cr); - %} -%} - -instruct rorI_rReg_Var_C0(iRegLNoSp dst, iRegL src, iRegI shift, immI0 c0, rFlagsReg cr) + rorI_rReg(dst, src, shift, cr); + %} +%} + +instruct rorI_rReg_Var_C0(iRegINoSp dst, iRegI src, iRegI shift, immI0 c0, rFlagsReg cr) %{ match(Set dst (OrI (URShiftI src shift) (LShiftI src (SubI c0 shift)))); expand %{ - rorL_rReg(dst, src, shift, cr); + rorI_rReg(dst, src, shift, cr); %} %}
--- a/test/compiler/codegen/IntRotateWithImmediate.java Fri Jul 08 01:58:45 2016 +0100 +++ b/test/compiler/codegen/IntRotateWithImmediate.java Tue Apr 19 19:52:39 2016 -0700 @@ -1,5 +1,6 @@ /* * Copyright 2015 SAP AG. All Rights Reserved. + * Copyright (c) 2016, Red Hat, Inc. 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 @@ -24,6 +25,7 @@ /* * @test * @bug 8080190 + * @bug 8154537 * @key regression * @summary Test that the rotate distance used in the rotate instruction is properly masked with 0x1f * @run main/othervm -Xbatch -XX:-UseOnStackReplacement IntRotateWithImmediate @@ -33,7 +35,7 @@ public class IntRotateWithImmediate { // This is currently the same as Integer.rotateRight() - static int rotateRight(int i, int distance) { + static int rotateRight1(int i, int distance) { // On some architectures (i.e. x86_64 and ppc64) the following computation is // matched in the .ad file into a single MachNode which emmits a single rotate // machine instruction. It is important that the shift amount is masked to match @@ -43,17 +45,29 @@ return ((i >>> distance) | (i << -distance)); } - static int compute(int x) { - return rotateRight(x, 3); + static int rotateRight2(int i, int distance) { + return ((i >>> distance) | (i << (32-distance))); + } + + static int compute1(int x) { + return rotateRight1(x, 3); + } + + static int compute2(int x) { + return rotateRight2(x, 3); } public static void main(String args[]) { int val = 4096; - int firstResult = compute(val); + int firstResult = compute1(val); for (int i = 0; i < 100000; i++) { - int newResult = compute(val); + int newResult = compute1(val); + if (firstResult != newResult) { + throw new InternalError(firstResult + " != " + newResult); + } + newResult = compute2(val); if (firstResult != newResult) { throw new InternalError(firstResult + " != " + newResult); }