Skip to content

Commit 29313c0

Browse files
committedAug 15, 2016
Added reference count bits to new memory header.
1 parent d403e49 commit 29313c0

File tree

2 files changed

+60
-26
lines changed

2 files changed

+60
-26
lines changed
 

Diff for: ‎machine/memory/header.hpp

+40-16
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ Object* const cUndef = reinterpret_cast<Object*>(0x22L);
218218
* // Garbage collector flags
219219
* unsigned int marked : 2;
220220
* unsigned int scanned : 1;
221+
* unsigned int referenced : 4;
221222
*
222223
* // Data type flags
223224
* object_type type_id : 15;
@@ -229,7 +230,7 @@ Object* const cUndef = reinterpret_cast<Object*>(0x22L);
229230
* unsigned int bias_locked : 1;
230231
* unsigned int locked_count : 4;
231232
* unsigned int lock_inflated : 1;
232-
* unsigned int object_id : 16;
233+
* unsigned int object_id : 12;
233234
* unsigned int reserved : 3;
234235
*
235236
* // Graph flags
@@ -294,58 +295,65 @@ Object* const cUndef = reinterpret_cast<Object*>(0x22L);
294295
#define RBX_MEMORY_SET_SCANNED(f) RBX_MEMORY_SET_BIT(SCANNED,f)
295296
#define RBX_MEMORY_UNSET_SCANNED(f) RBX_MEMORY_UNSET_BIT(SCANNED,f)
296297

297-
#define RBX_MEMORY_TYPE_ID_SHIFT 19
298+
#define RBX_MEMORY_REFERENCED_SHIFT 19
299+
#define RBX_MEMORY_REFERENCED_VALUE_MASK 0xfL
300+
#define RBX_MEMORY_REFERENCED_BIT_MASK (((1L << 4) - 1) << RBX_MEMORY_REFERENCED_SHIFT)
301+
302+
#define RBX_MEMORY_SET_REFERENCED(f,v) RBX_MEMORY_SET_FIELD(REFERENCED,f,v)
303+
#define RBX_MEMORY_GET_REFERENCED(f) RBX_MEMORY_GET_FIELD(REFERENCED,f)
304+
305+
#define RBX_MEMORY_TYPE_ID_SHIFT 23
298306
#define RBX_MEMORY_TYPE_ID_VALUE_MASK 0x7fffL
299307
#define RBX_MEMORY_TYPE_ID_BIT_MASK (((1L << 15) - 1) << RBX_MEMORY_TYPE_ID_SHIFT)
300308

301309
#define RBX_MEMORY_SET_TYPE_ID(f,v) RBX_MEMORY_SET_FIELD(TYPE_ID,f,v)
302310
#define RBX_MEMORY_GET_TYPE_ID(f) RBX_MEMORY_GET_FIELD(TYPE_ID,f)
303311

304-
#define RBX_MEMORY_DATA_BIT (1L << 34)
305-
#define RBX_MEMORY_DATA_MASK (1L << 34)
312+
#define RBX_MEMORY_DATA_BIT (1L << 38)
313+
#define RBX_MEMORY_DATA_MASK (1L << 38)
306314

307315
#define RBX_MEMORY_DATA_P(f) RBX_MEMORY_GET_BIT(DATA,f)
308316
#define RBX_MEMORY_SET_DATA(f) RBX_MEMORY_SET_BIT(DATA,f)
309317
#define RBX_MEMORY_UNSET_DATA(f) RBX_MEMORY_UNSET_BIT(DATA,f)
310318

311-
#define RBX_MEMORY_FROZEN_BIT (1L << 35)
312-
#define RBX_MEMORY_FROZEN_MASK (1L << 35)
319+
#define RBX_MEMORY_FROZEN_BIT (1L << 39)
320+
#define RBX_MEMORY_FROZEN_MASK (1L << 39)
313321

314322
#define RBX_MEMORY_FROZEN_P(f) RBX_MEMORY_GET_BIT(FROZEN,f)
315323
#define RBX_MEMORY_SET_FROZEN(f) RBX_MEMORY_SET_BIT(FROZEN,f)
316324
#define RBX_MEMORY_UNSET_FROZEN(f) RBX_MEMORY_UNSET_BIT(FROZEN,f)
317325

318-
#define RBX_MEMORY_TAINTED_BIT (1L << 36)
319-
#define RBX_MEMORY_TAINTED_MASK (1L << 36)
326+
#define RBX_MEMORY_TAINTED_BIT (1L << 40)
327+
#define RBX_MEMORY_TAINTED_MASK (1L << 40)
320328

321329
#define RBX_MEMORY_TAINTED_P(f) RBX_MEMORY_GET_BIT(TAINTED,f)
322330
#define RBX_MEMORY_SET_TAINTED(f) RBX_MEMORY_SET_BIT(TAINTED,f)
323331
#define RBX_MEMORY_UNSET_TAINTED(f) RBX_MEMORY_UNSET_BIT(TAINTED,f)
324332

325-
#define RBX_MEMORY_BIAS_LOCKED_BIT (1L << 37)
326-
#define RBX_MEMORY_BIAS_LOCKED_MASK (1L << 37)
333+
#define RBX_MEMORY_BIAS_LOCKED_BIT (1L << 41)
334+
#define RBX_MEMORY_BIAS_LOCKED_MASK (1L << 41)
327335

328336
#define RBX_MEMORY_BIAS_LOCKED_P(f) RBX_MEMORY_GET_BIT(BIAS_LOCKED,f)
329337
#define RBX_MEMORY_SET_BIAS_LOCKED(f) RBX_MEMORY_SET_BIT(BIAS_LOCKED,f)
330338
#define RBX_MEMORY_UNSET_BIAS_LOCKED(f) RBX_MEMORY_UNSET_BIT(BIAS_LOCKED,f)
331339

332-
#define RBX_MEMORY_LOCKED_COUNT_SHIFT 38
340+
#define RBX_MEMORY_LOCKED_COUNT_SHIFT 42
333341
#define RBX_MEMORY_LOCKED_COUNT_VALUE_MASK 0xfL
334342
#define RBX_MEMORY_LOCKED_COUNT_BIT_MASK (((1L << 4) - 1) << RBX_MEMORY_LOCKED_COUNT_SHIFT)
335343

336344
#define RBX_MEMORY_SET_LOCKED_COUNT(f,v) RBX_MEMORY_SET_FIELD(LOCKED_COUNT,f,v)
337345
#define RBX_MEMORY_GET_LOCKED_COUNT(f) RBX_MEMORY_GET_FIELD(LOCKED_COUNT,f)
338346

339-
#define RBX_MEMORY_LOCK_INFLATED_BIT (1L << 42)
340-
#define RBX_MEMORY_LOCK_INFLATED_MASK (1L << 42)
347+
#define RBX_MEMORY_LOCK_INFLATED_BIT (1L << 46)
348+
#define RBX_MEMORY_LOCK_INFLATED_MASK (1L << 46)
341349

342350
#define RBX_MEMORY_LOCK_INFLATED_P(f) RBX_MEMORY_GET_BIT(LOCK_INFLATED,f)
343351
#define RBX_MEMORY_SET_LOCK_INFLATED(f) RBX_MEMORY_SET_BIT(LOCK_INFLATED,f)
344352
#define RBX_MEMORY_UNSET_LOCK_INFLATED(f) RBX_MEMORY_UNSET_BIT(LOCK_INFLATED,f)
345353

346-
#define RBX_MEMORY_OBJECT_ID_SHIFT 43
347-
#define RBX_MEMORY_OBJECT_ID_VALUE_MASK 0xffffL
348-
#define RBX_MEMORY_OBJECT_ID_BIT_MASK (((1L << 16) - 1) << RBX_MEMORY_OBJECT_ID_SHIFT)
354+
#define RBX_MEMORY_OBJECT_ID_SHIFT 47
355+
#define RBX_MEMORY_OBJECT_ID_VALUE_MASK 0xfffL
356+
#define RBX_MEMORY_OBJECT_ID_BIT_MASK (((1L << 12) - 1) << RBX_MEMORY_OBJECT_ID_SHIFT)
349357

350358
#define RBX_MEMORY_SET_OBJECT_ID(f,v) RBX_MEMORY_SET_FIELD(OBJECT_ID,f,v)
351359
#define RBX_MEMORY_GET_OBJECT_ID(f) RBX_MEMORY_GET_FIELD(OBJECT_ID,f)
@@ -481,6 +489,22 @@ Object* const cUndef = reinterpret_cast<Object*>(0x22L);
481489
return RBX_MEMORY_SCANNED_P(header.load());
482490
}
483491

492+
unsigned int referenced() const {
493+
if(inflated_p()) {
494+
return RBX_MEMORY_GET_REFERENCED(inflated_header()->flags);
495+
}
496+
497+
return RBX_MEMORY_GET_REFERENCED(header.load());
498+
}
499+
500+
void referenced(unsigned int count) {
501+
if(inflated_p()) {
502+
RBX_MEMORY_SET_REFERENCED(inflated_header()->flags, count);
503+
} else {
504+
header.store(RBX_MEMORY_SET_REFERENCED(header.load(), count));
505+
}
506+
}
507+
484508
object_type type_id() const {
485509
if(inflated_p()) {
486510
return static_cast<object_type>(

Diff for: ‎machine/test/test_memory_header.hpp

+20-10
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,22 @@ class TestMemoryHeader : public CxxTest::TestSuite, public VMTest {
8888
TS_ASSERT_EQUALS(h.header.load(), 0x40000L);
8989
}
9090

91+
void test_memory_flag_referenced() {
92+
TS_ASSERT_EQUALS(RBX_MEMORY_GET_REFERENCED(h.header.load()), 0);
93+
94+
h.referenced(static_cast<object_type>((1L << 4) - 1));
95+
96+
TS_ASSERT_EQUALS(h.header.load(), 0x780000L);
97+
TS_ASSERT_EQUALS(h.referenced(), 0xf);
98+
TS_ASSERT_EQUALS(RBX_MEMORY_GET_REFERENCED(h.header.load()), 0xf);
99+
}
100+
91101
void test_memory_flag_type_id() {
92102
TS_ASSERT_EQUALS(RBX_MEMORY_GET_TYPE_ID(h.header.load()), 0);
93103

94104
h.type_id(static_cast<object_type>((1L << 16) - 1));
95105

96-
TS_ASSERT_EQUALS(h.header.load(), 0x3fff80000L);
106+
TS_ASSERT_EQUALS(h.header.load(), 0x3fff800000L);
97107
TS_ASSERT_EQUALS(h.type_id(), 0x7fff);
98108
TS_ASSERT_EQUALS(RBX_MEMORY_GET_TYPE_ID(h.header.load()), 0x7fff);
99109
}
@@ -105,7 +115,7 @@ class TestMemoryHeader : public CxxTest::TestSuite, public VMTest {
105115
h.header.store(RBX_MEMORY_SET_DATA(h.header.load()));
106116
TS_ASSERT_EQUALS(RBX_MEMORY_DATA_P(h.header.load()), true);
107117
TS_ASSERT_EQUALS(h.data_p(), true);
108-
TS_ASSERT_EQUALS(h.header.load(), 0x400000000L);
118+
TS_ASSERT_EQUALS(h.header.load(), 0x4000000000L);
109119

110120
h.header.store(RBX_MEMORY_UNSET_DATA(h.header.load()));
111121
TS_ASSERT_EQUALS(h.header.load(), 0);
@@ -119,7 +129,7 @@ class TestMemoryHeader : public CxxTest::TestSuite, public VMTest {
119129
h.header.store(RBX_MEMORY_SET_FROZEN(h.header.load()));
120130
TS_ASSERT_EQUALS(RBX_MEMORY_FROZEN_P(h.header.load()), true);
121131
TS_ASSERT_EQUALS(h.frozen_p(), true);
122-
TS_ASSERT_EQUALS(h.header.load(), 0x800000000L);
132+
TS_ASSERT_EQUALS(h.header.load(), 0x8000000000L);
123133

124134
h.header.store(RBX_MEMORY_UNSET_FROZEN(h.header.load()));
125135
TS_ASSERT_EQUALS(h.header.load(), 0);
@@ -132,7 +142,7 @@ class TestMemoryHeader : public CxxTest::TestSuite, public VMTest {
132142

133143
h.header.store(RBX_MEMORY_SET_TAINTED(h.header.load()));
134144
TS_ASSERT_EQUALS(h.tainted_p(), true);
135-
TS_ASSERT_EQUALS(h.header.load(), 0x1000000000L);
145+
TS_ASSERT_EQUALS(h.header.load(), 0x10000000000L);
136146

137147
h.header.store(RBX_MEMORY_UNSET_TAINTED(h.header.load()));
138148
TS_ASSERT_EQUALS(h.header.load(), 0);
@@ -144,32 +154,32 @@ class TestMemoryHeader : public CxxTest::TestSuite, public VMTest {
144154

145155
h.header.store(RBX_MEMORY_SET_BIAS_LOCKED(h.header.load()));
146156

147-
TS_ASSERT_EQUALS(h.header.load(), 0x2000000000L);
157+
TS_ASSERT_EQUALS(h.header.load(), 0x20000000000L);
148158
}
149159

150160
void test_memory_flag_locked_count() {
151161
TS_ASSERT_EQUALS(RBX_MEMORY_GET_LOCKED_COUNT(h.header.load()), 0);
152162

153163
h.header.store(RBX_MEMORY_SET_LOCKED_COUNT(h.header.load(), 0xffff));
154164

155-
TS_ASSERT_EQUALS(h.header.load(), 0x3c000000000L);
165+
TS_ASSERT_EQUALS(h.header.load(), 0x3c0000000000L);
156166
}
157167

158168
void test_memory_flag_lock_inflated() {
159169
TS_ASSERT_EQUALS(h.lock_inflated_p(), false);
160170

161171
h.header.store(RBX_MEMORY_SET_LOCK_INFLATED(h.header.load()));
162172

163-
TS_ASSERT_EQUALS(h.header.load(), 0x40000000000L);
173+
TS_ASSERT_EQUALS(h.header.load(), 0x400000000000L);
164174
}
165175

166176
void test_memory_flag_object_id() {
167177
TS_ASSERT_EQUALS(h.object_id(), 0);
168178

169-
h.header.store(RBX_MEMORY_SET_OBJECT_ID(h.header.load(), 0xfffff));
170-
TS_ASSERT_EQUALS(h.object_id(), 0xffff);
179+
h.header.store(RBX_MEMORY_SET_OBJECT_ID(h.header.load(), 0xffff));
180+
TS_ASSERT_EQUALS(h.object_id(), 0xfff);
171181

172-
TS_ASSERT_EQUALS(h.header.load(), 0x7fff80000000000L);
182+
TS_ASSERT_EQUALS(h.header.load(), 0x7ff800000000000L);
173183
}
174184

175185
void test_memory_flag_reserved() {

0 commit comments

Comments
 (0)
Please sign in to comment.