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