Mercurial > hg > graal-jvmci-8
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)}, |