/** * memory.h * * Grendel: a compiling Beowulf reimplementation. * * The memory management subsystem. * * (c) 2026 Simon Brooke * Licensed under GPL version 2.0, or, at your option, any later version. */ #ifndef __grendel_memory_h #define __grendel_memory_h #include /* Tags for 32 bit objects, with 3 bits of tag an one mark bit */ /** * This pointer object is an actual pointer -- an offset into consspace. */ #define OFFSETTV 0 /** * This pointer object is actually a 28 bit integer value. */ #define INTEGERTV 1 /* * Values 2..6 inclusive reserved further data types, including maybe * implementing reals later. */ /** * This is not actually a pointer at all but the first word of a cell. */ #define CELLTV 7 /** * Half of a cons cell. The mark bit is first, so that the ptag can be * considered as part of the CTAG. */ struct pointer { /* mark bit for mark and sweep garbage collector. Yes, this is normally * thought of as part of the cell, but bear with me. */ unsigned int mark : 1; /* pointer tag, interpretations as above */ unsigned int ptag : 3; /* the actual payload of the pointer object */ union { unsigned int offset : 28; int value : 28; } payload; }; struct cons_payload { struct pointer pointers[2]; }; struct symbol_payload { /* this is the same mark bit as the one in the `address` pointer of the * cons_payload. */ unsigned int mark : 1; unsigned int tag : 7; char symbol[7]; }; /* Tags for 64 bit objects. Note that, as the 64 bit object may be made up * of two 32 bit objects (pointers*, the 64 bit tag is stored in bits 4..7 * inclusive. The first three bits are the first three bits of a 32 bit object, * and thus for 64bit objects will always b 111.*/ /* this 64 bit object is a cons cell */ #define CONSTV 7 /* this 64 bit object is a seven character atom */ #define ATOMTV 8 /* There are potentially another 119 types of object we could store in a 64 * bit object, but I can't think of any we need just now. */ struct cell { union { struct cons_payload cons; struct symbol_payload symbol; } payload; }; #define CONSSPACESIZE 65536 /** * The entire array of cells available to the system. */ struct cell consspace[CONSSPACESIZE]; #endif