Mercurial > hg > graal-jvmci-8
changeset 22662:31da25ac2805
Extra flag in RegisterCategory to determine whether a register is part of the reference map.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Wed, 07 Oct 2015 12:14:03 +0200 |
parents | db43de18c170 |
children | 41b97852175d |
files | jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeUtil.java jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Register.java |
diffstat | 2 files changed, 20 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeUtil.java Tue Oct 06 10:52:22 2015 -0700 +++ b/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeUtil.java Wed Oct 07 12:14:03 2015 +0200 @@ -344,7 +344,7 @@ public DefaultRegFormatter(Architecture arch) { registers = new Register[arch.getRegisterReferenceMapSize()]; for (Register r : arch.getAvailableValueRegisters()) { - if (r.getReferenceMapIndex() >= 0) { + if (r.mayContainReference()) { assert registers[r.getReferenceMapIndex()] == null : "overlapping registers " + r + " and " + registers[r.getReferenceMapIndex()] + " in reference map"; registers[r.getReferenceMapIndex()] = r; }
--- a/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Register.java Tue Oct 06 10:52:22 2015 -0700 +++ b/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Register.java Wed Oct 07 12:14:03 2015 +0200 @@ -82,23 +82,29 @@ private final String name; + private final boolean mayContainReference; private final int referenceMapOffset; private final int referenceMapShift; public RegisterCategory(String name) { - this(name, 0, 0); + this(name, true, 0, 0); } public RegisterCategory(String name, boolean mayContainReference) { - this(name, mayContainReference ? 0 : Integer.MIN_VALUE, 0); + this(name, mayContainReference, 0, 0); } public RegisterCategory(String name, int referenceMapOffset) { - this(name, referenceMapOffset, 0); + this(name, true, referenceMapOffset, 0); } public RegisterCategory(String name, int referenceMapOffset, int referenceMapShift) { + this(name, true, referenceMapOffset, referenceMapShift); + } + + private RegisterCategory(String name, boolean mayContainReference, int referenceMapOffset, int referenceMapShift) { this.name = name; + this.mayContainReference = mayContainReference; this.referenceMapOffset = referenceMapOffset; this.referenceMapShift = referenceMapShift; } @@ -143,9 +149,18 @@ } /** - * Get the start index of this register in the {@link ReferenceMap}. + * Determine whether this register needs to be part of the reference map. + */ + public boolean mayContainReference() { + return registerCategory.mayContainReference; + } + + /** + * Get the start index of this register in the {@link ReferenceMap}. This method may only be + * called if {@link #mayContainReference()} is true. */ public int getReferenceMapIndex() { + assert mayContainReference(); return (encoding << registerCategory.referenceMapShift) + registerCategory.referenceMapOffset; }