[Vm-dev] VM Maker: VMMaker.oscog-eem.1492.mcz

Esteban Lorenzano estebanlm at gmail.com
Mon Oct 19 13:55:42 UTC 2015


Hi,

> On 19 Oct 2015, at 14:51, Eliot Miranda <eliot.miranda at gmail.com> wrote:
> 
> 
> Hi Rob,
> 
>> On Oct 17, 2015, at 9:29 PM, Robert Withers <robert.w.withers at gmail.com> wrote:
>> 
>> I think I have a 32-bit ubuntu install so these changes may not make a difference. Although, would I be able to run 64-bit images in the simulator on a 32-bit machine? That would be very cool.
> 
> Of course you can.  That's how the 64-bit Spur VM is being developed.  If you build the BochsX64Plugin you can also start to run the x64 JIT, but only start because it's not finished yet :-)
> 
>> 
>> I would still be interested in building the latest VMMaker generated code in Pharo. In search of training and guidance, is there a write up on which packages to load (Cog, Cog.pharo, CogVMMakerPharoCompatibility, VMMaker.oscog, ...)?
> 
> Ask Esteban.  But I don't understand what you mean by "building the latest VMMaker generated code in Pharo". Do you mean loading VMMaker or VMMaker.oscog into Pharo and running the simulator?

I suppose he means the latest code… trunk in pharo is old, because I’m developing spur in a branch (it will be joined with trunk when we finished, but we needed to keep both versions working in case we need some hot fixes, etc.)
latest “pharo version” of spur sources can be found here:

https://github.com/estebanlm/pharo-vm/tree/spur64

instructions are as always: 

git clone  git at github.com:estebanlm/pharo-vm.git
cd image
sh newImage.sh

etc..

cheers,
Esteban

> 
>> 
>> thank you,
>> Robert
>> 
>>> On 10/18/2015 12:33 AM, commits at source.squeak.org wrote:
>>> 
>>> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
>>> http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1492.mcz
>>> 
>>> ==================== Summary ====================
>>> 
>>> Name: VMMaker.oscog-eem.1492
>>> Author: eem
>>> Time: 17 October 2015, 5:32:12.348 pm
>>> UUID: a0778a36-b0e9-4e06-af1a-0e50572c9db1
>>> Ancestors: VMMaker.oscog-eem.1491
>>> 
>>> x64 Cogit:
>>> Get the Cogit to a state where the 64-bit Spur image starts simulating.  It's a new world ;-)
>>> 
>>> Reimplement CMethodCacheAccessor, introducing CArrayOfLongsAccessor for the primitive trace log.
>>> 
>>> Alter CogStackPage and surrogates so that CogStackPageSurrogate64 is properly laid out.
>>> 
>>> Revise the signedIntToFrom/Foo methods, and add some tests to check their behaviour.
>>> 
>>> Provide two move multi-tab browser opening conveniences.
>>> 
>>> =============== Diff against VMMaker.oscog-eem.1491 ===============
>>> 
>>> Item was added:
>>> + CObjectAccessor subclass: #CArrayOfLongsAccessor
>>> +    instanceVariableNames: 'objectMemory address elementByteSize'
>>> +    classVariableNames: ''
>>> +    poolDictionaries: ''
>>> +    category: 'VMMaker-JITSimulation'!
>>> +
>>> + !CArrayOfLongsAccessor commentStamp: 'eem 10/8/2015 12:49' prior: 0!
>>> + A CArrayOfLongsAccessor is a class that wraps an Array stored in the heap.  It maps at:[put:] into a suitably aligned and offset longAt:[put:], for accessing Arrays stored in the heap, such as the primTraceLog.
>>> +
>>> + Instance Variables
>>> +    address:            <Integer>
>>> +    entryByteSize:        <Integer>
>>> +    objectMemory:        <NewCoObjectMemorySimulator|Spur64BitMMLECoSimulator|Spur64BitMMLECoSimulator|Spur64BitMMBECoSimulator|Spur64BitMMBECoSimulator>
>>> +
>>> + address
>>> +    - the base address in the heap of the start of the array
>>> +
>>> + entryByteSize
>>> +    - the size of an element, in bytes
>>> +
>>> + objectMemory
>>> +    - the memory manager whose heap is being accessed
>>> + !
>>> 
>>> Item was added:
>>> + ----- Method: CArrayOfLongsAccessor>>address (in category 'accessing') -----
>>> + address
>>> +    ^address!
>>> 
>>> Item was added:
>>> + ----- Method: CArrayOfLongsAccessor>>at: (in category 'accessing') -----
>>> + at: index
>>> +    "Map at: into a suitably aligned and offset longAt:, for accessing Arrays stored in the heap, such as the primTraceLog."
>>> +    ^objectMemory longAt: index * elementByteSize + address!
>>> 
>>> Item was added:
>>> + ----- Method: CArrayOfLongsAccessor>>at:put: (in category 'accessing') -----
>>> + at: index put: aValue
>>> +    "Map at:put: into a suitably aligned and offset longAt:put:, for accessing Arrays stored in the heap, such as the primTraceLog."
>>> +    ^objectMemory longAt: index * elementByteSize + address put: aValue!
>>> 
>>> Item was added:
>>> + ----- Method: CArrayOfLongsAccessor>>objectMemory:at: (in category 'initialize-release') -----
>>> + objectMemory: anObjectMemory at: anAddress
>>> +    objectMemory := anObjectMemory.
>>> +    object := anObjectMemory memory.
>>> +    offset := anAddress / anObjectMemory wordSize.
>>> +    elementByteSize := anObjectMemory wordSize.
>>> +    address := anAddress!
>>> 
>>> Item was changed:
>>> + CArrayOfLongsAccessor subclass: #CMethodCacheAccessor
>>> +    instanceVariableNames: 'methodCacheArray entrySize functionPointerIndex'
>>> - CObjectAccessor subclass: #CMethodCacheAccessor
>>> -    instanceVariableNames: 'methodCacheArray functionPointerIndex entrySize'
>>>      classVariableNames: ''
>>>      poolDictionaries: ''
>>>      category: 'VMMaker-JITSimulation'!
>>> 
>>>  !CMethodCacheAccessor commentStamp: '<historical>' prior: 0!
>>>  I am used to simulate accesses to the methodCache so it can live partly in memory, partly in a Smalltalk Array.  This is necessary because in simulation function pointers are Smalltalk symbols (under simulation primitive dispatch is done via perform:).
>>>  !
>>> 
>>> Item was changed:
>>>  ----- Method: CMethodCacheAccessor>>at: (in category 'accessing') -----
>>>  at: index
>>>      "The special handling of functionPointerIndex is necessary because in simulation function
>>>       pointers are Smalltalk symbols (under simulation primitive dispatch is done via perform:)."
>>>      index - 1 \\ entrySize = functionPointerIndex ifTrue:
>>>          [^methodCacheArray at: index].
>>> +    ^objectMemory longAt: index * elementByteSize + address!
>>> -    ^object at: index + offset!
>>> 
>>> Item was changed:
>>>  ----- Method: CMethodCacheAccessor>>at:put: (in category 'accessing') -----
>>>  at: index put: value
>>>      "The special handling of functionPointerIndex is necessary because in simulation function
>>>       pointers are Smalltalk symbols (under simulation primitive dispatch is done via perform:)."
>>> +    (index = 16r44F and: [value = 16r1D]) ifTrue:
>>> +        [self halt].
>>>      index - 1 \\ entrySize = functionPointerIndex ifTrue:
>>> +        [objectMemory longAt: index * elementByteSize + address put: (0 = value ifTrue: [value] ifFalse: [value identityHash]).
>>> +         ^methodCacheArray at: index put: value].
>>> +    ^objectMemory longAt: index * elementByteSize + address put: value!
>>> -        [^methodCacheArray at: index put: value].
>>> -    ^object at: index + offset put: value!
>>> 
>>> Item was removed:
>>> - ----- Method: CMethodCacheAccessor>>memory:offset:array:functionPointerIndex:entrySize: (in category 'initialize-release') -----
>>> - memory: anObject offset: baseIndex array: cacheArray functionPointerIndex: fpIndex entrySize: esz
>>> -    object := anObject.
>>> -    offset := baseIndex.
>>> -    methodCacheArray := cacheArray.
>>> -    functionPointerIndex := fpIndex - 1.
>>> -    entrySize := esz!
>>> 
>>> Item was added:
>>> + ----- Method: CMethodCacheAccessor>>objectMemory:at:array:functionPointerIndex:entrySize: (in category 'initialize-release') -----
>>> + objectMemory: anObjectMemory at: anAddress array: cacheArray functionPointerIndex: fpIndex entrySize: wordsPerCacheEntry
>>> +    self objectMemory: anObjectMemory
>>> +        at: anAddress - anObjectMemory wordSize. "implicit -1 for indices in at:[put:]; the MethodCache is one-relative"
>>> +    methodCacheArray := cacheArray.
>>> +    functionPointerIndex := fpIndex - 1.
>>> +    entrySize := wordsPerCacheEntry!
>>> 
>>> Item was added:
>>> + ----- Method: CObjectAccessor class>>defaultIntegerBaseInDebugger (in category 'debugger') -----
>>> + defaultIntegerBaseInDebugger
>>> +    ^VMClass defaultIntegerBaseInDebugger!
>>> 
>>> Item was changed:
>>>  ----- Method: CoInterpreter>>methodCacheAddress (in category 'cog jit support') -----
>>>  methodCacheAddress
>>>      <api>
>>>      <returnTypeC: #'void *'>
>>> +    ^self cCode: [methodCache] inSmalltalk: [methodCache address]!
>>> -    ^self cCode: [methodCache] inSmalltalk: [methodCache offset - 1 * objectMemory wordSize]!
>>> 
>>> Item was changed:
>>>  ----- Method: CoInterpreterStackPages>>longAt:put: (in category 'memory access') -----
>>> + longAt: byteAddress put: a32Or64BitValue
>>> - longAt: byteAddress put: a32BitValue
>>>      <doNotGenerate>
>>>      self assert: (byteAddress >= minStackAddress and: [byteAddress < maxStackAddress]).
>>> +    ^objectMemory longAt: byteAddress put: a32Or64BitValue!
>>> -    ^objectMemory longAt: byteAddress put: a32BitValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CoInterpreterStackPagesLSB>>byteAt: (in category 'memory access') -----
>>>  byteAt: byteAddress
>>>      | lowBits long |
>>> +    lowBits := byteAddress bitAnd: objectMemory wordSize - 1.
>>> -    lowBits := byteAddress bitAnd: 3.
>>>      long := self longAt: byteAddress - lowBits.
>>> +    lowBits > 0 ifTrue:
>>> +        [long := long bitShift: lowBits * -8].
>>> +    ^long bitAnd: 16rFF!
>>> -    ^(lowBits caseOf: {
>>> -        [0] -> [ long ].
>>> -        [1] -> [ long bitShift: -8  ].
>>> -        [2] -> [ long bitShift: -16 ].
>>> -        [3] -> [ long bitShift: -24 ]
>>> -    }) bitAnd: 16rFF!
>>> 
>>> Item was changed:
>>>  ----- Method: CoInterpreterStackPagesLSB>>byteAt:put: (in category 'memory access') -----
>>>  byteAt: byteAddress put: byte
>>>      | lowBits long longAddress |
>>> +    self assert: (byte between: 0 and: 16rFF).
>>> +    lowBits := byteAddress bitAnd: objectMemory wordSize - 1.
>>> -    lowBits := byteAddress bitAnd: 3.
>>>      longAddress := byteAddress - lowBits.
>>>      long := self longAt: longAddress.
>>> +    long := (long bitOr: (16rFF bitShift: lowBits * 8)) bitXor: (byte bitXor: 16rFF).
>>> -    long := lowBits caseOf: {
>>> -        [0] -> [ (long bitAnd: 16rFFFFFF00) bitOr: byte ].
>>> -        [1] -> [ (long bitAnd: 16rFFFF00FF) bitOr: (byte bitShift: 8) ].
>>> -        [2] -> [ (long bitAnd: 16rFF00FFFF) bitOr: (byte bitShift: 16)  ].
>>> -        [3] -> [ (long bitAnd: 16r00FFFFFF) bitOr: (byte bitShift: 24)  ]
>>> -    }.
>>> -
>>>      self longAt: longAddress put: long.
>>>      ^byte!
>>> 
>>> Item was changed:
>>>  VMStructType subclass: #CogStackPage
>>> +    instanceVariableNames: 'stackLimit headSP headFP baseFP baseAddress realStackLimit lastAddress trace padToWord nextPage prevPage'
>>> -    instanceVariableNames: 'stackLimit headSP headFP baseFP baseAddress realStackLimit lastAddress trace nextPage prevPage'
>>>      classVariableNames: ''
>>>      poolDictionaries: 'VMBasicConstants VMBytecodeConstants'
>>>      category: 'VMMaker-Interpreter'!
>>> 
>>>  !CogStackPage commentStamp: 'eem 8/14/2015 12:06' prior: 0!
>>>  I am a class that helps organize the StackInterpreter's collection of stack pages.  I represent the control block for a single stack page in the collection of stack pages represented by an InterpreterStackPages or CoInterpreterStackPages instance.!
>>> 
>>> Item was added:
>>> + ----- Method: CogStackPage class>>getter:bitPosition:bitWidth:type: (in category 'code generation') -----
>>> + getter: getter bitPosition: bitPosition bitWidth: bitWidth type: typeOrNil
>>> +    ^String streamContents:
>>> +        [:s| | startByte endByte accessor |
>>> +        startByte := bitPosition // 8.
>>> +        endByte := bitPosition + bitWidth - 1 // 8.
>>> +        self assert: bitPosition \\ 8 = 0.
>>> +        self assert: startByte \\ (bitWidth // 8) = 0.
>>> +        accessor := #('byte' 'short' 'long' 'long')
>>> +                            at: endByte - startByte + 1
>>> +                            ifAbsent: ['long64'].
>>> +        s    nextPutAll: getter; crtab: 1; nextPut: $^.
>>> +        (typeOrNil notNil and: [typeOrNil last = $*]) ifTrue:
>>> +            [accessor := 'unsigned', (accessor copy
>>> +                                        at: 1 put: accessor first asUppercase;
>>> +                                        yourself)].
>>> +        (typeOrNil notNil and: ['*StackPage*' match: typeOrNil]) ifTrue:
>>> +            [s nextPutAll: 'stackPages surrogateAtAddress: ('].
>>> +        s nextPutAll: 'memory ';
>>> +           nextPutAll: accessor;
>>> +           nextPutAll: 'At: address + '; print: startByte + 1.
>>> +        (typeOrNil notNil and: ['*StackPage*' match: typeOrNil]) ifTrue:
>>> +            [s nextPut: $)]]
>>> +
>>> +    "| bitPosition |
>>> +    bitPosition := 0.
>>> +    (self fieldAccessorsForBytesPerWord: 4) collect:
>>> +        [:spec|
>>> +        bitPosition := bitPosition + spec second.
>>> +        self getter: spec first
>>> +             bitPosition: bitPosition - spec second
>>> +             bitWidth: spec second
>>> +             type: (spec at: 3 ifAbsent: [])]"!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPage class>>instVarNamesAndTypesForTranslationDo: (in category 'translation') -----
>>>  instVarNamesAndTypesForTranslationDo: aBinaryBlock
>>>      "enumerate aBinaryBlock with the names and C type strings for the inst vars to include in a StackPage struct."
>>> 
>>>      self allInstVarNames do:
>>>          [:ivn|
>>> +        (ivn = 'padToWord' and: [BytesPerWord = 4]) ifFalse:
>>> -        ivn ~= 'stackPagesMemory' ifTrue:
>>>              [aBinaryBlock
>>>                  value: ivn
>>> +                value: ((ivn = 'trace' or: [ivn = 'padToWord'])
>>> -                value: (ivn = 'trace'
>>>                          ifTrue: [#int]
>>>                          ifFalse:
>>>                              [(ivn endsWith: 'Page')
>>>                                  ifTrue: ['struct _StackPage *']
>>>                                  ifFalse: [#'char *']])]]!
>>> 
>>> Item was added:
>>> + ----- Method: CogStackPage class>>setter:bitPosition:bitWidth:type: (in category 'code generation') -----
>>> + setter: getter bitPosition: bitPosition bitWidth: bitWidth type: typeOrNil
>>> +    ^String streamContents:
>>> +        [:s| | startByte endByte accessor |
>>> +        startByte := bitPosition // 8.
>>> +        endByte := bitPosition + bitWidth - 1 // 8.
>>> +        self assert: bitPosition \\ 8 = 0.
>>> +        self assert: startByte \\ (bitWidth // 8) = 0.
>>> +        accessor := #('byte' 'short' 'long' 'long')
>>> +                            at: endByte - startByte + 1
>>> +                            ifAbsent: ['long64'].
>>> +        s    nextPutAll: getter; nextPutAll: ': aValue'; crtab: 1;
>>> +            nextPutAll: 'self assert: (address + '; print: startByte;
>>> +            nextPutAll: ' >= zoneBase and: [address + '; print: endByte;
>>> +            nextPutAll: ' < zoneLimit]).'; crtab: 1.
>>> +        (typeOrNil notNil and: [typeOrNil last = $*]) ifTrue:
>>> +            [accessor := 'unsigned', (accessor copy
>>> +                                        at: 1 put: accessor first asUppercase;
>>> +                                        yourself)].
>>> +        (typeOrNil notNil and: ['*StackPage*' match: typeOrNil]) ifFalse:
>>> +            [s nextPut: $^].
>>> +        s nextPutAll: 'memory ';
>>> +           nextPutAll: accessor; nextPutAll: 'At: address + '; print: startByte + 1;
>>> +           nextPutAll: ' put: aValue'.
>>> +        (typeOrNil notNil and: ['*StackPage*' match: typeOrNil]) ifTrue:
>>> +            [s nextPutAll: ' asInteger.'; crtab: 1; nextPutAll: '^aValue']]
>>> +
>>> +    "| bitPosition |
>>> +    bitPosition := 0.
>>> +    (self fieldAccessorsForBytesPerWord: 4) collect:
>>> +        [:spec|
>>> +        bitPosition := bitPosition + spec second.
>>> +        self setter: spec first
>>> +             bitPosition: bitPosition - spec second
>>> +             bitWidth: spec second
>>> +             type: (spec at: 3 ifAbsent: [])]"!
>>> 
>>> Item was changed:
>>> + ----- Method: CogStackPageSurrogate32 class>>alignedByteSize (in category 'accessing') -----
>>> - ----- Method: CogStackPageSurrogate32 class>>alignedByteSize (in category 'instance creation') -----
>>>  alignedByteSize
>>>      ^40!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate32>>nextPage: (in category 'accessing') -----
>>>  nextPage: aValue
>>>      self assert: (address + 32 >= zoneBase and: [address + 35 < zoneLimit]).
>>> +    memory unsignedLongAt: address + 33 put: aValue asInteger.
>>> +    ^aValue!
>>> -    ^memory
>>> -        unsignedLongAt: address + 33
>>> -        put: aValue asInteger!
>>> 
>>> Item was added:
>>> + ----- Method: CogStackPageSurrogate32>>padToWord (in category 'accessing') -----
>>> + padToWord
>>> +    ^memory longAt: address + 33!
>>> 
>>> Item was added:
>>> + ----- Method: CogStackPageSurrogate32>>padToWord: (in category 'accessing') -----
>>> + padToWord: aValue
>>> +    self assert: (address + 32 >= zoneBase and: [address + 35 < zoneLimit]).
>>> +    ^memory longAt: address + 33 put: aValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate32>>prevPage: (in category 'accessing') -----
>>>  prevPage: aValue
>>>      self assert: (address + 36 >= zoneBase and: [address + 39 < zoneLimit]).
>>> +    memory unsignedLongAt: address + 37 put: aValue asInteger.
>>> +    ^aValue!
>>> -    ^memory
>>> -        unsignedLongAt: address + 37
>>> -        put: aValue asInteger!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate32>>stackLimit: (in category 'accessing') -----
>>>  stackLimit: aValue
>>> +    self assert: (address + 0 >= zoneBase and: [address + 3 < zoneLimit]).
>>> +    ^memory unsignedLongAt: address + 1 put: aValue!
>>> -    self assert: (address >= zoneBase and: [address + 3 < zoneLimit]).
>>> -    ^memory unsignedLongAt: address + 1 put: aValue signedIntToLong!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>baseAddress (in category 'accessing') -----
>>>  baseAddress
>>> +    ^memory unsignedLong64At: address + 33!
>>> -    ^memory long64At: address + 33!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>baseAddress: (in category 'accessing') -----
>>>  baseAddress: aValue
>>>      self assert: (address + 32 >= zoneBase and: [address + 39 < zoneLimit]).
>>> +    ^memory unsignedLong64At: address + 33 put: aValue!
>>> -    ^memory long64At: address + 33 put: aValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>baseFP (in category 'accessing') -----
>>>  baseFP
>>> +    ^memory unsignedLong64At: address + 25!
>>> -    ^memory long64At: address + 25!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>baseFP: (in category 'accessing') -----
>>>  baseFP: aValue
>>>      self assert: (address + 24 >= zoneBase and: [address + 31 < zoneLimit]).
>>> +    ^memory unsignedLong64At: address + 25 put: aValue!
>>> -    ^memory long64At: address + 25 put: aValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>headFP (in category 'accessing') -----
>>>  headFP
>>> +    ^memory unsignedLong64At: address + 17!
>>> -    ^memory long64At: address + 17!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>headFP: (in category 'accessing') -----
>>>  headFP: aValue
>>>      self assert: (address + 16 >= zoneBase and: [address + 23 < zoneLimit]).
>>> +    ^memory unsignedLong64At: address + 17 put: aValue!
>>> -    ^memory long64At: address + 17 put: aValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>headSP (in category 'accessing') -----
>>>  headSP
>>> +    ^memory unsignedLong64At: address + 9!
>>> -    ^memory long64At: address + 9!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>headSP: (in category 'accessing') -----
>>>  headSP: aValue
>>>      self assert: (address + 8 >= zoneBase and: [address + 15 < zoneLimit]).
>>> +    ^memory unsignedLong64At: address + 9 put: aValue!
>>> -    ^memory long64At: address + 9 put: aValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>lastAddress (in category 'accessing') -----
>>>  lastAddress
>>> +    ^memory unsignedLong64At: address + 49!
>>> -    ^memory long64At: address + 49!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>lastAddress: (in category 'accessing') -----
>>>  lastAddress: aValue
>>> +    self assert: (address + 48 >= zoneBase and: [address + 55 < zoneLimit]).
>>> +    ^memory unsignedLong64At: address + 49 put: aValue!
>>> -    self assert: (address + 48 >= zoneBase and: [address + 35 < zoneLimit]).
>>> -    ^memory long64At: address + 49 put: aValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>nextPage (in category 'accessing') -----
>>>  nextPage
>>> +    ^stackPages surrogateAtAddress: (memory unsignedLong64At: address + 65)!
>>> -    ^stackPages surrogateAtAddress: (memory long64At: address + 65)!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>nextPage: (in category 'accessing') -----
>>>  nextPage: aValue
>>>      self assert: (address + 64 >= zoneBase and: [address + 71 < zoneLimit]).
>>> +    memory unsignedLong64At: address + 65 put: aValue asInteger.
>>> +    ^aValue!
>>> -    ^memory
>>> -        long64At: address + 65
>>> -        put: aValue asInteger!
>>> 
>>> Item was added:
>>> + ----- Method: CogStackPageSurrogate64>>padToWord (in category 'accessing') -----
>>> + padToWord
>>> +    ^memory long64At: address + 65!
>>> 
>>> Item was added:
>>> + ----- Method: CogStackPageSurrogate64>>padToWord: (in category 'accessing') -----
>>> + padToWord: aValue
>>> +    self assert: (address + 64 >= zoneBase and: [address + 71 < zoneLimit]).
>>> +    ^memory long64At: address + 65 put: aValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>prevPage (in category 'accessing') -----
>>>  prevPage
>>> +    ^stackPages surrogateAtAddress: (memory unsignedLong64At: address + 73)!
>>> -    ^stackPages surrogateAtAddress: (memory long64At: address + 73)!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>prevPage: (in category 'accessing') -----
>>>  prevPage: aValue
>>>      self assert: (address + 72 >= zoneBase and: [address + 79 < zoneLimit]).
>>> +    memory unsignedLong64At: address + 73 put: aValue asInteger.
>>> +    ^aValue!
>>> -    ^memory
>>> -        long64At: address + 73
>>> -        put: aValue asInteger!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>realStackLimit (in category 'accessing') -----
>>>  realStackLimit
>>> +    ^memory unsignedLong64At: address + 41!
>>> -    ^memory long64At: address + 41!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>realStackLimit: (in category 'accessing') -----
>>>  realStackLimit: aValue
>>>      self assert: (address + 40 >= zoneBase and: [address + 47 < zoneLimit]).
>>> +    ^memory unsignedLong64At: address + 41 put: aValue!
>>> -    ^memory long64At: address + 41 put: aValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>stackLimit (in category 'accessing') -----
>>>  stackLimit
>>> +    ^memory unsignedLong64At: address + 1!
>>> -    ^memory long64At: address + 1!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>stackLimit: (in category 'accessing') -----
>>>  stackLimit: aValue
>>> +    self assert: (address + 0 >= zoneBase and: [address + 7 < zoneLimit]).
>>> +    ^memory unsignedLong64At: address + 1 put: aValue!
>>> -    self assert: (address >= zoneBase and: [address + 7 < zoneLimit]).
>>> -    ^memory long64At: address + 1 put: aValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>trace (in category 'accessing') -----
>>>  trace
>>> +    ^memory long64At: address + 57!
>>> -    ^memory longAt: address + 57!
>>> 
>>> Item was changed:
>>>  ----- Method: CogStackPageSurrogate64>>trace: (in category 'accessing') -----
>>>  trace: aValue
>>> +    self assert: (address + 56 >= zoneBase and: [address + 63 < zoneLimit]).
>>> +    ^memory long64At: address + 57 put: aValue!
>>> -    self assert: (address + 56 >= zoneBase and: [address + 59 < zoneLimit]).
>>> -    ^memory longAt: address + 57 put: aValue!
>>> 
>>> Item was changed:
>>>  ----- Method: CogVMSimulator>>ceSendFromInLineCacheMiss: (in category 'trampolines') -----
>>>  ceSendFromInLineCacheMiss: oPIC
>>>      "Override to map the address into a CogMethodSurrogate"
>>>      | surrogate |
>>>      surrogate := oPIC isInteger
>>>                      ifTrue: [cogit cogMethodSurrogateAt: oPIC]
>>>                      ifFalse: [oPIC].
>>>      self logSend: surrogate selector.
>>> +    (surrogate cmNumArgs = 0
>>> +     and: [(self stackValue: 1) = 16r8169D0
>>> +     and: [self stackTop = 16r53EA7]]) ifTrue:
>>> +        [self halt].
>>>      ^super ceSendFromInLineCacheMiss: surrogate!
>>> 
>>> Item was changed:
>>>  ----- Method: CogVMSimulator>>moveMethodCacheToMemoryAt: (in category 'initialization') -----
>>>  moveMethodCacheToMemoryAt: address
>>>      | oldMethodCache |
>>>      oldMethodCache := methodCache.
>>> -    self flag: 'broken for 64-bit VM because Bitmap access unit is 32-bits'.
>>>      "In the VM the methodCache is written as a normal array with 1-relative addressing.
>>>       In C this works by allocating an extra element in the methodCache array (see
>>>       class-side declareCVarsIn:).  In simulation simply position the start of the methodCache
>>>       one word lower, achieving the same effect.  -1 because CArrayAccessor is 0-relative
>>>       and adds 1 on accesses itself."
>>>      methodCache := CMethodCacheAccessor new
>>> +                        objectMemory: objectMemory
>>> +                        at: address
>>> -                        memory: objectMemory memory
>>> -                        offset: address / objectMemory wordSize
>>>                          array: oldMethodCache
>>>                          functionPointerIndex: MethodCachePrimFunction
>>>                          entrySize: MethodCacheEntrySize.
>>> +    self assert: address - objectMemory wordSize = self methodCacheAddress.
>>>      1 to: MethodCacheSize do:
>>>          [:i|
>>>          self assert: (methodCache at: i) = 0].
>>>      methodCache at: 1 put: 16rC4EC4.
>>> +    self assert: (objectMemory longAt: address) = 16rC4EC4.
>>> -    self assert: (self longAt: address) = 16rC4EC4.
>>>      1 to: MethodCacheSize do:
>>>          [:i|
>>>          methodCache at: i put: (oldMethodCache at: i)]!
>>> 
>>> Item was changed:
>>>  ----- Method: CogVMSimulator>>movePrimTraceLogToMemoryAt: (in category 'initialization') -----
>>>  movePrimTraceLogToMemoryAt: address
>>>      | oldTraceLog |
>>>      oldTraceLog := primTraceLog.
>>> +    primTraceLog := CArrayOfLongsAccessor new
>>> +                        objectMemory: objectMemory at: address.
>>> +    self assert: address = self primTraceLogAddress.
>>> -    self flag: 'broken for 64-bit VM because Bitmap access unit is 32-bits'.
>>> -    primTraceLog := CObjectAccessor new
>>> -                        memory: objectMemory memory
>>> -                        offset: address / objectMemory wordSize.
>>>      0 to: PrimTraceLogSize - 1 do:
>>>          [:i|
>>>          self assert: (primTraceLog at: i) = 0].
>>>      primTraceLog at: 0 put: 16rC4EC4.
>>> +    self assert: (objectMemory longAt: address) = 16rC4EC4.
>>> -    self assert: (self longAt: address) = 16rC4EC4.
>>>      0 to: PrimTraceLogSize - 1 do:
>>>          [:i|
>>>          primTraceLog at: i put: (oldTraceLog at: i)]!
>>> 
>>> Item was changed:
>>>  ----- Method: Cogit>>cCoerceSimple:to: (in category 'translation support') -----
>>>  cCoerceSimple: value to: cTypeString
>>>      <doNotGenerate>
>>> +    cTypeString last == $* ifTrue:
>>> +        [cTypeString == #'CogMethod *' ifTrue:
>>> +            [^(value isInteger and: [value < 0])
>>> +                ifTrue: [value] "it's an error code; leave it be"
>>> +                ifFalse: [self cogMethodSurrogateAt: value asUnsignedInteger]].
>>> +        cTypeString == #'CogBlockMethod *' ifTrue:
>>> +            [^self cogBlockMethodSurrogateAt: value asUnsignedInteger].
>>> +        cTypeString == #'NSSendCache *' ifTrue:
>>> +            [^self nsSendCacheSurrogateAt: value asUnsignedInteger].
>>> +        (cTypeString == #'AbstractInstruction *'
>>> +         and: [value isBehavior]) ifTrue:
>>> +            [^CogCompilerClass].
>>> +        cTypeString == #'StackPage *' ifTrue:
>>> +            [^coInterpreter stackPages surrogateAtAddress: value]].
>>> -    cTypeString == #'CogMethod *' ifTrue:
>>> -        [^(value isInteger and: [value < 0])
>>> -            ifTrue: [value] "it's an error code; leave it be"
>>> -            ifFalse: [self cogMethodSurrogateAt: value asUnsignedInteger]].
>>> -    cTypeString == #'CogBlockMethod *' ifTrue:
>>> -        [^self cogBlockMethodSurrogateAt: value asUnsignedInteger].
>>> -    cTypeString == #'NSSendCache *' ifTrue:
>>> -        [^self nsSendCacheSurrogateAt: value asUnsignedInteger].
>>> -    (cTypeString == #'AbstractInstruction *'
>>> -     and: [value isBehavior]) ifTrue:
>>> -        [^CogCompilerClass].
>>>      ^super cCoerceSimple: value to: cTypeString!
>>> 
>>> Item was added:
>>> + ----- Method: Integer>>signedIntFromChar (in category '*VMMaker-interpreter simulator') -----
>>> + signedIntFromChar
>>> +    "Self is an unsigned 8-bit integer in twos-comp form"
>>> +
>>> +    | shortBits |
>>> +    shortBits := self bitAnd: 16rFF.
>>> +    ^(self bitAnd: 16r80) "sign bit" = 0
>>> +        ifTrue: [shortBits]
>>> +        ifFalse: [shortBits - 16r100]!
>>> 
>>> Item was changed:
>>>  ----- Method: Integer>>signedIntFromLong (in category '*VMMaker-interpreter simulator') -----
>>>  signedIntFromLong
>>>      "Self is a signed or unsigned 32-bit integer"
>>> 
>>> +    | bits |
>>> +    (self >= -1073741824 and: [self <= 1073741823]) ifTrue: "These are known to be SmallIntegers..."
>>> +        [^self].
>>> +    bits := self bitAnd: 16rFFFFFFFF.
>>> +    (bits digitAt: 4) <= 16r7F ifTrue: [^bits].
>>> +    ^bits - 16r100000000!
>>> -    | sign |
>>> -    self < 0 ifTrue: [^self].
>>> -    sign := self bitAnd: 16r80000000.
>>> -    sign = 0 ifTrue: [^ self].
>>> -    ^ self - sign - sign!
>>> 
>>> Item was changed:
>>>  ----- Method: Integer>>signedIntFromLong64 (in category '*VMMaker-interpreter simulator') -----
>>>  signedIntFromLong64
>>>      "Self is a signed or unsigned 64-bit integer"
>>> 
>>> +    | bits |
>>> +    "This case is handled by the SmallInteger subclass..."
>>> +    "(self >= -1073741824 and: [self <= 1073741823]) ifTrue:
>>> +        [^self]."
>>> +    bits := self bitAnd: 16rFFFFFFFFFFFFFFFF.
>>> +    (bits digitAt: 8) <= 16r7F ifTrue: [^bits].
>>> +    ^bits - 16r10000000000000000!
>>> -    | sign |
>>> -    self < 0 ifTrue: [^self].
>>> -    sign := self bitAnd: 16r8000000000000000.
>>> -    sign = 0 ifTrue: [^self].
>>> -    ^self - sign - sign!
>>> 
>>> Item was added:
>>> + ----- Method: Integer>>signedIntToChar (in category '*VMMaker-interpreter simulator') -----
>>> + signedIntToChar
>>> +    "Produces an 8-bit value in twos-comp form. Truncates if out-of-range as per a C cast"
>>> +
>>> +    ^self bitAnd: 16rFF!
>>> 
>>> Item was changed:
>>>  ----- Method: Integer>>signedIntToLong (in category '*VMMaker-interpreter simulator') -----
>>>  signedIntToLong
>>> +    "Produces a 32-bit value in twos-comp form. Truncates if out-of-range as per a C cast"
>>> -    "Produces a 32-bit value in twos-comp form.  Sorry no error checking"
>>> 
>>> +    ^self bitAnd: 16rFFFFFFFF!
>>> -    self >= 0
>>> -        ifTrue: [^ self]
>>> -        ifFalse: [^ self + 16r80000000 + 16r80000000]
>>> - !
>>> 
>>> Item was changed:
>>>  ----- Method: Integer>>signedIntToLong64 (in category '*VMMaker-interpreter simulator') -----
>>>  signedIntToLong64
>>> +    "Produces a 64-bit value in twos-comp form. Truncates if out-of-range as per a C cast"
>>> -    "Produces a 64-bit value in twos-comp form.  Sorry no error checking"
>>> 
>>> +    ^self bitAnd: 16rFFFFFFFFFFFFFFFF!
>>> -    self >= 0
>>> -        ifTrue: [^ self]
>>> -        ifFalse: [^ self + 16r8000000000000000 + 16r8000000000000000]
>>> - !
>>> 
>>> Item was changed:
>>>  ----- Method: Integer>>signedIntToShort (in category '*VMMaker-interpreter simulator') -----
>>>  signedIntToShort
>>> +    "Produces a 16-bit value in twos-comp form. Truncates if out-of-range as per a C cast"
>>> -    "Produces a 16-bit value (0-65k) in twos-comp form.  Sorry no error checking"
>>> 
>>>      ^self bitAnd: 16rFFFF!
>>> 
>>> Item was added:
>>> + ----- Method: SmallInteger>>signedIntFromLong64 (in category '*VMMaker-interpreter simulator') -----
>>> + signedIntFromLong64
>>> +    "Self is a signed or unsigned 64-bit integer.
>>> +     Currently SmallIntegers are either 31-bit (in the 32-bit implementation) or 61-bit
>>> +     (in the 64-bit implementation) so save some time by overriding in the subclass."
>>> +    ^self!
>>> 
>>> Item was added:
>>> + ----- Method: VMClass class>>openCogTestsMultiWindowBrowser (in category 'utilities') -----
>>> + openCogTestsMultiWindowBrowser
>>> +    "Answer a new multi-window browser on the test classes in VMMaker"
>>> +    "self openCogTestsMultiWindowBrowser"
>>> +    | testClasses b |
>>> +    testClasses := (PackageInfo named: 'VMMaker') classes select: [:c| c inheritsFrom: TestCase].
>>> +    testClasses removeAll: AbstractInstructionTests allSubclasses.
>>> +    testClasses removeAll: (testClasses select: [:c| '*Plugin*' match: c name]).
>>> +    b := Browser open.
>>> +    testClasses do:
>>> +        [:class| b selectCategoryForClass: class; selectClass: class]
>>> +        separatedBy:
>>> +            [b multiWindowState addNewWindow].
>>> +    b multiWindowState selectWindowIndex: 1!
>>> 
>>> Item was added:
>>> + ----- Method: VMClass class>>openCogitMultiWindowBrowser (in category 'utilities') -----
>>> + openCogitMultiWindowBrowser
>>> +    "Answer a new multi-window browser on the ObjectMemory classes, the Cog Interpreter classes, and the main JIT classes"
>>> +    "self openCogitMultiWindowBrowser"
>>> +    | b |
>>> +    b := Browser open.
>>> +    Cogit withAllSubclasses,
>>> +    CogObjectRepresentation withAllSubclasses,
>>> +    {CogMethodZone. CogRTLOpcodes },
>>> +    (CogAbstractInstruction withAllSubclasses reject: [:c| c name endsWith: 'Tests']),
>>> +    {VMStructType. VMMaker. CCodeGenerator. TMethod}
>>> +        do: [:class|
>>> +            b selectCategoryForClass: class; selectClass: class]
>>> +        separatedBy:
>>> +            [b multiWindowState addNewWindow].
>>> +    b multiWindowState selectWindowIndex: 1!
>>> 
>>> Item was added:
>>> + TestCase subclass: #VMMakerIntegerTests
>>> +    instanceVariableNames: ''
>>> +    classVariableNames: ''
>>> +    poolDictionaries: ''
>>> +    category: 'VMMaker-Tests'!
>>> 
>>> Item was added:
>>> + ----- Method: VMMakerIntegerTests>>testSignedIntFromFoo (in category 'tests') -----
>>> + testSignedIntFromFoo
>>> +    self assert: 16r55 signedIntFromChar equals: 16r55.
>>> +    self assert: 16r155 signedIntFromChar equals: 16r55.
>>> +    self assert: 16rAA signedIntFromChar < 0.
>>> +    self assert: (16rAA signedIntFromChar bitAnd: 16rFF) = 16rAA.
>>> +
>>> +    self assert: 16r5555 signedIntFromShort equals: 16r5555.
>>> +    self assert: 16r15555 signedIntFromShort equals: 16r5555.
>>> +    self assert: 16rAAAA signedIntFromShort < 0.
>>> +    self assert: (16rAAAA signedIntFromShort bitAnd: 16rFFFF) = 16rAAAA.
>>> +
>>> +    self assert: 16r55555555 signedIntFromLong equals: 16r55555555.
>>> +    self assert: 16r155555555 signedIntFromLong equals: 16r55555555.
>>> +    self assert: 16rAAAAAAAA signedIntFromLong< 0.
>>> +    self assert: (16rAAAAAAAA signedIntFromLong bitAnd: 16rFFFFFFFF) = 16rAAAAAAAA.
>>> +
>>> +    self assert: 16r5555555555555555 signedIntFromLong64 equals: 16r5555555555555555.
>>> +    self assert: 16r15555555555555555 signedIntFromLong64 equals: 16r5555555555555555.
>>> +    self assert: 16rAAAAAAAAAAAAAAAA signedIntFromLong64< 0.
>>> +    self assert: (16rAAAAAAAAAAAAAAAA signedIntFromLong64 bitAnd: 16rFFFFFFFFFFFFFFFF) = 16rAAAAAAAAAAAAAAAA!
>>> 
>>> Item was added:
>>> + ----- Method: VMMakerIntegerTests>>testSignedIntToFoo (in category 'tests') -----
>>> + testSignedIntToFoo
>>> +    #(16r55 -16r56 16r5555 -16r5556 16r55555555 -16r55555556 16r5555555555555555 -16r5555555555555556) do:
>>> +        [:n|
>>> +        n abs digitLength = 1 ifTrue:
>>> +            [self assert: n signedIntToChar signedIntFromChar equals: n].
>>> +        self assert: (n signedIntToChar signedIntFromChar bitAnd: 16rFF) equals: (n bitAnd: 16rFF).
>>> +        n abs digitLength <= 2 ifTrue:
>>> +            [self assert: n signedIntToShort signedIntFromShort equals: n].
>>> +        self assert: (n signedIntToShort signedIntFromShort bitAnd: 16rFFFF) equals: (n bitAnd: 16rFFFF).
>>> +        n abs digitLength <= 4 ifTrue:
>>> +            [self assert: n signedIntToLong signedIntFromLong equals: n].
>>> +        self assert: (n signedIntToLong signedIntFromLong bitAnd: 16rFFFFFFFF) equals: (n bitAnd: 16rFFFFFFFF).
>>> +        n abs digitLength <= 8 ifTrue:
>>> +            [self assert: n signedIntToLong64 signedIntFromLong64 equals: n].
>>> +        self assert: (n signedIntToLong64 signedIntFromLong64 bitAnd: 16rFFFFFFFFFFFFFFFF) equals: (n bitAnd: 16rFFFFFFFFFFFFFFFF)]!
>>> 



More information about the Vm-dev mailing list