209 // Given an immediate value, return an operand usable in logical ops. 210 LIR_Opr load_immediate(int x, BasicType type); 211 212 void set_result(Value x, LIR_Opr opr) { 213 assert(opr->is_valid(), "must set to valid value"); 214 assert(x->operand()->is_illegal(), "operand should never change"); 215 assert(!opr->is_register() || opr->is_virtual(), "should never set result to a physical register"); 216 x->set_operand(opr); 217 assert(opr == x->operand(), "must be"); 218 if (opr->is_virtual()) { 219 _instruction_for_operand.at_put_grow(opr->vreg_number(), x, NULL); 220 } 221 } 222 void set_no_result(Value x) { assert(!x->has_uses(), "can't have use"); x->clear_operand(); } 223 224 friend class LIRItem; 225 226 LIR_Opr round_item(LIR_Opr opr); 227 LIR_Opr force_to_spill(LIR_Opr value, BasicType t); 228 229 PhiResolverState& resolver_state() { return _resolver_state; } 230 231 void move_to_phi(PhiResolver* resolver, Value cur_val, Value sux_val); 232 void move_to_phi(ValueStack* cur_state); 233 234 // code emission 235 void do_ArithmeticOp_Long (ArithmeticOp* x); 236 void do_ArithmeticOp_Int (ArithmeticOp* x); 237 void do_ArithmeticOp_FPU (ArithmeticOp* x); 238 239 // platform dependent 240 LIR_Opr getThreadPointer(); 241 242 void do_RegisterFinalizer(Intrinsic* x); 243 void do_isInstance(Intrinsic* x); 244 void do_getClass(Intrinsic* x); 245 void do_currentThread(Intrinsic* x); 246 void do_MathIntrinsic(Intrinsic* x); 247 void do_ArrayCopy(Intrinsic* x); 248 void do_CompareAndSwap(Intrinsic* x, ValueType* type); 249 void do_NIOCheckIndex(Intrinsic* x); 250 void do_FPIntrinsics(Intrinsic* x); 251 void do_Reference_get(Intrinsic* x); 252 void do_update_CRC32(Intrinsic* x); 253 254 LIR_Opr call_runtime(BasicTypeArray* signature, LIRItemList* args, address entry, ValueType* result_type, CodeEmitInfo* info); 255 LIR_Opr call_runtime(BasicTypeArray* signature, LIR_OprList* args, address entry, ValueType* result_type, CodeEmitInfo* info); 256 257 // convenience functions 258 LIR_Opr call_runtime(Value arg1, address entry, ValueType* result_type, CodeEmitInfo* info); 259 LIR_Opr call_runtime(Value arg1, Value arg2, address entry, ValueType* result_type, CodeEmitInfo* info); 260 261 // GC Barriers 262 263 // generic interface 264 265 void pre_barrier(LIR_Opr addr_opr, LIR_Opr pre_val, bool do_load, bool patch, CodeEmitInfo* info); 266 void post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val); 267 268 // specific implementations 269 // pre barriers 270 271 void G1SATBCardTableModRef_pre_barrier(LIR_Opr addr_opr, LIR_Opr pre_val, 272 bool do_load, bool patch, CodeEmitInfo* info); 273 274 // post barriers 275 276 void G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val); 277 void CardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val); 278 #ifdef CARDTABLEMODREF_POST_BARRIER_HELPER 279 void CardTableModRef_post_barrier_helper(LIR_OprDesc* addr, LIR_Const* card_table_base); 280 #endif 281 282 283 static LIR_Opr result_register_for(ValueType* type, bool callee = false); 284 285 ciObject* get_jobject_constant(Value value); 286 | 209 // Given an immediate value, return an operand usable in logical ops. 210 LIR_Opr load_immediate(int x, BasicType type); 211 212 void set_result(Value x, LIR_Opr opr) { 213 assert(opr->is_valid(), "must set to valid value"); 214 assert(x->operand()->is_illegal(), "operand should never change"); 215 assert(!opr->is_register() || opr->is_virtual(), "should never set result to a physical register"); 216 x->set_operand(opr); 217 assert(opr == x->operand(), "must be"); 218 if (opr->is_virtual()) { 219 _instruction_for_operand.at_put_grow(opr->vreg_number(), x, NULL); 220 } 221 } 222 void set_no_result(Value x) { assert(!x->has_uses(), "can't have use"); x->clear_operand(); } 223 224 friend class LIRItem; 225 226 LIR_Opr round_item(LIR_Opr opr); 227 LIR_Opr force_to_spill(LIR_Opr value, BasicType t); 228 229 LIR_Opr force_opr_to(LIR_Opr op, LIR_Opr reg); 230 231 PhiResolverState& resolver_state() { return _resolver_state; } 232 233 void move_to_phi(PhiResolver* resolver, Value cur_val, Value sux_val); 234 void move_to_phi(ValueStack* cur_state); 235 236 // code emission 237 void do_ArithmeticOp_Long (ArithmeticOp* x); 238 void do_ArithmeticOp_Int (ArithmeticOp* x); 239 void do_ArithmeticOp_FPU (ArithmeticOp* x); 240 241 // platform dependent 242 LIR_Opr getThreadPointer(); 243 244 void do_RegisterFinalizer(Intrinsic* x); 245 void do_isInstance(Intrinsic* x); 246 void do_getClass(Intrinsic* x); 247 void do_currentThread(Intrinsic* x); 248 void do_MathIntrinsic(Intrinsic* x); 249 void do_ArrayCopy(Intrinsic* x); 250 void do_CompareAndSwap(Intrinsic* x, ValueType* type); 251 void do_NIOCheckIndex(Intrinsic* x); 252 void do_FPIntrinsics(Intrinsic* x); 253 void do_Reference_get(Intrinsic* x); 254 void do_update_CRC32(Intrinsic* x); 255 256 LIR_Opr call_runtime(BasicTypeArray* signature, LIRItemList* args, address entry, ValueType* result_type, CodeEmitInfo* info); 257 LIR_Opr call_runtime(BasicTypeArray* signature, LIR_OprList* args, address entry, ValueType* result_type, CodeEmitInfo* info); 258 259 // convenience functions 260 LIR_Opr call_runtime(Value arg1, address entry, ValueType* result_type, CodeEmitInfo* info); 261 LIR_Opr call_runtime(Value arg1, Value arg2, address entry, ValueType* result_type, CodeEmitInfo* info); 262 263 // GC Barriers 264 265 // generic interface 266 267 void pre_barrier(LIR_Opr addr_opr, LIR_Opr pre_val, bool do_load, bool patch, CodeEmitInfo* info); 268 void post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val); 269 270 LIR_Opr shenandoah_read_barrier(LIR_Opr obj, CodeEmitInfo* info, bool need_null_check); 271 LIR_Opr shenandoah_write_barrier(LIR_Opr obj, CodeEmitInfo* info, bool need_null_check); 272 273 // specific implementations 274 // pre barriers 275 276 void G1SATBCardTableModRef_pre_barrier(LIR_Opr addr_opr, LIR_Opr pre_val, 277 bool do_load, bool patch, CodeEmitInfo* info); 278 279 // post barriers 280 281 void G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val); 282 void CardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val); 283 #ifdef CARDTABLEMODREF_POST_BARRIER_HELPER 284 void CardTableModRef_post_barrier_helper(LIR_OprDesc* addr, LIR_Const* card_table_base); 285 #endif 286 287 288 static LIR_Opr result_register_for(ValueType* type, bool callee = false); 289 290 ciObject* get_jobject_constant(Value value); 291 |