comparison src/share/vm/jvmci/jvmciCompilerToVM.cpp @ 23743:a67f4d28935f jvmci-0.20

expose Hotspot intrinsics and HotSpotIntrinsicCandidate info to JVMCI compilers - part 2 (JDK-8164358)
author Doug Simon <doug.simon@oracle.com>
date Wed, 24 Aug 2016 14:35:44 +0200
parents 6542cd8da2da
children d6bd0b9cd0b6
comparison
equal deleted inserted replaced
23742:f0bfcd6688ce 23743:a67f4d28935f
200 SET_TRIGFUNC(dlog10); 200 SET_TRIGFUNC(dlog10);
201 SET_TRIGFUNC(dlog); 201 SET_TRIGFUNC(dlog);
202 SET_TRIGFUNC(dpow); 202 SET_TRIGFUNC(dpow);
203 203
204 #undef SET_TRIGFUNC 204 #undef SET_TRIGFUNC
205 }
206
207 objArrayHandle CompilerToVM::initialize_intrinsics(TRAPS) {
208 objArrayHandle vmIntrinsics = oopFactory::new_objArray(VMIntrinsicMethod::klass(), (vmIntrinsics::ID_LIMIT - 1), CHECK_(objArrayHandle()));
209 int index = 0;
210 // The intrinsics for a class are usually adjacent to each other.
211 // When they are, the string for the class name can be reused.
212 vmSymbols::SID kls_sid = vmSymbols::NO_SID;
213 Handle kls_str;
214 #define SID_ENUM(n) vmSymbols::VM_SYMBOL_ENUM_NAME(n)
215 #define VM_SYMBOL_TO_STRING(s) \
216 java_lang_String::create_from_symbol(vmSymbols::symbol_at(SID_ENUM(s)), CHECK_(objArrayHandle()))
217 #define VM_INTRINSIC_INFO(id, kls, name, sig, ignore_fcode) { \
218 instanceHandle vmIntrinsicMethod = InstanceKlass::cast(VMIntrinsicMethod::klass())->allocate_instance_handle(CHECK_(objArrayHandle())); \
219 if (kls_sid != SID_ENUM(kls)) { \
220 kls_str = VM_SYMBOL_TO_STRING(kls); \
221 kls_sid = SID_ENUM(kls); \
222 } \
223 Handle name_str = VM_SYMBOL_TO_STRING(name); \
224 Handle sig_str = VM_SYMBOL_TO_STRING(sig); \
225 VMIntrinsicMethod::set_declaringClass(vmIntrinsicMethod, kls_str()); \
226 VMIntrinsicMethod::set_name(vmIntrinsicMethod, name_str()); \
227 VMIntrinsicMethod::set_descriptor(vmIntrinsicMethod, sig_str()); \
228 VMIntrinsicMethod::set_id(vmIntrinsicMethod, vmIntrinsics::id); \
229 vmIntrinsics->obj_at_put(index++, vmIntrinsicMethod()); \
230 }
231
232 VM_INTRINSICS_DO(VM_INTRINSIC_INFO, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE)
233 #undef SID_ENUM
234 #undef VM_SYMBOL_TO_STRING
235 #undef VM_INTRINSIC_INFO
236 assert(index == vmIntrinsics::ID_LIMIT - 1, "must be");
237
238 return vmIntrinsics;
205 } 239 }
206 240
207 C2V_VMENTRY(jobjectArray, readConfiguration, (JNIEnv *env)) 241 C2V_VMENTRY(jobjectArray, readConfiguration, (JNIEnv *env))
208 #define BOXED_INT(name, value) oop name; do { jvalue p; p.j = (jint) (value); name = java_lang_boxing_object::create(T_INT, &p, CHECK_NULL);} while(0) 242 #define BOXED_INT(name, value) oop name; do { jvalue p; p.j = (jint) (value); name = java_lang_boxing_object::create(T_INT, &p, CHECK_NULL);} while(0)
209 #define BOXED_LONG(name, value) oop name; do { jvalue p; p.j = (jlong) (value); name = java_lang_boxing_object::create(T_LONG, &p, CHECK_NULL);} while(0) 243 #define BOXED_LONG(name, value) oop name; do { jvalue p; p.j = (jlong) (value); name = java_lang_boxing_object::create(T_LONG, &p, CHECK_NULL);} while(0)
328 JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type); 362 JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type);
329 } 363 }
330 vmFlags->obj_at_put(i, vmFlagObj()); 364 vmFlags->obj_at_put(i, vmFlagObj());
331 } 365 }
332 366
333 objArrayHandle vmIntrinsics = oopFactory::new_objArray(VMIntrinsicMethod::klass(), (vmIntrinsics::ID_LIMIT - 1), CHECK_NULL); 367 objArrayHandle vmIntrinsics = CompilerToVM::initialize_intrinsics(CHECK_NULL);
334 int index = 0;
335 // The intrinsics for a class are usually adjacent to each other.
336 // When they are, the string for the class name can be reused.
337 vmSymbols::SID kls_sid = vmSymbols::NO_SID;
338 Handle kls_str;
339 #define SID_ENUM(n) vmSymbols::VM_SYMBOL_ENUM_NAME(n)
340 #define VM_SYMBOL_TO_STRING(s) \
341 java_lang_String::create_from_symbol(vmSymbols::symbol_at(SID_ENUM(s)), THREAD)
342 #define VM_INTRINSIC_INFO(id, kls, name, sig, ignore_fcode) { \
343 instanceHandle vmIntrinsicMethod = InstanceKlass::cast(VMIntrinsicMethod::klass())->allocate_instance_handle(CHECK_NULL); \
344 if (kls_sid != SID_ENUM(kls)) { \
345 kls_str = VM_SYMBOL_TO_STRING(kls); \
346 kls_sid = SID_ENUM(kls); \
347 } \
348 Handle name_str = VM_SYMBOL_TO_STRING(name); \
349 Handle sig_str = VM_SYMBOL_TO_STRING(sig); \
350 VMIntrinsicMethod::set_declaringClass(vmIntrinsicMethod, kls_str()); \
351 VMIntrinsicMethod::set_name(vmIntrinsicMethod, name_str()); \
352 VMIntrinsicMethod::set_descriptor(vmIntrinsicMethod, sig_str()); \
353 VMIntrinsicMethod::set_id(vmIntrinsicMethod, vmIntrinsics::id); \
354 vmIntrinsics->obj_at_put(index++, vmIntrinsicMethod()); \
355 }
356
357 VM_INTRINSICS_DO(VM_INTRINSIC_INFO, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE)
358 #undef VM_INTRINSIC_SYMBOL
359 #undef VM_INTRINSIC_INFO
360 assert(index == vmIntrinsics::ID_LIMIT - 1, "must be");
361 368
362 objArrayOop data = oopFactory::new_objArray(SystemDictionary::Object_klass(), 6, CHECK_NULL); 369 objArrayOop data = oopFactory::new_objArray(SystemDictionary::Object_klass(), 6, CHECK_NULL);
363 data->obj_at_put(0, vmFields()); 370 data->obj_at_put(0, vmFields());
364 data->obj_at_put(1, vmTypes()); 371 data->obj_at_put(1, vmTypes());
365 data->obj_at_put(2, vmConstants()); 372 data->obj_at_put(2, vmConstants());
1501 {CC"resolveTypeInPool", CC"("HS_CONSTANT_POOL"I)"HS_RESOLVED_KLASS, FN_PTR(resolveTypeInPool)}, 1508 {CC"resolveTypeInPool", CC"("HS_CONSTANT_POOL"I)"HS_RESOLVED_KLASS, FN_PTR(resolveTypeInPool)},
1502 {CC"resolveFieldInPool", CC"("HS_CONSTANT_POOL"IB[J)"HS_RESOLVED_KLASS, FN_PTR(resolveFieldInPool)}, 1509 {CC"resolveFieldInPool", CC"("HS_CONSTANT_POOL"IB[J)"HS_RESOLVED_KLASS, FN_PTR(resolveFieldInPool)},
1503 {CC"resolveInvokeDynamicInPool", CC"("HS_CONSTANT_POOL"I)V", FN_PTR(resolveInvokeDynamicInPool)}, 1510 {CC"resolveInvokeDynamicInPool", CC"("HS_CONSTANT_POOL"I)V", FN_PTR(resolveInvokeDynamicInPool)},
1504 {CC"resolveInvokeHandleInPool", CC"("HS_CONSTANT_POOL"I)V", FN_PTR(resolveInvokeHandleInPool)}, 1511 {CC"resolveInvokeHandleInPool", CC"("HS_CONSTANT_POOL"I)V", FN_PTR(resolveInvokeHandleInPool)},
1505 {CC"resolveMethod", CC"("HS_RESOLVED_KLASS HS_RESOLVED_METHOD HS_RESOLVED_KLASS")"HS_RESOLVED_METHOD, FN_PTR(resolveMethod)}, 1512 {CC"resolveMethod", CC"("HS_RESOLVED_KLASS HS_RESOLVED_METHOD HS_RESOLVED_KLASS")"HS_RESOLVED_METHOD, FN_PTR(resolveMethod)},
1513 {CC "getSignaturePolymorphicHolders", CC "()[" STRING, FN_PTR(getSignaturePolymorphicHolders)},
1506 {CC"getVtableIndexForInterfaceMethod", CC"("HS_RESOLVED_KLASS HS_RESOLVED_METHOD")I", FN_PTR(getVtableIndexForInterfaceMethod)}, 1514 {CC"getVtableIndexForInterfaceMethod", CC"("HS_RESOLVED_KLASS HS_RESOLVED_METHOD")I", FN_PTR(getVtableIndexForInterfaceMethod)},
1507 {CC"getClassInitializer", CC"("HS_RESOLVED_KLASS")"HS_RESOLVED_METHOD, FN_PTR(getClassInitializer)}, 1515 {CC"getClassInitializer", CC"("HS_RESOLVED_KLASS")"HS_RESOLVED_METHOD, FN_PTR(getClassInitializer)},
1508 {CC"hasFinalizableSubclass", CC"("HS_RESOLVED_KLASS")Z", FN_PTR(hasFinalizableSubclass)}, 1516 {CC"hasFinalizableSubclass", CC"("HS_RESOLVED_KLASS")Z", FN_PTR(hasFinalizableSubclass)},
1509 {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)}, 1517 {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)},
1510 {CC"getResolvedJavaMethodAtSlot", CC"("CLASS"I)"HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethodAtSlot)}, 1518 {CC"getResolvedJavaMethodAtSlot", CC"("CLASS"I)"HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethodAtSlot)},