Spaces:
Running
Running
scratch0-5
/
utils
/VMMakerJS.package
/JSCodeGenerator.class
/instance
/emitDefineBytesPerWordOn..st
JS code generator | |
emitDefineBytesPerWordOn: aStream | |
"Define word size dependent constants. These are mirrored by class | |
variables in ObjectMemory. The macro definitions here are used at compile | |
time to permit building a VM for either 32-bit or 64-bit object memory from | |
a single generated code base. | |
If SQ_VI_BYTES_PER_WORD is defined as 8 (e.g. in config.h), then a VM for | |
64-bit image will be built. Otherwise, a VM for 32-bit image is built." | |
aStream cr; | |
nextPutAll: '/*'; cr; | |
nextPutAll: ' * define SQ_VI_BYTES_PER_WORD 8 for a 64-bit word size VM'; cr; | |
nextPutAll: ' * and default to SQ_VI_BYTES_PER_WORD 4 for a 32-bit word size VM'; cr; | |
nextPutAll: ' */'; cr; | |
nextPutAll: '#ifndef SQ_VI_BYTES_PER_WORD'; cr; | |
nextPutAll: '# define SQ_VI_BYTES_PER_WORD '; | |
print: 4; cr; "default to word size 4" | |
nextPutAll: '#endif'; cr; cr; | |
nextPutAll: '#define BYTES_PER_WORD SQ_VI_BYTES_PER_WORD'; cr; | |
nextPutAll: '#define BASE_HEADER_SIZE SQ_VI_BYTES_PER_WORD'; cr; | |
"Define various constants that depend on BytesPerWord" | |
nextPutAll: '#if (BYTES_PER_WORD == 4) // 32-bit object memory'; cr; | |
nextPutAll: '# define WORD_MASK 0xffffffff'; cr; "(1 bitShift: BytesPerWord*8) - 1" | |
nextPutAll: '# define SHIFT_FOR_WORD 2'; cr; "(BytesPerWord log: 2) rounded" | |
nextPutAll: '# define SMALL_CONTEXT_SIZE 92'; cr; "ContextFixedSizePlusHeader + 16 * BytesPerWord" | |
"Large contexts have 56 indexable fileds. Max with single header word." | |
"However note that in 64 bits, for now, large contexts have 3-word headers" | |
nextPutAll: '# define LARGE_CONTEXT_SIZE 252'; cr; "ContextFixedSizePlusHeader + 56 * BytesPerWord." | |
nextPutAll: '# define SIZE_MASK 0xfc'; cr; "Base header word bit field" | |
nextPutAll: '# define LONG_SIZE_MASK 0xfffffffc'; cr; "Base header word bit field" | |
nextPutAll: '# define SIZE_4_BIT 0'; cr; | |
nextPutAll: '# define MARK_BIT 0x80000000'; cr; "Top bit, 1 bitShift: BytesPerWord*8 - 1" | |
nextPutAll: '# define ROOT_BIT 0x40000000'; cr; "Next-to-top bit, 1 bitShift: BytesPerWord*8 - 2" | |
nextPutAll: '# define ALL_BUT_MARK_BIT 0x7fffffff'; cr; "WordMask - MarkBit." | |
nextPutAll: '# define ALL_BUT_ROOT_BIT 0xbfffffff'; cr; "WordMask - RootBit" | |
nextPutAll: '# define ALL_BUT_TYPE_MASK 0xfffffffc'; cr; "WordMask - TypeMask" | |
nextPutAll: '# define ALL_BUT_MARK_BIT_AND_TYPE_MASK 0x7ffffffc'; cr; "AllButTypeMask - MarkBit" | |
nextPutAll: '# define ALL_BUT_HASH_BITS 0xe001ffff'; cr; | |
nextPutAll: '# define SMALL_CONTEXT_SIZE 92'; cr; "16 indexable fields" | |
nextPutAll: '# define LARGE_CONTEXT_SIZE 252'; cr; "56 indexable fields" | |
nextPutAll: '#else // 64-bit object memory'; cr; | |
nextPutAll: '# define WORD_MASK 0xffffffffffffffff'; cr; | |
nextPutAll: '# define SHIFT_FOR_WORD 3'; cr; | |
nextPutAll: '# define SMALL_CONTEXT_SIZE 184'; cr; | |
nextPutAll: '# define LARGE_CONTEXT_SIZE 504'; cr; | |
nextPutAll: '# define SIZE_MASK 0xf8'; cr; "Lose the 4 bit in temp 64-bit chunk format" | |
nextPutAll: '# define LONG_SIZE_MASK 0xfffffffffffffff8'; cr; | |
"The 4 bit is excluded from SIZE_MASK for 64-bit object memory, but need it" | |
"for ST size, so define SIZE_4_BIT." | |
nextPutAll: '# define SIZE_4_BIT 4'; cr; | |
nextPutAll: '# define MARK_BIT 0x8000000000000000'; cr; | |
nextPutAll: '# define ROOT_BIT 0x4000000000000000'; cr; | |
nextPutAll: '# define ALL_BUT_MARK_BIT 0x7fffffffffffffff'; cr; | |
nextPutAll: '# define ALL_BUT_ROOT_BIT 0xbfffffffffffffff'; cr; | |
nextPutAll: '# define ALL_BUT_TYPE_MASK 0xfffffffffffffffc'; cr; | |
nextPutAll: '# define ALL_BUT_MARK_BIT_AND_TYPE_MASK 0x7ffffffffffffffc'; cr; | |
nextPutAll: '# define ALL_BUT_HASH_BITS 0xffffffffe001ffff'; cr; | |
nextPutAll: '# define SMALL_CONTEXT_SIZE 184'; cr; | |
nextPutAll: '# define LARGE_CONTEXT_SIZE 504'; cr; | |
nextPutAll: '#endif // (BYTES_PER_WORD == 4)'; cr | |