243
244 // platform dependent
245 LIR_Opr getThreadPointer();
246
247 private:
248 // code emission
249 void do_ArithmeticOp_Long(ArithmeticOp* x);
250 void do_ArithmeticOp_Int (ArithmeticOp* x);
251 void do_ArithmeticOp_FPU (ArithmeticOp* x);
252
253 void do_RegisterFinalizer(Intrinsic* x);
254 void do_isInstance(Intrinsic* x);
255 void do_isPrimitive(Intrinsic* x);
256 void do_getModifiers(Intrinsic* x);
257 void do_getClass(Intrinsic* x);
258 void do_getObjectSize(Intrinsic* x);
259 void do_currentCarrierThread(Intrinsic* x);
260 void do_scopedValueCache(Intrinsic* x);
261 void do_vthread(Intrinsic* x);
262 void do_JavaThreadField(Intrinsic* x, ByteSize offset);
263 void do_FmaIntrinsic(Intrinsic* x);
264 void do_MathIntrinsic(Intrinsic* x);
265 void do_LibmIntrinsic(Intrinsic* x);
266 void do_ArrayCopy(Intrinsic* x);
267 void do_CompareAndSwap(Intrinsic* x, ValueType* type);
268 void do_PreconditionsCheckIndex(Intrinsic* x, BasicType type);
269 void do_FPIntrinsics(Intrinsic* x);
270 void do_Reference_get(Intrinsic* x);
271 void do_update_CRC32(Intrinsic* x);
272 void do_update_CRC32C(Intrinsic* x);
273 void do_vectorizedMismatch(Intrinsic* x);
274 void do_blackhole(Intrinsic* x);
275
276 public:
277 LIR_Opr call_runtime(BasicTypeArray* signature, LIRItemList* args, address entry, ValueType* result_type, CodeEmitInfo* info);
278 LIR_Opr call_runtime(BasicTypeArray* signature, LIR_OprList* args, address entry, ValueType* result_type, CodeEmitInfo* info);
279
280 // convenience functions
281 LIR_Opr call_runtime(Value arg1, address entry, ValueType* result_type, CodeEmitInfo* info);
282 LIR_Opr call_runtime(Value arg1, Value arg2, address entry, ValueType* result_type, CodeEmitInfo* info);
462 }
463
464 #ifdef __SOFTFP__
465 void do_soft_float_compare(If *x);
466 #endif // __SOFTFP__
467
468 SwitchRangeArray* create_lookup_ranges(TableSwitch* x);
469 SwitchRangeArray* create_lookup_ranges(LookupSwitch* x);
470 void do_SwitchRanges(SwitchRangeArray* x, LIR_Opr value, BlockBegin* default_sux);
471
472 void do_RuntimeCall(address routine, Intrinsic* x);
473
474 ciKlass* profile_type(ciMethodData* md, int md_first_offset, int md_offset, intptr_t profiled_k,
475 Value arg, LIR_Opr& mdp, bool not_null, ciKlass* signature_at_call_k,
476 ciKlass* callee_signature_k);
477 void profile_arguments(ProfileCall* x);
478 void profile_parameters(Base* x);
479 void profile_parameters_at_call(ProfileCall* x);
480 LIR_Opr mask_boolean(LIR_Opr array, LIR_Opr value, CodeEmitInfo*& null_check_info);
481
482 public:
483 Compilation* compilation() const { return _compilation; }
484 FrameMap* frame_map() const { return _compilation->frame_map(); }
485 ciMethod* method() const { return _method; }
486 BlockBegin* block() const { return _block; }
487 IRScope* scope() const { return block()->scope(); }
488
489 int max_virtual_register_number() const { return _virtual_register_number; }
490
491 void block_do(BlockBegin* block);
492
493 // Flags that can be set on vregs
494 enum VregFlag {
495 must_start_in_memory = 0 // needs to be assigned a memory location at beginning, but may then be loaded in a register
496 , callee_saved = 1 // must be in a callee saved register
497 , byte_reg = 2 // must be in a byte register
498 , num_vreg_flags
499
500 };
501
|
243
244 // platform dependent
245 LIR_Opr getThreadPointer();
246
247 private:
248 // code emission
249 void do_ArithmeticOp_Long(ArithmeticOp* x);
250 void do_ArithmeticOp_Int (ArithmeticOp* x);
251 void do_ArithmeticOp_FPU (ArithmeticOp* x);
252
253 void do_RegisterFinalizer(Intrinsic* x);
254 void do_isInstance(Intrinsic* x);
255 void do_isPrimitive(Intrinsic* x);
256 void do_getModifiers(Intrinsic* x);
257 void do_getClass(Intrinsic* x);
258 void do_getObjectSize(Intrinsic* x);
259 void do_currentCarrierThread(Intrinsic* x);
260 void do_scopedValueCache(Intrinsic* x);
261 void do_vthread(Intrinsic* x);
262 void do_JavaThreadField(Intrinsic* x, ByteSize offset);
263 void do_sizeOf(Intrinsic* x);
264 void do_addressOf(Intrinsic* x);
265 void do_FmaIntrinsic(Intrinsic* x);
266 void do_MathIntrinsic(Intrinsic* x);
267 void do_LibmIntrinsic(Intrinsic* x);
268 void do_ArrayCopy(Intrinsic* x);
269 void do_CompareAndSwap(Intrinsic* x, ValueType* type);
270 void do_PreconditionsCheckIndex(Intrinsic* x, BasicType type);
271 void do_FPIntrinsics(Intrinsic* x);
272 void do_Reference_get(Intrinsic* x);
273 void do_update_CRC32(Intrinsic* x);
274 void do_update_CRC32C(Intrinsic* x);
275 void do_vectorizedMismatch(Intrinsic* x);
276 void do_blackhole(Intrinsic* x);
277
278 public:
279 LIR_Opr call_runtime(BasicTypeArray* signature, LIRItemList* args, address entry, ValueType* result_type, CodeEmitInfo* info);
280 LIR_Opr call_runtime(BasicTypeArray* signature, LIR_OprList* args, address entry, ValueType* result_type, CodeEmitInfo* info);
281
282 // convenience functions
283 LIR_Opr call_runtime(Value arg1, address entry, ValueType* result_type, CodeEmitInfo* info);
284 LIR_Opr call_runtime(Value arg1, Value arg2, address entry, ValueType* result_type, CodeEmitInfo* info);
464 }
465
466 #ifdef __SOFTFP__
467 void do_soft_float_compare(If *x);
468 #endif // __SOFTFP__
469
470 SwitchRangeArray* create_lookup_ranges(TableSwitch* x);
471 SwitchRangeArray* create_lookup_ranges(LookupSwitch* x);
472 void do_SwitchRanges(SwitchRangeArray* x, LIR_Opr value, BlockBegin* default_sux);
473
474 void do_RuntimeCall(address routine, Intrinsic* x);
475
476 ciKlass* profile_type(ciMethodData* md, int md_first_offset, int md_offset, intptr_t profiled_k,
477 Value arg, LIR_Opr& mdp, bool not_null, ciKlass* signature_at_call_k,
478 ciKlass* callee_signature_k);
479 void profile_arguments(ProfileCall* x);
480 void profile_parameters(Base* x);
481 void profile_parameters_at_call(ProfileCall* x);
482 LIR_Opr mask_boolean(LIR_Opr array, LIR_Opr value, CodeEmitInfo*& null_check_info);
483
484 void do_sizeOf_impl(Intrinsic* x, int arg_idx);
485
486 public:
487 Compilation* compilation() const { return _compilation; }
488 FrameMap* frame_map() const { return _compilation->frame_map(); }
489 ciMethod* method() const { return _method; }
490 BlockBegin* block() const { return _block; }
491 IRScope* scope() const { return block()->scope(); }
492
493 int max_virtual_register_number() const { return _virtual_register_number; }
494
495 void block_do(BlockBegin* block);
496
497 // Flags that can be set on vregs
498 enum VregFlag {
499 must_start_in_memory = 0 // needs to be assigned a memory location at beginning, but may then be loaded in a register
500 , callee_saved = 1 // must be in a callee saved register
501 , byte_reg = 2 // must be in a byte register
502 , num_vreg_flags
503
504 };
505
|