56 enum { type_bits = 4,
57 register_bits = BitsPerShort - type_bits };
58
59 enum { type_shift = 0,
60 register_shift = type_bits };
61
62 enum { type_mask = right_n_bits(type_bits),
63 type_mask_in_place = type_mask << type_shift,
64 register_mask = right_n_bits(register_bits),
65 register_mask_in_place = register_mask << register_shift };
66
67 enum oop_types { // must fit in type_bits
68 unused_value =0, // powers of 2, for masking OopMapStream
69 oop_value = 1,
70 narrowoop_value = 2,
71 callee_saved_value = 4,
72 derived_oop_value= 8 };
73
74 // Constructors
75 OopMapValue () { set_value(0); set_content_reg(VMRegImpl::Bad()); }
76 OopMapValue (VMReg reg, oop_types t) { set_reg_type(reg,t); }
77 OopMapValue (VMReg reg, oop_types t, VMReg reg2) { set_reg_type(reg,t); set_content_reg(reg2); }
78 OopMapValue (CompressedReadStream* stream) { read_from(stream); }
79
80 // Archiving
81 void write_on(CompressedWriteStream* stream) {
82 stream->write_int(value());
83 if(is_callee_saved() || is_derived_oop()) {
84 stream->write_int(content_reg()->value());
85 }
86 }
87
88 void read_from(CompressedReadStream* stream) {
89 set_value(stream->read_int());
90 if(is_callee_saved() || is_derived_oop()) {
91 set_content_reg(VMRegImpl::as_VMReg(stream->read_int(), true));
92 }
93 }
94
95 // Querying
96 bool is_oop() { return mask_bits(value(), type_mask_in_place) == oop_value; }
97 bool is_narrowoop() { return mask_bits(value(), type_mask_in_place) == narrowoop_value; }
98 bool is_callee_saved() { return mask_bits(value(), type_mask_in_place) == callee_saved_value; }
99 bool is_derived_oop() { return mask_bits(value(), type_mask_in_place) == derived_oop_value; }
100
101 void set_oop() { set_value((value() & register_mask_in_place) | oop_value); }
102 void set_narrowoop() { set_value((value() & register_mask_in_place) | narrowoop_value); }
103 void set_callee_saved() { set_value((value() & register_mask_in_place) | callee_saved_value); }
104 void set_derived_oop() { set_value((value() & register_mask_in_place) | derived_oop_value); }
105
106 VMReg reg() const { return VMRegImpl::as_VMReg(mask_bits(value(), register_mask_in_place) >> register_shift); }
107 oop_types type() const { return (oop_types)mask_bits(value(), type_mask_in_place); }
108
109 static bool legal_vm_reg_name(VMReg p) {
110 return (p->value() == (p->value() & register_mask));
|
56 enum { type_bits = 4,
57 register_bits = BitsPerShort - type_bits };
58
59 enum { type_shift = 0,
60 register_shift = type_bits };
61
62 enum { type_mask = right_n_bits(type_bits),
63 type_mask_in_place = type_mask << type_shift,
64 register_mask = right_n_bits(register_bits),
65 register_mask_in_place = register_mask << register_shift };
66
67 enum oop_types { // must fit in type_bits
68 unused_value =0, // powers of 2, for masking OopMapStream
69 oop_value = 1,
70 narrowoop_value = 2,
71 callee_saved_value = 4,
72 derived_oop_value= 8 };
73
74 // Constructors
75 OopMapValue () { set_value(0); set_content_reg(VMRegImpl::Bad()); }
76 OopMapValue (VMReg reg, oop_types t) { set_reg_type(reg, t); set_content_reg(VMRegImpl::Bad()); }
77 OopMapValue (VMReg reg, oop_types t, VMReg reg2) { set_reg_type(reg, t); set_content_reg(reg2); }
78 OopMapValue (CompressedReadStream* stream) { read_from(stream); }
79
80 // Archiving
81 void write_on(CompressedWriteStream* stream) {
82 stream->write_int(value());
83 if(is_callee_saved() || is_derived_oop()) {
84 stream->write_int(content_reg()->value());
85 }
86 }
87
88 void read_from(CompressedReadStream* stream) {
89 set_value(stream->read_int());
90 if (is_callee_saved() || is_derived_oop()) {
91 set_content_reg(VMRegImpl::as_VMReg(stream->read_int(), true));
92 }
93 }
94
95 // Querying
96 bool is_oop() { return mask_bits(value(), type_mask_in_place) == oop_value; }
97 bool is_narrowoop() { return mask_bits(value(), type_mask_in_place) == narrowoop_value; }
98 bool is_callee_saved() { return mask_bits(value(), type_mask_in_place) == callee_saved_value; }
99 bool is_derived_oop() { return mask_bits(value(), type_mask_in_place) == derived_oop_value; }
100
101 void set_oop() { set_value((value() & register_mask_in_place) | oop_value); }
102 void set_narrowoop() { set_value((value() & register_mask_in_place) | narrowoop_value); }
103 void set_callee_saved() { set_value((value() & register_mask_in_place) | callee_saved_value); }
104 void set_derived_oop() { set_value((value() & register_mask_in_place) | derived_oop_value); }
105
106 VMReg reg() const { return VMRegImpl::as_VMReg(mask_bits(value(), register_mask_in_place) >> register_shift); }
107 oop_types type() const { return (oop_types)mask_bits(value(), type_mask_in_place); }
108
109 static bool legal_vm_reg_name(VMReg p) {
110 return (p->value() == (p->value() & register_mask));
|