comparison jvmci/jdk.vm.ci.hotspot.sparc/src/jdk/vm/ci/hotspot/sparc/SPARCHotSpotRegisterConfig.java @ 23700:9e1235406b59

[Findbugs] various warnings reported for JVMCI sources (JDK-8159613)
author Doug Simon <doug.simon@oracle.com>
date Sat, 18 Jun 2016 13:19:01 +0200
parents 3426a4ab05c3
children 1140503536ae
comparison
equal deleted inserted replaced
23699:8f9709f61cd4 23700:9e1235406b59
87 import static jdk.vm.ci.sparc.SPARC.o4; 87 import static jdk.vm.ci.sparc.SPARC.o4;
88 import static jdk.vm.ci.sparc.SPARC.o5; 88 import static jdk.vm.ci.sparc.SPARC.o5;
89 import static jdk.vm.ci.sparc.SPARC.sp; 89 import static jdk.vm.ci.sparc.SPARC.sp;
90 90
91 import java.util.ArrayList; 91 import java.util.ArrayList;
92 import java.util.Arrays;
93 import java.util.Collections;
94 import java.util.HashSet; 92 import java.util.HashSet;
95 import java.util.List; 93 import java.util.List;
96 94
97 import jdk.vm.ci.code.Architecture; 95 import jdk.vm.ci.code.Architecture;
98 import jdk.vm.ci.code.CallingConvention; 96 import jdk.vm.ci.code.CallingConvention;
99 import jdk.vm.ci.code.CallingConvention.Type; 97 import jdk.vm.ci.code.CallingConvention.Type;
100 import jdk.vm.ci.code.Register; 98 import jdk.vm.ci.code.Register;
99 import jdk.vm.ci.code.RegisterArray;
101 import jdk.vm.ci.code.RegisterAttributes; 100 import jdk.vm.ci.code.RegisterAttributes;
102 import jdk.vm.ci.code.RegisterConfig; 101 import jdk.vm.ci.code.RegisterConfig;
103 import jdk.vm.ci.code.StackSlot; 102 import jdk.vm.ci.code.StackSlot;
104 import jdk.vm.ci.code.TargetDescription; 103 import jdk.vm.ci.code.TargetDescription;
105 import jdk.vm.ci.code.ValueKindFactory; 104 import jdk.vm.ci.code.ValueKindFactory;
114 113
115 public class SPARCHotSpotRegisterConfig implements RegisterConfig { 114 public class SPARCHotSpotRegisterConfig implements RegisterConfig {
116 115
117 private final TargetDescription target; 116 private final TargetDescription target;
118 117
119 private final Register[] allocatable; 118 private final RegisterArray allocatable;
120 119
121 private final RegisterAttributes[] attributesMap; 120 private final RegisterAttributes[] attributesMap;
122 121
123 @Override 122 @Override
124 public Register[] getAllocatableRegisters() { 123 public RegisterArray getAllocatableRegisters() {
125 return allocatable.clone(); 124 return allocatable;
126 } 125 }
127 126
128 @Override 127 @Override
129 public Register[] filterAllocatableRegisters(PlatformKind kind, Register[] registers) { 128 public RegisterArray filterAllocatableRegisters(PlatformKind kind, RegisterArray registers) {
130 ArrayList<Register> list = new ArrayList<>(); 129 ArrayList<Register> list = new ArrayList<>();
131 for (Register reg : registers) { 130 for (Register reg : registers) {
132 if (target.arch.canStoreValue(reg.getRegisterCategory(), kind)) { 131 if (target.arch.canStoreValue(reg.getRegisterCategory(), kind)) {
133 list.add(reg); 132 list.add(reg);
134 } 133 }
135 } 134 }
136 Register[] ret = list.toArray(new Register[list.size()]); 135 return new RegisterArray(list);
137 return ret;
138 } 136 }
139 137
140 @Override 138 @Override
141 public RegisterAttributes[] getAttributesMap() { 139 public RegisterAttributes[] getAttributesMap() {
142 return attributesMap.clone(); 140 return attributesMap.clone();
143 } 141 }
144 142
145 private final Register[] cpuCallerParameterRegisters = {o0, o1, o2, o3, o4, o5}; 143 private final RegisterArray cpuCallerParameterRegisters = new RegisterArray(o0, o1, o2, o3, o4, o5);
146 private final Register[] cpuCalleeParameterRegisters = {i0, i1, i2, i3, i4, i5}; 144 private final RegisterArray cpuCalleeParameterRegisters = new RegisterArray(i0, i1, i2, i3, i4, i5);
147 145
148 private final Register[] fpuFloatJavaParameterRegisters = {f0, f1, f2, f3, f4, f5, f6, f7}; 146 private final RegisterArray fpuFloatJavaParameterRegisters = new RegisterArray(f0, f1, f2, f3, f4, f5, f6, f7);
149 private final Register[] fpuDoubleJavaParameterRegisters = {d0, null, d2, null, d4, null, d6, null}; 147 private final RegisterArray fpuDoubleJavaParameterRegisters = new RegisterArray(d0, null, d2, null, d4, null, d6, null);
150 148
151 // @formatter:off 149 // @formatter:off
152 private final Register[] fpuFloatNativeParameterRegisters = { 150 private final RegisterArray fpuFloatNativeParameterRegisters = new RegisterArray(
153 f1, f3, f5, f7, f9, f11, f13, f15, 151 f1, f3, f5, f7, f9, f11, f13, f15,
154 f17, f19, f21, f23, f25, f27, f29, f31}; 152 f17, f19, f21, f23, f25, f27, f29, f31);
155 153
156 private final Register[] fpuDoubleNativeParameterRegisters = { 154 private final RegisterArray fpuDoubleNativeParameterRegisters = new RegisterArray(
157 d0, d2, d4, d6, d8, d10, d12, d14, 155 d0, d2, d4, d6, d8, d10, d12, d14,
158 d16, d18, d20, d22, d24, d26, d28, d30}; 156 d16, d18, d20, d22, d24, d26, d28, d30);
159 157
160 private final Register[] callerSaveRegisters; 158 private final RegisterArray callerSaveRegisters;
161 159
162 /** 160 /**
163 * This lists all L and I registers which are saved in the register window. 161 * This lists all L and I registers which are saved in the register window.
164 */ 162 */
165 private final Register[] windowSaveRegisters = { 163 private final RegisterArray windowSaveRegisters = new RegisterArray(
166 l0, l1, l2, l3, l4, l5, l6, l7, 164 l0, l1, l2, l3, l4, l5, l6, l7,
167 i0, i1, i2, i3, i4, i5, i6, i7}; 165 i0, i1, i2, i3, i4, i5, i6, i7);
168 // @formatter:on 166 // @formatter:on
169 167
170 private static final Register[] reservedRegisters = {sp, g0, g2}; 168 private static final RegisterArray reservedRegisters = new RegisterArray(sp, g0, g2);
171 169
172 private static Register[] initAllocatable(Architecture arch, boolean reserveForHeapBase) { 170 private static RegisterArray initAllocatable(Architecture arch, boolean reserveForHeapBase) {
173 Register[] allRegisters = arch.getAvailableValueRegisters(); 171 RegisterArray allRegisters = arch.getAvailableValueRegisters();
174 Register[] registers = new Register[allRegisters.length - reservedRegisters.length - (reserveForHeapBase ? 1 : 0)]; 172 Register[] registers = new Register[allRegisters.size() - reservedRegisters.size() - (reserveForHeapBase ? 1 : 0)];
175 List<Register> reservedRegistersList = Arrays.asList(reservedRegisters); 173 List<Register> reservedRegistersList = reservedRegisters.asList();
176 174
177 int idx = 0; 175 int idx = 0;
178 for (Register reg : allRegisters) { 176 for (Register reg : allRegisters) {
179 if (reservedRegistersList.contains(reg)) { 177 if (reservedRegistersList.contains(reg)) {
180 // skip reserved registers 178 // skip reserved registers
187 185
188 registers[idx++] = reg; 186 registers[idx++] = reg;
189 } 187 }
190 188
191 assert idx == registers.length; 189 assert idx == registers.length;
192 return registers; 190 return new RegisterArray(registers);
193 } 191 }
194 192
195 public SPARCHotSpotRegisterConfig(TargetDescription target, boolean useCompressedOops) { 193 public SPARCHotSpotRegisterConfig(TargetDescription target, boolean useCompressedOops) {
196 this(target, initAllocatable(target.arch, useCompressedOops)); 194 this(target, initAllocatable(target.arch, useCompressedOops));
197 } 195 }
198 196
199 public SPARCHotSpotRegisterConfig(TargetDescription target, Register[] allocatable) { 197 public SPARCHotSpotRegisterConfig(TargetDescription target, RegisterArray allocatable) {
200 this.target = target; 198 this.target = target;
201 this.allocatable = allocatable.clone(); 199 this.allocatable = allocatable;
202 HashSet<Register> callerSaveSet = new HashSet<>(); 200 HashSet<Register> callerSaveSet = new HashSet<>();
203 Collections.addAll(callerSaveSet, target.arch.getAvailableValueRegisters()); 201 target.arch.getAvailableValueRegisters().addTo(callerSaveSet);
204 for (Register cs : windowSaveRegisters) { 202 for (Register cs : windowSaveRegisters) {
205 callerSaveSet.remove(cs); 203 callerSaveSet.remove(cs);
206 } 204 }
207 this.callerSaveRegisters = callerSaveSet.toArray(new Register[callerSaveSet.size()]); 205 this.callerSaveRegisters = new RegisterArray(callerSaveSet);
208 attributesMap = RegisterAttributes.createMap(this, SPARC.allRegisters); 206 attributesMap = RegisterAttributes.createMap(this, SPARC.allRegisters);
209 } 207 }
210 208
211 @Override 209 @Override
212 public Register[] getCallerSaveRegisters() { 210 public RegisterArray getCallerSaveRegisters() {
213 return callerSaveRegisters; 211 return callerSaveRegisters;
214 } 212 }
215 213
216 @Override 214 @Override
217 public Register[] getCalleeSaveRegisters() { 215 public RegisterArray getCalleeSaveRegisters() {
218 return null; 216 return null;
219 } 217 }
220 218
221 @Override 219 @Override
222 public boolean areAllAllocatableRegistersCallerSaved() { 220 public boolean areAllAllocatableRegistersCallerSaved() {
234 } 232 }
235 throw JVMCIError.shouldNotReachHere(); 233 throw JVMCIError.shouldNotReachHere();
236 } 234 }
237 235
238 @Override 236 @Override
239 public Register[] getCallingConventionRegisters(Type type, JavaKind kind) { 237 public RegisterArray getCallingConventionRegisters(Type type, JavaKind kind) {
240 HotSpotCallingConventionType hotspotType = (HotSpotCallingConventionType) type; 238 HotSpotCallingConventionType hotspotType = (HotSpotCallingConventionType) type;
241 switch (kind) { 239 switch (kind) {
242 case Boolean: 240 case Boolean:
243 case Byte: 241 case Byte:
244 case Short: 242 case Short:
253 default: 251 default:
254 throw JVMCIError.shouldNotReachHere("Unknown JavaKind " + kind); 252 throw JVMCIError.shouldNotReachHere("Unknown JavaKind " + kind);
255 } 253 }
256 } 254 }
257 255
258 private CallingConvention callingConvention(Register[] generalParameterRegisters, JavaType returnType, JavaType[] parameterTypes, HotSpotCallingConventionType type, 256 private CallingConvention callingConvention(RegisterArray generalParameterRegisters, JavaType returnType, JavaType[] parameterTypes, HotSpotCallingConventionType type,
259 ValueKindFactory<?> valueKindFactory) { 257 ValueKindFactory<?> valueKindFactory) {
260 AllocatableValue[] locations = new AllocatableValue[parameterTypes.length]; 258 AllocatableValue[] locations = new AllocatableValue[parameterTypes.length];
261 259
262 int currentGeneral = 0; 260 int currentGeneral = 0;
263 int currentFloating = 0; 261 int currentFloating = 0;
265 boolean isNative = type == HotSpotCallingConventionType.NativeCall; 263 boolean isNative = type == HotSpotCallingConventionType.NativeCall;
266 264
267 for (int i = 0; i < parameterTypes.length; i++) { 265 for (int i = 0; i < parameterTypes.length; i++) {
268 final JavaKind kind = parameterTypes[i].getJavaKind().getStackKind(); 266 final JavaKind kind = parameterTypes[i].getJavaKind().getStackKind();
269 if (isNative) { 267 if (isNative) {
270 Register[] registerSet; 268 RegisterArray registerSet;
271 switch (kind) { 269 switch (kind) {
272 case Byte: 270 case Byte:
273 case Boolean: 271 case Boolean:
274 case Short: 272 case Short:
275 case Char: 273 case Char:
285 registerSet = fpuFloatNativeParameterRegisters; 283 registerSet = fpuFloatNativeParameterRegisters;
286 break; 284 break;
287 default: 285 default:
288 throw JVMCIError.shouldNotReachHere(); 286 throw JVMCIError.shouldNotReachHere();
289 } 287 }
290 if (i < registerSet.length) { 288 if (i < registerSet.size()) {
291 locations[i] = registerSet[i].asValue(valueKindFactory.getValueKind(kind)); 289 locations[i] = registerSet.get(i).asValue(valueKindFactory.getValueKind(kind));
292 currentStackOffset += target.arch.getWordSize(); 290 currentStackOffset += target.arch.getWordSize();
293 } 291 }
294 } else { 292 } else {
295 switch (kind) { 293 switch (kind) {
296 case Byte: 294 case Byte:
298 case Short: 296 case Short:
299 case Char: 297 case Char:
300 case Int: 298 case Int:
301 case Long: 299 case Long:
302 case Object: 300 case Object:
303 if (currentGeneral < generalParameterRegisters.length) { 301 if (currentGeneral < generalParameterRegisters.size()) {
304 Register register = generalParameterRegisters[currentGeneral++]; 302 Register register = generalParameterRegisters.get(currentGeneral++);
305 locations[i] = register.asValue(valueKindFactory.getValueKind(kind)); 303 locations[i] = register.asValue(valueKindFactory.getValueKind(kind));
306 } 304 }
307 break; 305 break;
308 case Double: 306 case Double:
309 if (currentFloating < fpuFloatJavaParameterRegisters.length) { 307 if (currentFloating < fpuFloatJavaParameterRegisters.size()) {
310 if (currentFloating % 2 != 0) { 308 if (currentFloating % 2 != 0) {
311 // Make register number even to be a double reg 309 // Make register number even to be a double reg
312 currentFloating++; 310 currentFloating++;
313 } 311 }
314 Register register = fpuDoubleJavaParameterRegisters[currentFloating]; 312 Register register = fpuDoubleJavaParameterRegisters.get(currentFloating);
315 currentFloating += 2; // Only every second is a double register 313 currentFloating += 2; // Only every second is a double register
316 locations[i] = register.asValue(valueKindFactory.getValueKind(kind)); 314 locations[i] = register.asValue(valueKindFactory.getValueKind(kind));
317 } 315 }
318 break; 316 break;
319 case Float: 317 case Float:
320 if (currentFloating < fpuFloatJavaParameterRegisters.length) { 318 if (currentFloating < fpuFloatJavaParameterRegisters.size()) {
321 Register register = fpuFloatJavaParameterRegisters[currentFloating++]; 319 Register register = fpuFloatJavaParameterRegisters.get(currentFloating++);
322 locations[i] = register.asValue(valueKindFactory.getValueKind(kind)); 320 locations[i] = register.asValue(valueKindFactory.getValueKind(kind));
323 } 321 }
324 break; 322 break;
325 default: 323 default:
326 throw JVMCIError.shouldNotReachHere(); 324 throw JVMCIError.shouldNotReachHere();
381 return sp; 379 return sp;
382 } 380 }
383 381
384 @Override 382 @Override
385 public String toString() { 383 public String toString() {
386 return String.format("Allocatable: " + Arrays.toString(getAllocatableRegisters()) + "%n" + "CallerSave: " + Arrays.toString(getCallerSaveRegisters()) + "%n"); 384 return String.format("Allocatable: " + getAllocatableRegisters() + "%n" + "CallerSave: " + getCallerSaveRegisters() + "%n");
387 } 385 }
388 } 386 }