104 static address _atomic_xchg_long_entry;
105 static address _atomic_store_entry;
106 static address _atomic_cmpxchg_entry;
107 static address _atomic_cmpxchg_byte_entry;
108 static address _atomic_cmpxchg_long_entry;
109 static address _atomic_add_entry;
110 static address _atomic_add_long_entry;
111 static address _fence_entry;
112 static address _d2i_wrapper;
113 static address _d2l_wrapper;
114
115 static jint _fpu_cntrl_wrd_std;
116 static jint _fpu_cntrl_wrd_24;
117 static jint _fpu_cntrl_wrd_64;
118 static jint _fpu_cntrl_wrd_trunc;
119 static jint _mxcsr_std;
120 static jint _fpu_subnormal_bias1[3];
121 static jint _fpu_subnormal_bias2[3];
122
123 static BufferBlob* _code1; // code buffer for initial routines
124 static BufferBlob* _code2; // code buffer for all other routines
125
126 // Leaf routines which implement arraycopy and their addresses
127 // arraycopy operands aligned on element type boundary
128 static address _jbyte_arraycopy;
129 static address _jshort_arraycopy;
130 static address _jint_arraycopy;
131 static address _jlong_arraycopy;
132 static address _oop_arraycopy, _oop_arraycopy_uninit;
133 static address _jbyte_disjoint_arraycopy;
134 static address _jshort_disjoint_arraycopy;
135 static address _jint_disjoint_arraycopy;
136 static address _jlong_disjoint_arraycopy;
137 static address _oop_disjoint_arraycopy, _oop_disjoint_arraycopy_uninit;
138
139 // arraycopy operands aligned on zero'th element boundary
140 // These are identical to the ones aligned aligned on an
141 // element type boundary, except that they assume that both
142 // source and destination are HeapWord aligned.
143 static address _arrayof_jbyte_arraycopy;
144 static address _arrayof_jshort_arraycopy;
189
190 static address _multiplyToLen;
191 static address _squareToLen;
192 static address _mulAdd;
193 static address _montgomeryMultiply;
194 static address _montgomerySquare;
195
196 static address _vectorizedMismatch;
197
198 static address _dexp;
199 static address _dlog;
200 static address _dlog10;
201 static address _dpow;
202 static address _dsin;
203 static address _dcos;
204 static address _dlibm_sin_cos_huge;
205 static address _dlibm_reduce_pi04l;
206 static address _dlibm_tan_cot_huge;
207 static address _dtan;
208
209 // These are versions of the java.lang.Math methods which perform
210 // the same operations as the intrinsic version. They are used for
211 // constant folding in the compiler to ensure equivalence. If the
212 // intrinsic version returns the same result as the strict version
213 // then they can be set to the appropriate function from
214 // SharedRuntime.
215 static double (*_intrinsic_log10)(double);
216 static double (*_intrinsic_pow)(double, double);
217 static double (*_intrinsic_sin)(double);
218 static double (*_intrinsic_cos)(double);
219 static double (*_intrinsic_tan)(double);
220
221 // Safefetch stubs.
222 static address _safefetch32_entry;
223 static address _safefetch32_fault_pc;
224 static address _safefetch32_continuation_pc;
225 static address _safefetchN_entry;
226 static address _safefetchN_fault_pc;
227 static address _safefetchN_continuation_pc;
228
229 public:
230 // Initialization/Testing
231 static void initialize1(); // must happen before universe::genesis
232 static void initialize2(); // must happen after universe::genesis
233
234 static bool is_stub_code(address addr) { return contains(addr); }
235
236 static bool contains(address addr) {
237 return
238 (_code1 != NULL && _code1->blob_contains(addr)) ||
239 (_code2 != NULL && _code2->blob_contains(addr)) ;
240 }
241
242 static RuntimeBlob* code1() { return _code1; }
243 static RuntimeBlob* code2() { return _code2; }
244
245 // Debugging
246 static jint verify_oop_count() { return _verify_oop_count; }
247 static jint* verify_oop_count_addr() { return &_verify_oop_count; }
248 // a subroutine for debugging the GC
249 static address verify_oop_subroutine_entry_address() { return (address)&_verify_oop_subroutine_entry; }
250
251 static address catch_exception_entry() { return _catch_exception_entry; }
252
253 // Calls to Java
254 typedef void (*CallStub)(
255 address link,
256 intptr_t* result,
257 BasicType result_type,
258 Method* method,
259 address entry_point,
260 intptr_t* parameters,
261 int size_of_parameters,
262 TRAPS
263 );
364
365 static address multiplyToLen() { return _multiplyToLen; }
366 static address squareToLen() { return _squareToLen; }
367 static address mulAdd() { return _mulAdd; }
368 static address montgomeryMultiply() { return _montgomeryMultiply; }
369 static address montgomerySquare() { return _montgomerySquare; }
370
371 static address vectorizedMismatch() { return _vectorizedMismatch; }
372
373 static address dexp() { return _dexp; }
374 static address dlog() { return _dlog; }
375 static address dlog10() { return _dlog10; }
376 static address dpow() { return _dpow; }
377 static address dsin() { return _dsin; }
378 static address dcos() { return _dcos; }
379 static address dlibm_reduce_pi04l() { return _dlibm_reduce_pi04l; }
380 static address dlibm_sin_cos_huge() { return _dlibm_sin_cos_huge; }
381 static address dlibm_tan_cot_huge() { return _dlibm_tan_cot_huge; }
382 static address dtan() { return _dtan; }
383
384 static address select_fill_function(BasicType t, bool aligned, const char* &name);
385
386 static address zero_aligned_words() { return _zero_aligned_words; }
387
388 static double intrinsic_log10(double d) {
389 assert(_intrinsic_log10 != NULL, "must be defined");
390 return _intrinsic_log10(d);
391 }
392 static double intrinsic_pow(double d, double d2) {
393 assert(_intrinsic_pow != NULL, "must be defined");
394 return _intrinsic_pow(d, d2);
395 }
396 static double intrinsic_sin(double d) {
397 assert(_intrinsic_sin != NULL, "must be defined");
398 return _intrinsic_sin(d);
399 }
400 static double intrinsic_cos(double d) {
401 assert(_intrinsic_cos != NULL, "must be defined");
402 return _intrinsic_cos(d);
403 }
|
104 static address _atomic_xchg_long_entry;
105 static address _atomic_store_entry;
106 static address _atomic_cmpxchg_entry;
107 static address _atomic_cmpxchg_byte_entry;
108 static address _atomic_cmpxchg_long_entry;
109 static address _atomic_add_entry;
110 static address _atomic_add_long_entry;
111 static address _fence_entry;
112 static address _d2i_wrapper;
113 static address _d2l_wrapper;
114
115 static jint _fpu_cntrl_wrd_std;
116 static jint _fpu_cntrl_wrd_24;
117 static jint _fpu_cntrl_wrd_64;
118 static jint _fpu_cntrl_wrd_trunc;
119 static jint _mxcsr_std;
120 static jint _fpu_subnormal_bias1[3];
121 static jint _fpu_subnormal_bias2[3];
122
123 static BufferBlob* _code1; // code buffer for initial routines
124 static BufferBlob* _code2;
125 static BufferBlob* _code3; // code buffer for all other routines
126
127 // Leaf routines which implement arraycopy and their addresses
128 // arraycopy operands aligned on element type boundary
129 static address _jbyte_arraycopy;
130 static address _jshort_arraycopy;
131 static address _jint_arraycopy;
132 static address _jlong_arraycopy;
133 static address _oop_arraycopy, _oop_arraycopy_uninit;
134 static address _jbyte_disjoint_arraycopy;
135 static address _jshort_disjoint_arraycopy;
136 static address _jint_disjoint_arraycopy;
137 static address _jlong_disjoint_arraycopy;
138 static address _oop_disjoint_arraycopy, _oop_disjoint_arraycopy_uninit;
139
140 // arraycopy operands aligned on zero'th element boundary
141 // These are identical to the ones aligned aligned on an
142 // element type boundary, except that they assume that both
143 // source and destination are HeapWord aligned.
144 static address _arrayof_jbyte_arraycopy;
145 static address _arrayof_jshort_arraycopy;
190
191 static address _multiplyToLen;
192 static address _squareToLen;
193 static address _mulAdd;
194 static address _montgomeryMultiply;
195 static address _montgomerySquare;
196
197 static address _vectorizedMismatch;
198
199 static address _dexp;
200 static address _dlog;
201 static address _dlog10;
202 static address _dpow;
203 static address _dsin;
204 static address _dcos;
205 static address _dlibm_sin_cos_huge;
206 static address _dlibm_reduce_pi04l;
207 static address _dlibm_tan_cot_huge;
208 static address _dtan;
209
210 static address _cont_doYield;
211 static address _cont_thaw;
212 static address _cont_returnBarrier;
213 static address _cont_getSP;
214 static address _cont_getPC;
215
216 // These are versions of the java.lang.Math methods which perform
217 // the same operations as the intrinsic version. They are used for
218 // constant folding in the compiler to ensure equivalence. If the
219 // intrinsic version returns the same result as the strict version
220 // then they can be set to the appropriate function from
221 // SharedRuntime.
222 static double (*_intrinsic_log10)(double);
223 static double (*_intrinsic_pow)(double, double);
224 static double (*_intrinsic_sin)(double);
225 static double (*_intrinsic_cos)(double);
226 static double (*_intrinsic_tan)(double);
227
228 // Safefetch stubs.
229 static address _safefetch32_entry;
230 static address _safefetch32_fault_pc;
231 static address _safefetch32_continuation_pc;
232 static address _safefetchN_entry;
233 static address _safefetchN_fault_pc;
234 static address _safefetchN_continuation_pc;
235
236 public:
237 // Initialization/Testing
238 static void initialize1(); // must happen before universe::genesis
239 static void initialize2(); // must happen after universe::genesis
240 static void initializeContinuationStubs(); // must happen after universe::genesis
241
242 static bool is_stub_code(address addr) { return contains(addr); }
243
244 static bool contains(address addr) {
245 return
246 (_code1 != NULL && _code1->blob_contains(addr)) ||
247 (_code2 != NULL && _code2->blob_contains(addr)) ;
248 }
249
250 static RuntimeBlob* code1() { return _code1; }
251 static RuntimeBlob* code2() { return _code2; }
252 static RuntimeBlob* code3() { return _code3; }
253
254 // Debugging
255 static jint verify_oop_count() { return _verify_oop_count; }
256 static jint* verify_oop_count_addr() { return &_verify_oop_count; }
257 // a subroutine for debugging the GC
258 static address verify_oop_subroutine_entry_address() { return (address)&_verify_oop_subroutine_entry; }
259
260 static address catch_exception_entry() { return _catch_exception_entry; }
261
262 // Calls to Java
263 typedef void (*CallStub)(
264 address link,
265 intptr_t* result,
266 BasicType result_type,
267 Method* method,
268 address entry_point,
269 intptr_t* parameters,
270 int size_of_parameters,
271 TRAPS
272 );
373
374 static address multiplyToLen() { return _multiplyToLen; }
375 static address squareToLen() { return _squareToLen; }
376 static address mulAdd() { return _mulAdd; }
377 static address montgomeryMultiply() { return _montgomeryMultiply; }
378 static address montgomerySquare() { return _montgomerySquare; }
379
380 static address vectorizedMismatch() { return _vectorizedMismatch; }
381
382 static address dexp() { return _dexp; }
383 static address dlog() { return _dlog; }
384 static address dlog10() { return _dlog10; }
385 static address dpow() { return _dpow; }
386 static address dsin() { return _dsin; }
387 static address dcos() { return _dcos; }
388 static address dlibm_reduce_pi04l() { return _dlibm_reduce_pi04l; }
389 static address dlibm_sin_cos_huge() { return _dlibm_sin_cos_huge; }
390 static address dlibm_tan_cot_huge() { return _dlibm_tan_cot_huge; }
391 static address dtan() { return _dtan; }
392
393 static address cont_doYield() { return _cont_doYield; }
394 static address cont_thaw() { return _cont_thaw; }
395 static address cont_returnBarrier() { return _cont_returnBarrier; }
396 static address cont_getSP() { return _cont_getSP; }
397 static address cont_getPC() { return _cont_getPC; }
398
399
400 static address select_fill_function(BasicType t, bool aligned, const char* &name);
401
402 static address zero_aligned_words() { return _zero_aligned_words; }
403
404 static double intrinsic_log10(double d) {
405 assert(_intrinsic_log10 != NULL, "must be defined");
406 return _intrinsic_log10(d);
407 }
408 static double intrinsic_pow(double d, double d2) {
409 assert(_intrinsic_pow != NULL, "must be defined");
410 return _intrinsic_pow(d, d2);
411 }
412 static double intrinsic_sin(double d) {
413 assert(_intrinsic_sin != NULL, "must be defined");
414 return _intrinsic_sin(d);
415 }
416 static double intrinsic_cos(double d) {
417 assert(_intrinsic_cos != NULL, "must be defined");
418 return _intrinsic_cos(d);
419 }
|