158 address StubRoutines::_vectorizedMismatch = NULL;
159
160 address StubRoutines::_dexp = NULL;
161 address StubRoutines::_dlog = NULL;
162 address StubRoutines::_dlog10 = NULL;
163 address StubRoutines::_dpow = NULL;
164 address StubRoutines::_dsin = NULL;
165 address StubRoutines::_dcos = NULL;
166 address StubRoutines::_dlibm_sin_cos_huge = NULL;
167 address StubRoutines::_dlibm_reduce_pi04l = NULL;
168 address StubRoutines::_dlibm_tan_cot_huge = NULL;
169 address StubRoutines::_dtan = NULL;
170
171 address StubRoutines::_safefetch32_entry = NULL;
172 address StubRoutines::_safefetch32_fault_pc = NULL;
173 address StubRoutines::_safefetch32_continuation_pc = NULL;
174 address StubRoutines::_safefetchN_entry = NULL;
175 address StubRoutines::_safefetchN_fault_pc = NULL;
176 address StubRoutines::_safefetchN_continuation_pc = NULL;
177
178 address StubRoutines::_vector_f_math[VectorSupport::NUM_VEC_SIZES][VectorSupport::NUM_SVML_OP] = {{NULL}, {NULL}};
179 address StubRoutines::_vector_d_math[VectorSupport::NUM_VEC_SIZES][VectorSupport::NUM_SVML_OP] = {{NULL}, {NULL}};
180
181 // Initialization
182 //
183 // Note: to break cycle with universe initialization, stubs are generated in two phases.
184 // The first one generates stubs needed during universe init (e.g., _handle_must_compile_first_entry).
185 // The second phase includes all other stubs (which may depend on universe being initialized.)
186
187 extern void StubGenerator_generate(CodeBuffer* code, bool all); // only interface to generators
188
189 void UnsafeCopyMemory::create_table(int max_size) {
190 UnsafeCopyMemory::_table = new UnsafeCopyMemory[max_size];
191 UnsafeCopyMemory::_table_max_length = max_size;
192 }
193
194 bool UnsafeCopyMemory::contains_pc(address pc) {
195 for (int i = 0; i < UnsafeCopyMemory::_table_length; i++) {
196 UnsafeCopyMemory* entry = &UnsafeCopyMemory::_table[i];
197 if (pc >= entry->start_pc() && pc < entry->end_pc()) {
468 #define RETURN_STUB(xxx_fill) { \
469 name = #xxx_fill; \
470 return StubRoutines::xxx_fill(); }
471
472 switch (t) {
473 case T_BYTE:
474 case T_BOOLEAN:
475 if (!aligned) RETURN_STUB(jbyte_fill);
476 RETURN_STUB(arrayof_jbyte_fill);
477 case T_CHAR:
478 case T_SHORT:
479 if (!aligned) RETURN_STUB(jshort_fill);
480 RETURN_STUB(arrayof_jshort_fill);
481 case T_INT:
482 case T_FLOAT:
483 if (!aligned) RETURN_STUB(jint_fill);
484 RETURN_STUB(arrayof_jint_fill);
485 case T_DOUBLE:
486 case T_LONG:
487 case T_ARRAY:
488 case T_OBJECT:
489 case T_NARROWOOP:
490 case T_NARROWKLASS:
491 case T_ADDRESS:
492 case T_VOID:
493 // Currently unsupported
494 return NULL;
495
496 default:
497 ShouldNotReachHere();
498 return NULL;
499 }
500
501 #undef RETURN_STUB
502 }
503
504 // constants for computing the copy function
505 enum {
506 COPYFUNC_UNALIGNED = 0,
507 COPYFUNC_ALIGNED = 1, // src, dest aligned to HeapWordSize
|
158 address StubRoutines::_vectorizedMismatch = NULL;
159
160 address StubRoutines::_dexp = NULL;
161 address StubRoutines::_dlog = NULL;
162 address StubRoutines::_dlog10 = NULL;
163 address StubRoutines::_dpow = NULL;
164 address StubRoutines::_dsin = NULL;
165 address StubRoutines::_dcos = NULL;
166 address StubRoutines::_dlibm_sin_cos_huge = NULL;
167 address StubRoutines::_dlibm_reduce_pi04l = NULL;
168 address StubRoutines::_dlibm_tan_cot_huge = NULL;
169 address StubRoutines::_dtan = NULL;
170
171 address StubRoutines::_safefetch32_entry = NULL;
172 address StubRoutines::_safefetch32_fault_pc = NULL;
173 address StubRoutines::_safefetch32_continuation_pc = NULL;
174 address StubRoutines::_safefetchN_entry = NULL;
175 address StubRoutines::_safefetchN_fault_pc = NULL;
176 address StubRoutines::_safefetchN_continuation_pc = NULL;
177
178 address StubRoutines::_load_inline_type_fields_in_regs = NULL;
179 address StubRoutines::_store_inline_type_fields_to_buf = NULL;
180
181 address StubRoutines::_vector_f_math[VectorSupport::NUM_VEC_SIZES][VectorSupport::NUM_SVML_OP] = {{NULL}, {NULL}};
182 address StubRoutines::_vector_d_math[VectorSupport::NUM_VEC_SIZES][VectorSupport::NUM_SVML_OP] = {{NULL}, {NULL}};
183
184 // Initialization
185 //
186 // Note: to break cycle with universe initialization, stubs are generated in two phases.
187 // The first one generates stubs needed during universe init (e.g., _handle_must_compile_first_entry).
188 // The second phase includes all other stubs (which may depend on universe being initialized.)
189
190 extern void StubGenerator_generate(CodeBuffer* code, bool all); // only interface to generators
191
192 void UnsafeCopyMemory::create_table(int max_size) {
193 UnsafeCopyMemory::_table = new UnsafeCopyMemory[max_size];
194 UnsafeCopyMemory::_table_max_length = max_size;
195 }
196
197 bool UnsafeCopyMemory::contains_pc(address pc) {
198 for (int i = 0; i < UnsafeCopyMemory::_table_length; i++) {
199 UnsafeCopyMemory* entry = &UnsafeCopyMemory::_table[i];
200 if (pc >= entry->start_pc() && pc < entry->end_pc()) {
471 #define RETURN_STUB(xxx_fill) { \
472 name = #xxx_fill; \
473 return StubRoutines::xxx_fill(); }
474
475 switch (t) {
476 case T_BYTE:
477 case T_BOOLEAN:
478 if (!aligned) RETURN_STUB(jbyte_fill);
479 RETURN_STUB(arrayof_jbyte_fill);
480 case T_CHAR:
481 case T_SHORT:
482 if (!aligned) RETURN_STUB(jshort_fill);
483 RETURN_STUB(arrayof_jshort_fill);
484 case T_INT:
485 case T_FLOAT:
486 if (!aligned) RETURN_STUB(jint_fill);
487 RETURN_STUB(arrayof_jint_fill);
488 case T_DOUBLE:
489 case T_LONG:
490 case T_ARRAY:
491 case T_PRIMITIVE_OBJECT:
492 case T_OBJECT:
493 case T_NARROWOOP:
494 case T_NARROWKLASS:
495 case T_ADDRESS:
496 case T_VOID:
497 // Currently unsupported
498 return NULL;
499
500 default:
501 ShouldNotReachHere();
502 return NULL;
503 }
504
505 #undef RETURN_STUB
506 }
507
508 // constants for computing the copy function
509 enum {
510 COPYFUNC_UNALIGNED = 0,
511 COPYFUNC_ALIGNED = 1, // src, dest aligned to HeapWordSize
|