comparison jvmci/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotRegisterConfig.java @ 22783:d63506bb5237

Make CallingConvention.Type extensible; remove unused stackOnly parameter
author Christian Wimmer <christian.wimmer@oracle.com>
date Thu, 21 Jan 2016 13:53:26 -0800
parents 577a4a8caa72
children 0ab4d816a7f0
comparison
equal deleted inserted replaced
22782:bf8a5a6861b1 22783:d63506bb5237
60 import jdk.vm.ci.code.RegisterAttributes; 60 import jdk.vm.ci.code.RegisterAttributes;
61 import jdk.vm.ci.code.RegisterConfig; 61 import jdk.vm.ci.code.RegisterConfig;
62 import jdk.vm.ci.code.StackSlot; 62 import jdk.vm.ci.code.StackSlot;
63 import jdk.vm.ci.code.TargetDescription; 63 import jdk.vm.ci.code.TargetDescription;
64 import jdk.vm.ci.common.JVMCIError; 64 import jdk.vm.ci.common.JVMCIError;
65 import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
65 import jdk.vm.ci.hotspot.HotSpotVMConfig; 66 import jdk.vm.ci.hotspot.HotSpotVMConfig;
66 import jdk.vm.ci.meta.AllocatableValue; 67 import jdk.vm.ci.meta.AllocatableValue;
67 import jdk.vm.ci.meta.JavaKind; 68 import jdk.vm.ci.meta.JavaKind;
68 import jdk.vm.ci.meta.JavaType; 69 import jdk.vm.ci.meta.JavaType;
69 import jdk.vm.ci.meta.LIRKind; 70 import jdk.vm.ci.meta.LIRKind;
189 public Register getRegisterForRole(int index) { 190 public Register getRegisterForRole(int index) {
190 throw new UnsupportedOperationException(); 191 throw new UnsupportedOperationException();
191 } 192 }
192 193
193 @Override 194 @Override
194 public CallingConvention getCallingConvention(Type type, JavaType returnType, JavaType[] parameterTypes, TargetDescription target, boolean stackOnly) { 195 public CallingConvention getCallingConvention(Type type, JavaType returnType, JavaType[] parameterTypes, TargetDescription target) {
195 if (type == Type.NativeCall) { 196 if (type == HotSpotCallingConventionType.NativeCall) {
196 return callingConvention(nativeGeneralParameterRegisters, returnType, parameterTypes, type, target, stackOnly); 197 return callingConvention(nativeGeneralParameterRegisters, returnType, parameterTypes, (HotSpotCallingConventionType) type, target);
197 } 198 }
198 // On x64, parameter locations are the same whether viewed 199 // On x64, parameter locations are the same whether viewed
199 // from the caller or callee perspective 200 // from the caller or callee perspective
200 return callingConvention(javaGeneralParameterRegisters, returnType, parameterTypes, type, target, stackOnly); 201 return callingConvention(javaGeneralParameterRegisters, returnType, parameterTypes, (HotSpotCallingConventionType) type, target);
201 } 202 }
202 203
203 public Register[] getCallingConventionRegisters(Type type, JavaKind kind) { 204 public Register[] getCallingConventionRegisters(Type type, JavaKind kind) {
204 switch (kind) { 205 switch (kind) {
205 case Boolean: 206 case Boolean:
207 case Short: 208 case Short:
208 case Char: 209 case Char:
209 case Int: 210 case Int:
210 case Long: 211 case Long:
211 case Object: 212 case Object:
212 return type == Type.NativeCall ? nativeGeneralParameterRegisters : javaGeneralParameterRegisters; 213 return type == HotSpotCallingConventionType.NativeCall ? nativeGeneralParameterRegisters : javaGeneralParameterRegisters;
213 case Float: 214 case Float:
214 case Double: 215 case Double:
215 return simdParameterRegisters; 216 return simdParameterRegisters;
216 default: 217 default:
217 throw JVMCIError.shouldNotReachHere(); 218 throw JVMCIError.shouldNotReachHere();
218 } 219 }
219 } 220 }
220 221
221 private CallingConvention callingConvention(Register[] generalParameterRegisters, JavaType returnType, JavaType[] parameterTypes, Type type, TargetDescription target, boolean stackOnly) { 222 private CallingConvention callingConvention(Register[] generalParameterRegisters, JavaType returnType, JavaType[] parameterTypes, HotSpotCallingConventionType type, TargetDescription target) {
222 AllocatableValue[] locations = new AllocatableValue[parameterTypes.length]; 223 AllocatableValue[] locations = new AllocatableValue[parameterTypes.length];
223 224
224 int currentGeneral = 0; 225 int currentGeneral = 0;
225 int currentSIMD = 0; 226 int currentSIMD = 0;
226 int currentStackOffset = 0; 227 int currentStackOffset = 0;
234 case Short: 235 case Short:
235 case Char: 236 case Char:
236 case Int: 237 case Int:
237 case Long: 238 case Long:
238 case Object: 239 case Object:
239 if (!stackOnly && currentGeneral < generalParameterRegisters.length) { 240 if (currentGeneral < generalParameterRegisters.length) {
240 Register register = generalParameterRegisters[currentGeneral++]; 241 Register register = generalParameterRegisters[currentGeneral++];
241 locations[i] = register.asValue(target.getLIRKind(kind)); 242 locations[i] = register.asValue(target.getLIRKind(kind));
242 } 243 }
243 break; 244 break;
244 case Float: 245 case Float:
245 case Double: 246 case Double:
246 if (!stackOnly && currentSIMD < simdParameterRegisters.length) { 247 if (currentSIMD < simdParameterRegisters.length) {
247 Register register = simdParameterRegisters[currentSIMD++]; 248 Register register = simdParameterRegisters[currentSIMD++];
248 locations[i] = register.asValue(target.getLIRKind(kind)); 249 locations[i] = register.asValue(target.getLIRKind(kind));
249 } 250 }
250 break; 251 break;
251 default: 252 default: