< prev index next >

src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/RegisterAttributes.java

Print this page

        

*** 21,30 **** --- 21,32 ---- * questions. */ package jdk.vm.ci.code; import java.util.Arrays; + import java.util.Collections; + import java.util.List; /** * A collection of register attributes. The specific attribute values for a register may be local to * a compilation context. For example, a {@link RegisterConfig} in use during a compilation will * determine which registers are callee saved.
*** 51,67 **** * @param registerConfig a register configuration * @param registers a set of registers * @return an array whose length is the max register number in {@code registers} plus 1. An * element at index i holds the attributes of the register whose number is i. */ ! public static RegisterAttributes[] createMap(RegisterConfig registerConfig, Register[] registers) { ! RegisterAttributes[] map = new RegisterAttributes[registers.length]; for (Register reg : registers) { if (reg != null) { ! Register[] csr = registerConfig.getCalleeSaveRegisters(); ! RegisterAttributes attr = new RegisterAttributes(Arrays.asList(registerConfig.getCallerSaveRegisters()).contains(reg), csr == null ? false : Arrays.asList(csr).contains(reg), ! Arrays.asList(registerConfig.getAllocatableRegisters()).contains(reg)); if (map.length <= reg.number) { map = Arrays.copyOf(map, reg.number + 1); } map[reg.number] = attr; } --- 53,70 ---- * @param registerConfig a register configuration * @param registers a set of registers * @return an array whose length is the max register number in {@code registers} plus 1. An * element at index i holds the attributes of the register whose number is i. */ ! public static RegisterAttributes[] createMap(RegisterConfig registerConfig, RegisterArray registers) { ! RegisterAttributes[] map = new RegisterAttributes[registers.size()]; ! List<Register> callerSaveRegisters = registerConfig.getCallerSaveRegisters().asList(); ! List<Register> calleeSaveRegisters = registerConfig.getCalleeSaveRegisters() == null ? Collections.emptyList() : registerConfig.getCalleeSaveRegisters().asList(); ! List<Register> allocatableRegisters = registerConfig.getAllocatableRegisters().asList(); for (Register reg : registers) { if (reg != null) { ! RegisterAttributes attr = new RegisterAttributes(callerSaveRegisters.contains(reg), calleeSaveRegisters.contains(reg), allocatableRegisters.contains(reg)); if (map.length <= reg.number) { map = Arrays.copyOf(map, reg.number + 1); } map[reg.number] = attr; }
*** 73,99 **** } return map; } /** ! * @return Denotes a register that is available for use by a register allocator. */ public boolean isAllocatable() { return allocatable; } /** ! * @return Denotes a register whose value preservation (if required) across a call is the ! * responsibility of the callee. */ public boolean isCalleeSave() { return calleeSave; } /** ! * @return Denotes a register whose value preservation (if required) across a call is the ! * responsibility of the caller. */ public boolean isCallerSave() { return callerSave; } } --- 76,103 ---- } return map; } /** ! * @return {@code true} if a register is available for use by a register allocator otherwise ! * {@code false} */ public boolean isAllocatable() { return allocatable; } /** ! * @return {@code true} if a register whose value preservation (if required) across a call is ! * the responsibility of the callee otherwise {@code false} */ public boolean isCalleeSave() { return calleeSave; } /** ! * @return {@code true} if a register whose value preservation (if required) across a call is ! * the responsibility of the caller otherwise {@code false} */ public boolean isCallerSave() { return callerSave; } }
< prev index next >