37 // Dead - Dead; can be Zapped for debugging 38 // CalleeXX - Callee saved; also describes which caller register is saved 39 // DerivedXX - A derived oop; original oop is described. 40 // 41 // OopMapValue describes a single OopMap entry 42 43 class frame; 44 class RegisterMap; 45 class DerivedPointerEntry; 46 47 class OopMapValue: public StackObj { 48 friend class VMStructs; 49 private: 50 short _value; 51 int value() const { return _value; } 52 void set_value(int value) { _value = value; } 53 short _content_reg; 54 55 public: 56 // Constants 57 enum { type_bits = 5, 58 register_bits = BitsPerShort - type_bits }; 59 60 enum { type_shift = 0, 61 register_shift = type_bits }; 62 63 enum { type_mask = right_n_bits(type_bits), 64 type_mask_in_place = type_mask << type_shift, 65 register_mask = right_n_bits(register_bits), 66 register_mask_in_place = register_mask << register_shift }; 67 68 enum oop_types { // must fit in type_bits 69 unused_value =0, // powers of 2, for masking OopMapStream 70 oop_value = 1, 71 value_value = 2, 72 narrowoop_value = 4, 73 callee_saved_value = 8, 74 derived_oop_value= 16 }; 75 76 // Constructors 77 OopMapValue () { set_value(0); set_content_reg(VMRegImpl::Bad()); } 78 OopMapValue (VMReg reg, oop_types t) { set_reg_type(reg,t); } 79 OopMapValue (VMReg reg, oop_types t, VMReg reg2) { set_reg_type(reg,t); set_content_reg(reg2); } 80 OopMapValue (CompressedReadStream* stream) { read_from(stream); } 81 82 // Archiving 83 void write_on(CompressedWriteStream* stream) { 84 stream->write_int(value()); 85 if(is_callee_saved() || is_derived_oop()) { 86 stream->write_int(content_reg()->value()); 87 } 88 } 89 90 void read_from(CompressedReadStream* stream) { 91 set_value(stream->read_int()); 92 if(is_callee_saved() || is_derived_oop()) { 93 set_content_reg(VMRegImpl::as_VMReg(stream->read_int(), true)); 94 } 95 } 96 97 // Querying 98 bool is_oop() { return mask_bits(value(), type_mask_in_place) == oop_value; } 99 bool is_value() { return mask_bits(value(), type_mask_in_place) == value_value; } 100 bool is_narrowoop() { return mask_bits(value(), type_mask_in_place) == narrowoop_value; } 101 bool is_callee_saved() { return mask_bits(value(), type_mask_in_place) == callee_saved_value; } 102 bool is_derived_oop() { return mask_bits(value(), type_mask_in_place) == derived_oop_value; } 103 104 void set_oop() { set_value((value() & register_mask_in_place) | oop_value); } 105 void set_value() { set_value((value() & register_mask_in_place) | value_value); } 106 void set_narrowoop() { set_value((value() & register_mask_in_place) | narrowoop_value); } 107 void set_callee_saved() { set_value((value() & register_mask_in_place) | callee_saved_value); } 108 void set_derived_oop() { set_value((value() & register_mask_in_place) | derived_oop_value); } 109 110 VMReg reg() const { return VMRegImpl::as_VMReg(mask_bits(value(), register_mask_in_place) >> register_shift); } 111 oop_types type() const { return (oop_types)mask_bits(value(), type_mask_in_place); } 112 113 static bool legal_vm_reg_name(VMReg p) { 114 return (p->value() == (p->value() & register_mask)); 115 } 116 117 void set_reg_type(VMReg p, oop_types t) { 118 set_value((p->value() << register_shift) | t); 119 assert(reg() == p, "sanity check" ); 120 assert(type() == t, "sanity check" ); 121 } 122 123 124 VMReg content_reg() const { return VMRegImpl::as_VMReg(_content_reg, true); } 125 void set_content_reg(VMReg r) { _content_reg = r->value(); } | 37 // Dead - Dead; can be Zapped for debugging 38 // CalleeXX - Callee saved; also describes which caller register is saved 39 // DerivedXX - A derived oop; original oop is described. 40 // 41 // OopMapValue describes a single OopMap entry 42 43 class frame; 44 class RegisterMap; 45 class DerivedPointerEntry; 46 47 class OopMapValue: public StackObj { 48 friend class VMStructs; 49 private: 50 short _value; 51 int value() const { return _value; } 52 void set_value(int value) { _value = value; } 53 short _content_reg; 54 55 public: 56 // Constants 57 enum { type_bits = 4, 58 register_bits = BitsPerShort - type_bits }; 59 60 enum { type_shift = 0, 61 register_shift = type_bits }; 62 63 enum { type_mask = right_n_bits(type_bits), 64 type_mask_in_place = type_mask << type_shift, 65 register_mask = right_n_bits(register_bits), 66 register_mask_in_place = register_mask << register_shift }; 67 68 enum oop_types { // must fit in type_bits 69 unused_value =0, // powers of 2, for masking OopMapStream 70 oop_value = 1, 71 narrowoop_value = 2, 72 callee_saved_value = 4, 73 derived_oop_value= 8 }; 74 75 // Constructors 76 OopMapValue () { set_value(0); set_content_reg(VMRegImpl::Bad()); } 77 OopMapValue (VMReg reg, oop_types t) { set_reg_type(reg,t); } 78 OopMapValue (VMReg reg, oop_types t, VMReg reg2) { set_reg_type(reg,t); set_content_reg(reg2); } 79 OopMapValue (CompressedReadStream* stream) { read_from(stream); } 80 81 // Archiving 82 void write_on(CompressedWriteStream* stream) { 83 stream->write_int(value()); 84 if(is_callee_saved() || is_derived_oop()) { 85 stream->write_int(content_reg()->value()); 86 } 87 } 88 89 void read_from(CompressedReadStream* stream) { 90 set_value(stream->read_int()); 91 if(is_callee_saved() || is_derived_oop()) { 92 set_content_reg(VMRegImpl::as_VMReg(stream->read_int(), true)); 93 } 94 } 95 96 // Querying 97 bool is_oop() { return mask_bits(value(), type_mask_in_place) == oop_value; } 98 bool is_narrowoop() { return mask_bits(value(), type_mask_in_place) == narrowoop_value; } 99 bool is_callee_saved() { return mask_bits(value(), type_mask_in_place) == callee_saved_value; } 100 bool is_derived_oop() { return mask_bits(value(), type_mask_in_place) == derived_oop_value; } 101 102 void set_oop() { set_value((value() & register_mask_in_place) | oop_value); } 103 void set_narrowoop() { set_value((value() & register_mask_in_place) | narrowoop_value); } 104 void set_callee_saved() { set_value((value() & register_mask_in_place) | callee_saved_value); } 105 void set_derived_oop() { set_value((value() & register_mask_in_place) | derived_oop_value); } 106 107 VMReg reg() const { return VMRegImpl::as_VMReg(mask_bits(value(), register_mask_in_place) >> register_shift); } 108 oop_types type() const { return (oop_types)mask_bits(value(), type_mask_in_place); } 109 110 static bool legal_vm_reg_name(VMReg p) { 111 return (p->value() == (p->value() & register_mask)); 112 } 113 114 void set_reg_type(VMReg p, oop_types t) { 115 set_value((p->value() << register_shift) | t); 116 assert(reg() == p, "sanity check" ); 117 assert(type() == t, "sanity check" ); 118 } 119 120 121 VMReg content_reg() const { return VMRegImpl::as_VMReg(_content_reg, true); } 122 void set_content_reg(VMReg r) { _content_reg = r->value(); } |