[Vm-dev] VM Maker: VMMaker.oscog-eem.320.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Aug 14 21:12:39 UTC 2013
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.320.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.320
Author: eem
Time: 14 August 2013, 2:08:09.177 pm
UUID: 543f6d09-e921-41db-955f-b2a6942817cb
Ancestors: VMMaker.oscog-eem.319
Add a prevBCDescriptor to the StackToRegisterMappingCogit
scanners. This enables needsFrameIfFollowsSend:.
Avoid spilling in frameless methods (now that pushTempVar can be
frameless and hence inst var setters such at setX:Y: are now
frameless) by adding needsFrameIfFollowsSend: used for special
selectors #class & #==.
Make the new frameless regime the default. Hence nuke the experimental
generator initializers.
=============== Diff against VMMaker.oscog-eem.319 ===============
Item was removed:
- ----- Method: Cogit class>>newInitializeBytecodeTableForNewspeakV3PlusClosuresNewspeakV4Hybrid (in category 'class initialization') -----
- newInitializeBytecodeTableForNewspeakV3PlusClosuresNewspeakV4Hybrid
- "SimpleStackBasedCogit newInitializeBytecodeTableForNewspeakV3PlusClosuresNewspeakV4Hybrid"
- "StackToRegisterMappingCogit newInitializeBytecodeTableForNewspeakV3PlusClosuresNewspeakV4Hybrid"
-
- | v3Table v4Table |
- "N.B. Must do it backwards to evaluate AltBlockCreationBytecodeSize & BlockCreationBytecodeSize correctly."
- self newInitializeBytecodeTableForNewspeakV4.
- v4Table := generatorTable.
- AltBlockCreationBytecodeSize := BlockCreationBytecodeSize.
- AltNSSendIsPCAnnotated := NSSendIsPCAnnotated.
- self newInitializeBytecodeTableForNewspeakV3PlusClosures.
- v3Table := generatorTable.
- generatorTable := CArrayAccessor on: v3Table object, v4Table object!
Item was changed:
----- Method: SistaStackToRegisterMappingCogit>>scanMethod (in category 'compile abstract instructions') -----
scanMethod
"Scan the method to determine
- what the last bytecode is; extra bytes at the end of a method are used to encode things like source pointers or temp names
- if the method needs a frame or not
- what are the targets of any backward branches.
- how many blocks it creates
- how many counters it needs/conditional branches it contains
Answer the block count or on error a negative error code"
+ | latestContinuation nExts descriptor pc numBlocks distance targetPC |
- | latestContinuation nExts descriptor pc numBlocks distance targetPC stackDelta |
<var: #descriptor type: #'BytecodeDescriptor *'>
needsFrame := false.
+ prevBCDescriptor := nil.
numCounters := 0.
(primitiveIndex > 0
and: [coInterpreter isQuickPrimitiveIndex: primitiveIndex]) ifTrue:
[^0].
numBlocks := 0.
pc := latestContinuation := initialPC.
nExts := 0.
- stackDelta := 0.
[pc <= endPC] whileTrue:
[byte0 := (objectMemory fetchByte: pc ofObject: methodObj) + bytecodeSetOffset.
descriptor := self generatorAt: byte0.
(descriptor isReturn
and: [pc >= latestContinuation]) ifTrue:
[endPC := pc].
+ (needsFrame not
+ and: [descriptor needsFrameFunction isNil
+ or: [self perform: descriptor needsFrameFunction with: false]]) ifTrue:
+ [needsFrame := true].
- needsFrame ifFalse:
- [(descriptor needsFrameFunction isNil
- or: [self perform: descriptor needsFrameFunction with: true])
- ifTrue:
- [needsFrame := true]
- ifFalse: "avoid spilling in frameless methods by not compiling frameless
- anything with a stack deeper than a single push."
- [needsFrame := (stackDelta := stackDelta + descriptor stackDelta) > 1]].
descriptor isBranch ifTrue:
[distance := self spanFor: descriptor at: pc exts: nExts in: methodObj.
targetPC := pc + descriptor numBytes + distance.
(self isBackwardBranch: descriptor at: pc exts: nExts in: methodObj)
ifTrue: [self initializeFixupAt: targetPC - initialPC]
ifFalse:
[latestContinuation := latestContinuation max: targetPC.
(descriptor isBranchTrue or: [descriptor isBranchFalse]) ifTrue:
[numCounters := numCounters + 1]]].
descriptor isBlockCreation ifTrue:
[numBlocks := numBlocks + 1.
distance := self spanFor: descriptor at: pc exts: nExts in: methodObj.
targetPC := pc + descriptor numBytes + distance.
latestContinuation := latestContinuation max: targetPC].
pc := pc + descriptor numBytes.
+ nExts := descriptor isExtension ifTrue: [nExts + 1] ifFalse: [0].
+ prevBCDescriptor := descriptor].
- nExts := descriptor isExtension ifTrue: [nExts + 1] ifFalse: [0]].
^numBlocks!
Item was changed:
SimpleStackBasedCogit subclass: #StackToRegisterMappingCogit
+ instanceVariableNames: 'prevBCDescriptor isPushNilFunction pushNilSizeFunction callerSavedRegMask methodOrBlockNumTemps regArgsHaveBeenPushed simSelf simStack simStackPtr simSpillBase optStatus ceEnterCogCodePopReceiverArg0Regs ceEnterCogCodePopReceiverArg1Arg0Regs methodAbortTrampolines picAbortTrampolines picMissTrampolines ceEnter0ArgsPIC ceEnter1ArgsPIC ceEnter2ArgsPIC debugStackPointers debugFixupBreaks debugBytecodePointers realCEEnterCogCodePopReceiverArg0Regs realCEEnterCogCodePopReceiverArg1Arg0Regs deadCode'
- instanceVariableNames: 'isPushNilFunction pushNilSizeFunction callerSavedRegMask methodOrBlockNumTemps regArgsHaveBeenPushed simSelf simStack simStackPtr simSpillBase optStatus ceEnterCogCodePopReceiverArg0Regs ceEnterCogCodePopReceiverArg1Arg0Regs methodAbortTrampolines picAbortTrampolines picMissTrampolines ceEnter0ArgsPIC ceEnter1ArgsPIC ceEnter2ArgsPIC debugStackPointers debugFixupBreaks debugBytecodePointers realCEEnterCogCodePopReceiverArg0Regs realCEEnterCogCodePopReceiverArg1Arg0Regs deadCode'
classVariableNames: ''
poolDictionaries: 'CogCompilationConstants VMMethodCacheConstants VMObjectIndices VMStackFrameOffsets'
category: 'VMMaker-JIT'!
StackToRegisterMappingCogit class
instanceVariableNames: 'isPushNilFunction pushNilSizeFunction'!
!StackToRegisterMappingCogit commentStamp: 'eem 12/19/2010 18:12' prior: 0!
StackToRegisterMappingCogit is an optimizing code generator that eliminates a lot of stack operations and inlines some special selector arithmetic. It does so by a simple stack-to-register mapping scheme based on deferring the generation of code to produce operands until operand-consuming operations. The operations that consume operands are sends, stores and returns.
See methods in the class-side documentation protocol for more detail.
Instance Variables
callerSavedRegMask: <Integer>
ceEnter0ArgsPIC: <Integer>
ceEnter1ArgsPIC: <Integer>
ceEnter2ArgsPIC: <Integer>
ceEnterCogCodePopReceiverArg0Regs: <Integer>
ceEnterCogCodePopReceiverArg1Arg0Regs: <Integer>
debugBytecodePointers: <Set of Integer>
debugFixupBreaks: <Set of Integer>
debugStackPointers: <CArrayAccessor of (Integer|nil)>
methodAbortTrampolines: <CArrayAccessor of Integer>
methodOrBlockNumTemps: <Integer>
optStatus: <Integer>
picAbortTrampolines: <CArrayAccessor of Integer>
picMissTrampolines: <CArrayAccessor of Integer>
realCEEnterCogCodePopReceiverArg0Regs: <Integer>
realCEEnterCogCodePopReceiverArg1Arg0Regs: <Integer>
regArgsHaveBeenPushed: <Boolean>
simSelf: <CogSimStackEntry>
simSpillBase: <Integer>
simStack: <CArrayAccessor of CogSimStackEntry>
simStackPtr: <Integer>
traceSimStack: <Integer>
callerSavedRegMask
- the bitmask of the ABI's caller-saved registers
ceEnter0ArgsPIC ceEnter1ArgsPIC ceEnter2ArgsPIC
- the trampoline for entering an N-arg PIC
ceEnterCogCodePopReceiverArg0Regs ceEnterCogCodePopReceiverArg1Arg0Regs
- teh trampoline for entering a method with N register args
debugBytecodePointers
- a Set of bytecode pcs for setting breakpoints (simulation only)
debugFixupBreaks
- a Set of fixup indices for setting breakpoints (simulation only)
debugStackPointers
- an Array of stack depths for each bytecode for code verification
methodAbortTrampolines
- a CArrayAccessor of abort trampolines for 0, 1, 2 and N args
methodOrBlockNumTemps
- the number of method or block temps (including args) in the current compilation unit (method or block)
optStatus
- the variable used to track the status of ReceiverResultReg for avoiding reloading that register with self between adjacent inst var accesses
picAbortTrampolines
- a CArrayAccessor of abort trampolines for 0, 1, 2 and N args
picMissTrampolines
- a CArrayAccessor of abort trampolines for 0, 1, 2 and N args
realCEEnterCogCodePopReceiverArg0Regs realCEEnterCogCodePopReceiverArg1Arg0Regs
- the real trampolines for ebtering machine code with N reg args when in the Debug regime
regArgsHaveBeenPushed
- whether the register args have been pushed before frame build (e.g. when an interpreter primitive is called)
simSelf
- the simulation stack entry representing self in the current compilation unit
simSpillBase
- the variable tracking how much of the simulation stack has been spilled to the real stack
simStack
- the simulation stack itself
simStackPtr
- the pointer to the top of the simulation stack
!
StackToRegisterMappingCogit class
instanceVariableNames: 'isPushNilFunction pushNilSizeFunction'!
Item was changed:
----- Method: StackToRegisterMappingCogit class>>declareCVarsIn: (in category 'translation') -----
declareCVarsIn: aCodeGen
aCodeGen
var: #methodAbortTrampolines
declareC: 'sqInt methodAbortTrampolines[4]';
var: #picAbortTrampolines
declareC: 'sqInt picAbortTrampolines[4]';
var: #picMissTrampolines
declareC: 'sqInt picMissTrampolines[4]';
var: 'ceEnter0ArgsPIC'
declareC: 'void (*ceEnter0ArgsPIC)(void)';
var: 'ceEnter1ArgsPIC'
declareC: 'void (*ceEnter1ArgsPIC)(void)';
var: 'ceEnter2ArgsPIC'
declareC: 'void (*ceEnter2ArgsPIC)(void)';
var: #ceEnterCogCodePopReceiverArg0Regs
declareC: 'void (*ceEnterCogCodePopReceiverArg0Regs)(void)';
var: #realCEEnterCogCodePopReceiverArg0Regs
declareC: 'void (*realCEEnterCogCodePopReceiverArg0Regs)(void)';
var: #ceEnterCogCodePopReceiverArg1Arg0Regs
declareC: 'void (*ceEnterCogCodePopReceiverArg1Arg0Regs)(void)';
var: #realCEEnterCogCodePopReceiverArg1Arg0Regs
declareC: 'void (*realCEEnterCogCodePopReceiverArg1Arg0Regs)(void)';
var: 'simStack'
declareC: 'CogSimStackEntry simStack[', ((CoInterpreter bindingOf: #LargeContextSize) value * 5 / 4 // BytesPerWord) asString, ']';
var: 'simSelf'
type: #CogSimStackEntry;
var: #optStatus
type: #CogSSOptStatus;
var: 'isPushNilFunction'
declareC: 'sqInt (* const isPushNilFunction)(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt) = ', (aCodeGen cFunctionNameFor: self isPushNilFunction);
var: 'pushNilSizeFunction'
+ declareC: 'sqInt (* const pushNilSizeFunction)(sqInt) = ', (aCodeGen cFunctionNameFor: self pushNilSizeFunction);
+ var: 'prevBCDescriptor'
+ type: #'BytecodeDescriptor *'.
- declareC: 'sqInt (* const pushNilSizeFunction)(sqInt) = ', (aCodeGen cFunctionNameFor: self pushNilSizeFunction).
aCodeGen
addSelectorTranslation: #register to: (aCodeGen cFunctionNameFor: 'registerr');
addSelectorTranslation: #register: to: (aCodeGen cFunctionNameFor: 'registerr:')!
Item was removed:
- ----- Method: StackToRegisterMappingCogit class>>initializeBytecodeTableForClosureV3 (in category 'class initialization') -----
- initializeBytecodeTableForClosureV3
- "StackToRegisterMappingCogit initializeBytecodeTableForClosureV3"
-
- isPushNilFunction := #v3:Is:Push:Nil:.
- pushNilSizeFunction := #v3PushNilSize:.
- self flag:
- 'Special selector send class must be inlined to agree with the interpreter, which
- inlines class. If class is sent to e.g. a general instance of ProtoObject then unless
- class is inlined there will be an MNU. It must be that the Cointerpreter and Cogit
- have identical semantics. We get away with not hardwiring the other special
- selectors either because in the Cointerpreter they are not inlined or because they
- are inlined only to instances of classes for which there will always be a method.'.
- self generatorTableFrom: {
- #(1 0 15 genPushReceiverVariableBytecode needsFrameNever: 1).
- #(1 16 31 genPushTemporaryVariableBytecode).
- #(1 32 63 genPushLiteralConstantBytecode needsFrameNever: 1).
- #(1 64 95 genPushLiteralVariableBytecode needsFrameNever: 1).
- #(1 96 103 genStoreAndPopReceiverVariableBytecode needsFrameNever: -1). "N.B. not frameless if immutability"
- #(1 104 111 genStoreAndPopTemporaryVariableBytecode).
- #(1 112 112 genPushReceiverBytecode needsFrameNever: 1).
- #(1 113 113 genPushConstantTrueBytecode needsFrameNever: 1).
- #(1 114 114 genPushConstantFalseBytecode needsFrameNever: 1).
- #(1 115 115 genPushConstantNilBytecode needsFrameNever: 1).
- #(1 116 119 genPushQuickIntegerConstantBytecode needsFrameNever: 1).
- "method returns in blocks need a frame because of nonlocalReturn:through:"
- #(1 120 120 genReturnReceiver return needsFrameIfInBlock: isMappedInBlock 0).
- #(1 121 121 genReturnTrue return needsFrameIfInBlock: isMappedInBlock 0).
- #(1 122 122 genReturnFalse return needsFrameIfInBlock: isMappedInBlock 0).
- #(1 123 123 genReturnNil return needsFrameIfInBlock: isMappedInBlock 0).
- #(1 124 124 genReturnTopFromMethod return needsFrameIfInBlock: isMappedInBlock -1).
- #(1 125 125 genReturnTopFromBlock return needsFrameNever: -1).
-
- NewspeakVM
- ifTrue: [#(3 126 126 genDynamicSuperSendBytecode isMapped)]
- ifFalse: [#(1 126 126 unknownBytecode)].
- NewspeakVM
- ifTrue: [#(2 127 127 genPushImplicitReceiverBytecode isMapped)]
- ifFalse: [#(1 127 127 unknownBytecode)].
-
- #(2 128 128 extendedPushBytecode needsFrameNever: 1).
- #(2 129 129 extendedStoreBytecode).
- #(2 130 130 extendedStoreAndPopBytecode).
- #(2 131 131 genExtendedSendBytecode isMapped).
- #(3 132 132 doubleExtendedDoAnythingBytecode isMapped).
- #(2 133 133 genExtendedSuperBytecode isMapped).
- #(2 134 134 genSecondExtendedSendBytecode isMapped).
- #(1 135 135 genPopStackBytecode needsFrameNever: -1).
- #(1 136 136 duplicateTopBytecode needsFrameNever: 1).
-
- #(1 137 137 genPushActiveContextBytecode).
- #(2 138 138 genPushNewArrayBytecode).
- NewspeakVM
- ifTrue: [#(2 139 139 genPushExplicitOuterSendReceiverBytecode isMapped)]
- ifFalse: [#(1 139 139 unknownBytecode)].
- #(3 140 140 genPushRemoteTempLongBytecode).
- #(3 141 141 genStoreRemoteTempLongBytecode).
- #(3 142 142 genStoreAndPopRemoteTempLongBytecode).
- #(4 143 143 genPushClosureCopyCopiedValuesBytecode block v3:Block:Code:Size:).
-
- #(1 144 151 genShortUnconditionalJump branch v3:ShortForward:Branch:Distance:).
- #(1 152 159 genShortJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
- v3:ShortForward:Branch:Distance:).
- #(2 160 163 genLongUnconditionalBackwardJump branch isMapped "because of interrupt check"
- v3:Long:Branch:Distance:).
- #(2 164 167 genLongUnconditionalForwardJump branch v3:Long:Branch:Distance:).
- #(2 168 171 genLongJumpIfTrue branch isBranchTrue isMapped "because of mustBeBoolean"
- v3:LongForward:Branch:Distance:).
- #(2 172 175 genLongJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
- v3:LongForward:Branch:Distance:).
-
- #(1 176 176 genSpecialSelectorArithmetic isMapped AddRR).
- #(1 177 177 genSpecialSelectorArithmetic isMapped SubRR).
- #(1 178 178 genSpecialSelectorComparison isMapped JumpLess).
- #(1 179 179 genSpecialSelectorComparison isMapped JumpGreater).
- #(1 180 180 genSpecialSelectorComparison isMapped JumpLessOrEqual).
- #(1 181 181 genSpecialSelectorComparison isMapped JumpGreaterOrEqual).
- #(1 182 182 genSpecialSelectorComparison isMapped JumpZero).
- #(1 183 183 genSpecialSelectorComparison isMapped JumpNonZero).
- #(1 184 189 genSpecialSelectorSend isMapped). " #* #/ #\\ #@ #bitShift: //"
- #(1 190 190 genSpecialSelectorArithmetic isMapped AndRR).
- #(1 191 191 genSpecialSelectorArithmetic isMapped OrRR).
- #(1 192 197 genSpecialSelectorSend isMapped). "#at: #at:put: #size #next #nextPut: #atEnd"
- #(1 198 198 genSpecialSelectorEqualsEquals needsFrameNever: notMapped -1). "not mapped because it is directly inlined (for now)"
- #(1 199 199 genSpecialSelectorClass needsFrameNever: notMapped 0). "not mapped because it is directly inlined (for now)"
- #(1 200 207 genSpecialSelectorSend isMapped). "#blockCopy: #value #value: #do: #new #new: #x #y"
- #(1 208 223 genSendLiteralSelector0ArgsBytecode isMapped).
- #(1 224 239 genSendLiteralSelector1ArgBytecode isMapped).
- #(1 240 255 genSendLiteralSelector2ArgsBytecode isMapped)}!
Item was changed:
----- Method: StackToRegisterMappingCogit class>>initializeBytecodeTableForNewspeakV3PlusClosures (in category 'class initialization') -----
initializeBytecodeTableForNewspeakV3PlusClosures
"StackToRegisterMappingCogit initializeBytecodeTableForNewspeakV3PlusClosures"
isPushNilFunction := #v3:Is:Push:Nil:.
pushNilSizeFunction := #v3PushNilSize:.
NSSendIsPCAnnotated := true. "IsNSSendCall used by PushImplicitReceiver"
self flag:
'Special selector send class must be inlined to agree with the interpreter, which
inlines class. If class is sent to e.g. a general instance of ProtoObject then unless
class is inlined there will be an MNU. It must be that the Cointerpreter and Cogit
have identical semantics. We get away with not hardwiring the other special
selectors either because in the Cointerpreter they are not inlined or because they
are inlined only to instances of classes for which there will always be a method.'.
self generatorTableFrom: #(
(1 0 15 genPushReceiverVariableBytecode needsFrameNever: 1)
+ (1 16 31 genPushTemporaryVariableBytecode needsFrameIfMod16GENumArgs: 1)
- (1 16 31 genPushTemporaryVariableBytecode)
(1 32 63 genPushLiteralConstantBytecode needsFrameNever: 1)
(1 64 95 genPushLiteralVariableBytecode needsFrameNever: 1)
(1 96 103 genStoreAndPopReceiverVariableBytecode needsFrameNever: -1) "N.B. not frameless if immutability"
(1 104 111 genStoreAndPopTemporaryVariableBytecode)
(1 112 112 genPushReceiverBytecode needsFrameNever: 1)
(1 113 113 genPushConstantTrueBytecode needsFrameNever: 1)
(1 114 114 genPushConstantFalseBytecode needsFrameNever: 1)
(1 115 115 genPushConstantNilBytecode needsFrameNever: 1)
(1 116 119 genPushQuickIntegerConstantBytecode needsFrameNever: 1)
"method returns in blocks need a frame because of nonlocalReturn:through:"
(1 120 120 genReturnReceiver return needsFrameIfInBlock: isMappedInBlock 0)
(1 121 121 genReturnTrue return needsFrameIfInBlock: isMappedInBlock 0)
(1 122 122 genReturnFalse return needsFrameIfInBlock: isMappedInBlock 0)
(1 123 123 genReturnNil return needsFrameIfInBlock: isMappedInBlock 0)
(1 124 124 genReturnTopFromMethod return needsFrameIfInBlock: isMappedInBlock -1)
(1 125 125 genReturnTopFromBlock return needsFrameNever: -1)
(3 126 126 genDynamicSuperSendBytecode isMapped) "Newspeak"
(2 127 127 genPushImplicitReceiverBytecode isMapped) "Newspeak"
(2 128 128 extendedPushBytecode needsFrameNever: 1)
(2 129 129 extendedStoreBytecode)
(2 130 130 extendedStoreAndPopBytecode)
(2 131 131 genExtendedSendBytecode isMapped)
(3 132 132 doubleExtendedDoAnythingBytecode isMapped)
(2 133 133 genExtendedSuperBytecode isMapped)
(2 134 134 genSecondExtendedSendBytecode isMapped)
(1 135 135 genPopStackBytecode needsFrameNever: -1)
(1 136 136 duplicateTopBytecode needsFrameNever: 1)
(1 137 137 genPushActiveContextBytecode)
(2 138 138 genPushNewArrayBytecode)
(2 139 139 genPushExplicitOuterSendReceiverBytecode isMapped) "Newspeak"
(3 140 140 genPushRemoteTempLongBytecode)
(3 141 141 genStoreRemoteTempLongBytecode)
(3 142 142 genStoreAndPopRemoteTempLongBytecode)
(4 143 143 genPushClosureCopyCopiedValuesBytecode block v3:Block:Code:Size:)
(1 144 151 genShortUnconditionalJump branch v3:ShortForward:Branch:Distance:)
(1 152 159 genShortJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
v3:ShortForward:Branch:Distance:)
(2 160 163 genLongUnconditionalBackwardJump branch isMapped "because of interrupt check"
v3:Long:Branch:Distance:)
(2 164 167 genLongUnconditionalForwardJump branch v3:Long:Branch:Distance:)
(2 168 171 genLongJumpIfTrue branch isBranchTrue isMapped "because of mustBeBoolean"
v3:LongForward:Branch:Distance:)
(2 172 175 genLongJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
v3:LongForward:Branch:Distance:)
(1 176 176 genSpecialSelectorArithmetic isMapped AddRR)
(1 177 177 genSpecialSelectorArithmetic isMapped SubRR)
(1 178 178 genSpecialSelectorComparison isMapped JumpLess)
(1 179 179 genSpecialSelectorComparison isMapped JumpGreater)
(1 180 180 genSpecialSelectorComparison isMapped JumpLessOrEqual)
(1 181 181 genSpecialSelectorComparison isMapped JumpGreaterOrEqual)
(1 182 182 genSpecialSelectorComparison isMapped JumpZero)
(1 183 183 genSpecialSelectorComparison isMapped JumpNonZero)
(1 184 189 genSpecialSelectorSend isMapped) " #* #/ #\\ #@ #bitShift: //"
(1 190 190 genSpecialSelectorArithmetic isMapped AndRR)
(1 191 191 genSpecialSelectorArithmetic isMapped OrRR)
(1 192 197 genSpecialSelectorSend isMapped) "#at: #at:put: #size #next #nextPut: #atEnd"
+ (1 198 198 genSpecialSelectorEqualsEquals needsFrameIfFollowsSend: notMapped -1) "not mapped because it is directly inlined (for now)"
+ (1 199 199 genSpecialSelectorClass needsFrameIfFollowsSend: notMapped 0) "not mapped because it is directly inlined (for now)"
- (1 198 198 genSpecialSelectorEqualsEquals needsFrameNever: notMapped -1) "not mapped because it is directly inlined (for now)"
- (1 199 199 genSpecialSelectorClass needsFrameNever: notMapped 0) "not mapped because it is directly inlined (for now)"
(1 200 207 genSpecialSelectorSend isMapped) "#blockCopy: #value #value: #do: #new #new: #x #y"
(1 208 223 genSendLiteralSelector0ArgsBytecode isMapped)
(1 224 239 genSendLiteralSelector1ArgBytecode isMapped)
(1 240 255 genSendLiteralSelector2ArgsBytecode isMapped))!
Item was changed:
----- Method: StackToRegisterMappingCogit class>>initializeBytecodeTableForNewspeakV4 (in category 'class initialization') -----
initializeBytecodeTableForNewspeakV4
"StackToRegisterMappingCogit initializeBytecodeTableForNewspeakV4"
isPushNilFunction := #v4:Is:Push:Nil:.
pushNilSizeFunction := #v4PushNilSize:.
NSSendIsPCAnnotated := false. "IsNSSendCall used by SendAbsentImplicit"
self flag:
'Special selector send class must be inlined to agree with the interpreter, which
inlines class. If class is sent to e.g. a general instance of ProtoObject then unless
class is inlined there will be an MNU. It must be that the Cointerpreter and Cogit
have identical semantics. We get away with not hardwiring the other special
selectors either because in the Cointerpreter they are not inlined or because they
are inlined only to instances of classes for which there will always be a method.'.
self generatorTableFrom: #(
"1 byte bytecodes"
(1 0 15 genPushReceiverVariableBytecode needsFrameNever: 1)
(1 16 31 genPushLiteralVariable16CasesBytecode needsFrameNever: 1)
(1 32 63 genPushLiteralConstantBytecode needsFrameNever: 1)
+ (1 64 75 genPushTemporaryVariableBytecode needsFrameIfMod16GENumArgs: 1)
- (1 64 75 genPushTemporaryVariableBytecode)
(1 76 76 genPushReceiverBytecode needsFrameNever: 1)
(1 77 77 genExtPushPseudoVariableOrOuterBytecode)
(1 78 78 genPushConstantZeroBytecode needsFrameNever: 1)
(1 79 79 genPushConstantOneBytecode needsFrameNever: 1)
(1 80 80 genSpecialSelectorArithmetic isMapped AddRR)
(1 81 81 genSpecialSelectorArithmetic isMapped SubRR)
(1 82 82 genSpecialSelectorComparison isMapped JumpLess)
(1 83 83 genSpecialSelectorComparison isMapped JumpGreater)
(1 84 84 genSpecialSelectorComparison isMapped JumpLessOrEqual)
(1 85 85 genSpecialSelectorComparison isMapped JumpGreaterOrEqual)
(1 86 86 genSpecialSelectorComparison isMapped JumpZero)
(1 87 87 genSpecialSelectorComparison isMapped JumpNonZero)
(1 88 93 genSpecialSelectorSend isMapped) " #* #/ #\\ #@ #bitShift: //"
(1 94 94 genSpecialSelectorArithmetic isMapped AndRR)
(1 95 95 genSpecialSelectorArithmetic isMapped OrRR)
(1 96 101 genSpecialSelectorSend isMapped) "#at: #at:put: #size #next #nextPut: #atEnd"
+ (1 102 102 genSpecialSelectorEqualsEquals needsFrameIfFollowsSend: notMapped -1) "not mapped because it is directly inlined (for now)"
+ (1 103 103 genSpecialSelectorClass needsFrameIfFollowsSend: notMapped 0) "not mapped because it is directly inlined (for now)"
- (1 102 102 genSpecialSelectorEqualsEquals needsFrameNever: notMapped -1) "not mapped because it is directly inlined (for now)"
- (1 103 103 genSpecialSelectorClass needsFrameNever: notMapped 0) "not mapped because it is directly inlined (for now)"
(1 104 111 genSpecialSelectorSend isMapped) "#blockCopy: #value #value: #do: #new #new: #x #y"
(1 112 127 genSendLiteralSelector0ArgsBytecode isMapped)
(1 128 143 genSendLiteralSelector1ArgBytecode isMapped)
(1 144 159 genSendLiteralSelector2ArgsBytecode isMapped)
(1 160 175 genSendAbsentImplicit0ArgsBytecode isMapped)
(1 176 183 genStoreAndPopReceiverVariableBytecode needsFrameNever: -1) "N.B. not frameless if immutability"
(1 184 191 genStoreAndPopTemporaryVariableBytecode)
(1 192 199 genShortUnconditionalJump branch v3:ShortForward:Branch:Distance:)
(1 200 207 genShortJumpIfTrue branch isBranchTrue isMapped "because of mustBeBoolean"
v3:ShortForward:Branch:Distance:)
(1 208 215 genShortJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
v3:ShortForward:Branch:Distance:)
(1 216 216 genReturnReceiver return needsFrameIfInBlock: isMappedInBlock 0)
(1 217 217 genReturnTopFromMethod return needsFrameIfInBlock: isMappedInBlock -1)
(1 218 218 genExtReturnTopFromBlock return needsFrameNever: -1)
(1 219 219 duplicateTopBytecode needsFrameNever: 1)
(1 220 220 genPopStackBytecode needsFrameNever: -1)
(1 221 221 genExtNopBytecode needsFrameNever: 0)
(1 222 223 unknownBytecode)
"2 byte bytecodes"
(2 224 224 extABytecode extension needsFrameNever: 0)
(2 225 225 extBBytecode extension needsFrameNever: 0)
(2 226 226 genExtPushReceiverVariableBytecode)
(2 227 227 genExtPushLiteralVariableBytecode needsFrameNever: 1)
(2 228 228 genExtPushLiteralBytecode needsFrameNever: 1)
(2 229 229 genExtPushIntegerBytecode needsFrameNever: 1)
(2 230 230 genLongPushTemporaryVariableBytecode)
(2 231 231 genPushNewArrayBytecode)
(2 232 232 genExtStoreReceiverVariableBytecode)
(2 233 233 genExtStoreLiteralVariableBytecode)
(2 234 234 genLongStoreTemporaryVariableBytecode)
(2 235 235 genExtStoreAndPopReceiverVariableBytecode)
(2 236 236 genExtStoreAndPopLiteralVariableBytecode)
(2 237 237 genLongStoreAndPopTemporaryVariableBytecode)
(2 238 238 genExtSendBytecode isMapped)
(2 239 239 genExtSendSuperBytecode isMapped)
(2 240 240 genExtSendAbsentImplicitBytecode isMapped)
(2 241 241 genExtSendAbsentDynamicSuperBytecode isMapped)
(2 242 242 genExtUnconditionalJump branch isMapped "because of interrupt check" v4:Long:Branch:Distance:)
(2 243 243 genExtJumpIfTrue branch isBranchTrue isMapped "because of mustBeBoolean" v4:Long:Branch:Distance:)
(2 244 244 genExtJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean" v4:Long:Branch:Distance:)
(2 245 248 unknownBytecode)
"3 byte bytecodes"
(3 249 249 callPrimitiveBytecode)
(3 250 250 genPushRemoteTempLongBytecode)
(3 251 251 genStoreRemoteTempLongBytecode)
(3 252 252 genStoreAndPopRemoteTempLongBytecode)
(3 253 253 genExtPushClosureBytecode block v4:Block:Code:Size:)
(3 254 255 unknownBytecode))!
Item was changed:
----- Method: StackToRegisterMappingCogit class>>initializeBytecodeTableForSqueakV3PlusClosures (in category 'class initialization') -----
initializeBytecodeTableForSqueakV3PlusClosures
"StackToRegisterMappingCogit initializeBytecodeTableForSqueakV3PlusClosures"
isPushNilFunction := #v3:Is:Push:Nil:.
pushNilSizeFunction := #v3PushNilSize:.
self flag:
'Special selector send class must be inlined to agree with the interpreter, which
inlines class. If class is sent to e.g. a general instance of ProtoObject then unless
class is inlined there will be an MNU. It must be that the Cointerpreter and Cogit
have identical semantics. We get away with not hardwiring the other special
selectors either because in the Cointerpreter they are not inlined or because they
are inlined only to instances of classes for which there will always be a method.'.
self generatorTableFrom: #(
(1 0 15 genPushReceiverVariableBytecode needsFrameNever: 1)
+ (1 16 31 genPushTemporaryVariableBytecode needsFrameIfMod16GENumArgs: 1)
- (1 16 31 genPushTemporaryVariableBytecode)
(1 32 63 genPushLiteralConstantBytecode needsFrameNever: 1)
(1 64 95 genPushLiteralVariableBytecode needsFrameNever: 1)
(1 96 103 genStoreAndPopReceiverVariableBytecode needsFrameNever: -1) "N.B. not frameless if immutability"
(1 104 111 genStoreAndPopTemporaryVariableBytecode)
(1 112 112 genPushReceiverBytecode needsFrameNever: 1)
(1 113 113 genPushConstantTrueBytecode needsFrameNever: 1)
(1 114 114 genPushConstantFalseBytecode needsFrameNever: 1)
(1 115 115 genPushConstantNilBytecode needsFrameNever: 1)
(1 116 119 genPushQuickIntegerConstantBytecode needsFrameNever: 1)
"method returns in blocks need a frame because of nonlocalReturn:through:"
(1 120 120 genReturnReceiver return needsFrameIfInBlock: isMappedInBlock 0)
(1 121 121 genReturnTrue return needsFrameIfInBlock: isMappedInBlock 0)
(1 122 122 genReturnFalse return needsFrameIfInBlock: isMappedInBlock 0)
(1 123 123 genReturnNil return needsFrameIfInBlock: isMappedInBlock 0)
(1 124 124 genReturnTopFromMethod return needsFrameIfInBlock: isMappedInBlock -1)
(1 125 125 genReturnTopFromBlock return needsFrameNever: -1)
(1 126 127 unknownBytecode)
(2 128 128 extendedPushBytecode needsFrameNever: 1)
(2 129 129 extendedStoreBytecode)
(2 130 130 extendedStoreAndPopBytecode)
(2 131 131 genExtendedSendBytecode isMapped)
(3 132 132 doubleExtendedDoAnythingBytecode isMapped)
(2 133 133 genExtendedSuperBytecode isMapped)
(2 134 134 genSecondExtendedSendBytecode isMapped)
(1 135 135 genPopStackBytecode needsFrameNever: -1)
(1 136 136 duplicateTopBytecode needsFrameNever: 1)
(1 137 137 genPushActiveContextBytecode)
(2 138 138 genPushNewArrayBytecode)
(1 139 139 unknownBytecode)
(3 140 140 genPushRemoteTempLongBytecode)
(3 141 141 genStoreRemoteTempLongBytecode)
(3 142 142 genStoreAndPopRemoteTempLongBytecode)
(4 143 143 genPushClosureCopyCopiedValuesBytecode block v3:Block:Code:Size:)
(1 144 151 genShortUnconditionalJump branch v3:ShortForward:Branch:Distance:)
(1 152 159 genShortJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
v3:ShortForward:Branch:Distance:)
(2 160 163 genLongUnconditionalBackwardJump branch isMapped "because of interrupt check"
v3:Long:Branch:Distance:)
(2 164 167 genLongUnconditionalForwardJump branch v3:Long:Branch:Distance:)
(2 168 171 genLongJumpIfTrue branch isBranchTrue isMapped "because of mustBeBoolean"
v3:LongForward:Branch:Distance:)
(2 172 175 genLongJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
v3:LongForward:Branch:Distance:)
(1 176 176 genSpecialSelectorArithmetic isMapped AddRR)
(1 177 177 genSpecialSelectorArithmetic isMapped SubRR)
(1 178 178 genSpecialSelectorComparison isMapped JumpLess)
(1 179 179 genSpecialSelectorComparison isMapped JumpGreater)
(1 180 180 genSpecialSelectorComparison isMapped JumpLessOrEqual)
(1 181 181 genSpecialSelectorComparison isMapped JumpGreaterOrEqual)
(1 182 182 genSpecialSelectorComparison isMapped JumpZero)
(1 183 183 genSpecialSelectorComparison isMapped JumpNonZero)
(1 184 189 genSpecialSelectorSend isMapped) " #* #/ #\\ #@ #bitShift: //"
(1 190 190 genSpecialSelectorArithmetic isMapped AndRR)
(1 191 191 genSpecialSelectorArithmetic isMapped OrRR)
(1 192 197 genSpecialSelectorSend isMapped) "#at: #at:put: #size #next #nextPut: #atEnd"
+ (1 198 198 genSpecialSelectorEqualsEquals needsFrameIfFollowsSend: notMapped -1) "not mapped because it is directly inlined (for now)"
+ (1 199 199 genSpecialSelectorClass needsFrameIfFollowsSend: notMapped 0) "not mapped because it is directly inlined (for now)"
- (1 198 198 genSpecialSelectorEqualsEquals needsFrameNever: notMapped -1) "not mapped because it is directly inlined (for now)"
- (1 199 199 genSpecialSelectorClass needsFrameNever: notMapped 0) "not mapped because it is directly inlined (for now)"
(1 200 207 genSpecialSelectorSend isMapped) "#blockCopy: #value #value: #do: #new #new: #x #y"
(1 208 223 genSendLiteralSelector0ArgsBytecode isMapped)
(1 224 239 genSendLiteralSelector1ArgBytecode isMapped)
(1 240 255 genSendLiteralSelector2ArgsBytecode isMapped))!
Item was removed:
- ----- Method: StackToRegisterMappingCogit class>>newInitializeBytecodeTableForClosureV3 (in category 'class initialization') -----
- newInitializeBytecodeTableForClosureV3
- "StackToRegisterMappingCogit newInitializeBytecodeTableForClosureV3"
-
- isPushNilFunction := #v3:Is:Push:Nil:.
- pushNilSizeFunction := #v3PushNilSize:.
- self flag:
- 'Special selector send class must be inlined to agree with the interpreter, which
- inlines class. If class is sent to e.g. a general instance of ProtoObject then unless
- class is inlined there will be an MNU. It must be that the Cointerpreter and Cogit
- have identical semantics. We get away with not hardwiring the other special
- selectors either because in the Cointerpreter they are not inlined or because they
- are inlined only to instances of classes for which there will always be a method.'.
- self generatorTableFrom: {
- #(1 0 15 genPushReceiverVariableBytecode needsFrameNever: 1).
- #(1 16 31 genPushTemporaryVariableBytecode needsFrameIfMod16GENumArgs: 1).
- #(1 32 63 genPushLiteralConstantBytecode needsFrameNever: 1).
- #(1 64 95 genPushLiteralVariableBytecode needsFrameNever: 1).
- #(1 96 103 genStoreAndPopReceiverVariableBytecode needsFrameNever: -1). "N.B. not frameless if immutability"
- #(1 104 111 genStoreAndPopTemporaryVariableBytecode).
- #(1 112 112 genPushReceiverBytecode needsFrameNever: 1).
- #(1 113 113 genPushConstantTrueBytecode needsFrameNever: 1).
- #(1 114 114 genPushConstantFalseBytecode needsFrameNever: 1).
- #(1 115 115 genPushConstantNilBytecode needsFrameNever: 1).
- #(1 116 119 genPushQuickIntegerConstantBytecode needsFrameNever: 1).
- "method returns in blocks need a frame because of nonlocalReturn:through:"
- #(1 120 120 genReturnReceiver return needsFrameIfInBlock: isMappedInBlock 0).
- #(1 121 121 genReturnTrue return needsFrameIfInBlock: isMappedInBlock 0).
- #(1 122 122 genReturnFalse return needsFrameIfInBlock: isMappedInBlock 0).
- #(1 123 123 genReturnNil return needsFrameIfInBlock: isMappedInBlock 0).
- #(1 124 124 genReturnTopFromMethod return needsFrameIfInBlock: isMappedInBlock -1).
- #(1 125 125 genReturnTopFromBlock return needsFrameNever: -1).
-
- NewspeakVM
- ifTrue: [#(3 126 126 genDynamicSuperSendBytecode isMapped)]
- ifFalse: [#(1 126 126 unknownBytecode)].
- NewspeakVM
- ifTrue: [#(2 127 127 genPushImplicitReceiverBytecode isMapped)]
- ifFalse: [#(1 127 127 unknownBytecode)].
-
- #(2 128 128 extendedPushBytecode needsFrameNever: 1).
- #(2 129 129 extendedStoreBytecode).
- #(2 130 130 extendedStoreAndPopBytecode).
- #(2 131 131 genExtendedSendBytecode isMapped).
- #(3 132 132 doubleExtendedDoAnythingBytecode isMapped).
- #(2 133 133 genExtendedSuperBytecode isMapped).
- #(2 134 134 genSecondExtendedSendBytecode isMapped).
- #(1 135 135 genPopStackBytecode needsFrameNever: -1).
- #(1 136 136 duplicateTopBytecode needsFrameNever: 1).
-
- #(1 137 137 genPushActiveContextBytecode).
- #(2 138 138 genPushNewArrayBytecode).
- NewspeakVM
- ifTrue: [#(2 139 139 genPushExplicitOuterSendReceiverBytecode isMapped)]
- ifFalse: [#(1 139 139 unknownBytecode)].
- #(3 140 140 genPushRemoteTempLongBytecode).
- #(3 141 141 genStoreRemoteTempLongBytecode).
- #(3 142 142 genStoreAndPopRemoteTempLongBytecode).
- #(4 143 143 genPushClosureCopyCopiedValuesBytecode block v3:Block:Code:Size:).
-
- #(1 144 151 genShortUnconditionalJump branch v3:ShortForward:Branch:Distance:).
- #(1 152 159 genShortJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
- v3:ShortForward:Branch:Distance:).
- #(2 160 163 genLongUnconditionalBackwardJump branch isMapped "because of interrupt check"
- v3:Long:Branch:Distance:).
- #(2 164 167 genLongUnconditionalForwardJump branch v3:Long:Branch:Distance:).
- #(2 168 171 genLongJumpIfTrue branch isBranchTrue isMapped "because of mustBeBoolean"
- v3:LongForward:Branch:Distance:).
- #(2 172 175 genLongJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
- v3:LongForward:Branch:Distance:).
-
- #(1 176 176 genSpecialSelectorArithmetic isMapped AddRR).
- #(1 177 177 genSpecialSelectorArithmetic isMapped SubRR).
- #(1 178 178 genSpecialSelectorComparison isMapped JumpLess).
- #(1 179 179 genSpecialSelectorComparison isMapped JumpGreater).
- #(1 180 180 genSpecialSelectorComparison isMapped JumpLessOrEqual).
- #(1 181 181 genSpecialSelectorComparison isMapped JumpGreaterOrEqual).
- #(1 182 182 genSpecialSelectorComparison isMapped JumpZero).
- #(1 183 183 genSpecialSelectorComparison isMapped JumpNonZero).
- #(1 184 189 genSpecialSelectorSend isMapped). " #* #/ #\\ #@ #bitShift: //"
- #(1 190 190 genSpecialSelectorArithmetic isMapped AndRR).
- #(1 191 191 genSpecialSelectorArithmetic isMapped OrRR).
- #(1 192 197 genSpecialSelectorSend isMapped). "#at: #at:put: #size #next #nextPut: #atEnd"
- #(1 198 198 genSpecialSelectorEqualsEquals needsFrameNever: notMapped -1). "not mapped because it is directly inlined (for now)"
- #(1 199 199 genSpecialSelectorClass needsFrameNever: notMapped 0). "not mapped because it is directly inlined (for now)"
- #(1 200 207 genSpecialSelectorSend isMapped). "#blockCopy: #value #value: #do: #new #new: #x #y"
- #(1 208 223 genSendLiteralSelector0ArgsBytecode isMapped).
- #(1 224 239 genSendLiteralSelector1ArgBytecode isMapped).
- #(1 240 255 genSendLiteralSelector2ArgsBytecode isMapped)}!
Item was removed:
- ----- Method: StackToRegisterMappingCogit class>>newInitializeBytecodeTableForNewspeakV3PlusClosures (in category 'class initialization') -----
- newInitializeBytecodeTableForNewspeakV3PlusClosures
- "StackToRegisterMappingCogit newInitializeBytecodeTableForNewspeakV3PlusClosures"
-
- isPushNilFunction := #v3:Is:Push:Nil:.
- pushNilSizeFunction := #v3PushNilSize:.
- NSSendIsPCAnnotated := true. "IsNSSendCall used by PushImplicitReceiver"
- self flag:
- 'Special selector send class must be inlined to agree with the interpreter, which
- inlines class. If class is sent to e.g. a general instance of ProtoObject then unless
- class is inlined there will be an MNU. It must be that the Cointerpreter and Cogit
- have identical semantics. We get away with not hardwiring the other special
- selectors either because in the Cointerpreter they are not inlined or because they
- are inlined only to instances of classes for which there will always be a method.'.
- self generatorTableFrom: #(
- (1 0 15 genPushReceiverVariableBytecode needsFrameNever: 1)
- (1 16 31 genPushTemporaryVariableBytecode needsFrameIfMod16GENumArgs: 1)
- (1 32 63 genPushLiteralConstantBytecode needsFrameNever: 1)
- (1 64 95 genPushLiteralVariableBytecode needsFrameNever: 1)
- (1 96 103 genStoreAndPopReceiverVariableBytecode needsFrameNever: -1) "N.B. not frameless if immutability"
- (1 104 111 genStoreAndPopTemporaryVariableBytecode)
- (1 112 112 genPushReceiverBytecode needsFrameNever: 1)
- (1 113 113 genPushConstantTrueBytecode needsFrameNever: 1)
- (1 114 114 genPushConstantFalseBytecode needsFrameNever: 1)
- (1 115 115 genPushConstantNilBytecode needsFrameNever: 1)
- (1 116 119 genPushQuickIntegerConstantBytecode needsFrameNever: 1)
- "method returns in blocks need a frame because of nonlocalReturn:through:"
- (1 120 120 genReturnReceiver return needsFrameIfInBlock: isMappedInBlock 0)
- (1 121 121 genReturnTrue return needsFrameIfInBlock: isMappedInBlock 0)
- (1 122 122 genReturnFalse return needsFrameIfInBlock: isMappedInBlock 0)
- (1 123 123 genReturnNil return needsFrameIfInBlock: isMappedInBlock 0)
- (1 124 124 genReturnTopFromMethod return needsFrameIfInBlock: isMappedInBlock -1)
- (1 125 125 genReturnTopFromBlock return needsFrameNever: -1)
-
- (3 126 126 genDynamicSuperSendBytecode isMapped) "Newspeak"
- (2 127 127 genPushImplicitReceiverBytecode isMapped) "Newspeak"
-
- (2 128 128 extendedPushBytecode needsFrameNever: 1)
- (2 129 129 extendedStoreBytecode)
- (2 130 130 extendedStoreAndPopBytecode)
- (2 131 131 genExtendedSendBytecode isMapped)
- (3 132 132 doubleExtendedDoAnythingBytecode isMapped)
- (2 133 133 genExtendedSuperBytecode isMapped)
- (2 134 134 genSecondExtendedSendBytecode isMapped)
- (1 135 135 genPopStackBytecode needsFrameNever: -1)
- (1 136 136 duplicateTopBytecode needsFrameNever: 1)
-
- (1 137 137 genPushActiveContextBytecode)
- (2 138 138 genPushNewArrayBytecode)
-
- (2 139 139 genPushExplicitOuterSendReceiverBytecode isMapped) "Newspeak"
-
- (3 140 140 genPushRemoteTempLongBytecode)
- (3 141 141 genStoreRemoteTempLongBytecode)
- (3 142 142 genStoreAndPopRemoteTempLongBytecode)
- (4 143 143 genPushClosureCopyCopiedValuesBytecode block v3:Block:Code:Size:)
-
- (1 144 151 genShortUnconditionalJump branch v3:ShortForward:Branch:Distance:)
- (1 152 159 genShortJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
- v3:ShortForward:Branch:Distance:)
- (2 160 163 genLongUnconditionalBackwardJump branch isMapped "because of interrupt check"
- v3:Long:Branch:Distance:)
- (2 164 167 genLongUnconditionalForwardJump branch v3:Long:Branch:Distance:)
- (2 168 171 genLongJumpIfTrue branch isBranchTrue isMapped "because of mustBeBoolean"
- v3:LongForward:Branch:Distance:)
- (2 172 175 genLongJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
- v3:LongForward:Branch:Distance:)
-
- (1 176 176 genSpecialSelectorArithmetic isMapped AddRR)
- (1 177 177 genSpecialSelectorArithmetic isMapped SubRR)
- (1 178 178 genSpecialSelectorComparison isMapped JumpLess)
- (1 179 179 genSpecialSelectorComparison isMapped JumpGreater)
- (1 180 180 genSpecialSelectorComparison isMapped JumpLessOrEqual)
- (1 181 181 genSpecialSelectorComparison isMapped JumpGreaterOrEqual)
- (1 182 182 genSpecialSelectorComparison isMapped JumpZero)
- (1 183 183 genSpecialSelectorComparison isMapped JumpNonZero)
- (1 184 189 genSpecialSelectorSend isMapped) " #* #/ #\\ #@ #bitShift: //"
- (1 190 190 genSpecialSelectorArithmetic isMapped AndRR)
- (1 191 191 genSpecialSelectorArithmetic isMapped OrRR)
- (1 192 197 genSpecialSelectorSend isMapped) "#at: #at:put: #size #next #nextPut: #atEnd"
- (1 198 198 genSpecialSelectorEqualsEquals needsFrameNever: notMapped -1) "not mapped because it is directly inlined (for now)"
- (1 199 199 genSpecialSelectorClass needsFrameNever: notMapped 0) "not mapped because it is directly inlined (for now)"
- (1 200 207 genSpecialSelectorSend isMapped) "#blockCopy: #value #value: #do: #new #new: #x #y"
- (1 208 223 genSendLiteralSelector0ArgsBytecode isMapped)
- (1 224 239 genSendLiteralSelector1ArgBytecode isMapped)
- (1 240 255 genSendLiteralSelector2ArgsBytecode isMapped))!
Item was removed:
- ----- Method: StackToRegisterMappingCogit class>>newInitializeBytecodeTableForNewspeakV3PlusClosuresNewspeakV4Hybrid (in category 'class initialization') -----
- newInitializeBytecodeTableForNewspeakV3PlusClosuresNewspeakV4Hybrid
- "StackToRegisterMappingCogit newInitializeBytecodeTableForNewspeakV3PlusClosuresNewspeakV4Hybrid"
-
- super newInitializeBytecodeTableForNewspeakV3PlusClosuresNewspeakV4Hybrid.
- isPushNilFunction := #v3or4:Is:Push:Nil:.
- pushNilSizeFunction := #v3or4PushNilSize:!
Item was removed:
- ----- Method: StackToRegisterMappingCogit class>>newInitializeBytecodeTableForNewspeakV4 (in category 'class initialization') -----
- newInitializeBytecodeTableForNewspeakV4
- "StackToRegisterMappingCogit newInitializeBytecodeTableForNewspeakV4"
-
- isPushNilFunction := #v4:Is:Push:Nil:.
- pushNilSizeFunction := #v4PushNilSize:.
- NSSendIsPCAnnotated := false. "IsNSSendCall used by SendAbsentImplicit"
- self flag:
- 'Special selector send class must be inlined to agree with the interpreter, which
- inlines class. If class is sent to e.g. a general instance of ProtoObject then unless
- class is inlined there will be an MNU. It must be that the Cointerpreter and Cogit
- have identical semantics. We get away with not hardwiring the other special
- selectors either because in the Cointerpreter they are not inlined or because they
- are inlined only to instances of classes for which there will always be a method.'.
- self generatorTableFrom: #(
- "1 byte bytecodes"
- (1 0 15 genPushReceiverVariableBytecode needsFrameNever: 1)
- (1 16 31 genPushLiteralVariable16CasesBytecode needsFrameNever: 1)
- (1 32 63 genPushLiteralConstantBytecode needsFrameNever: 1)
- (1 64 75 genPushTemporaryVariableBytecode needsFrameIfMod16GENumArgs: 1)
- (1 76 76 genPushReceiverBytecode needsFrameNever: 1)
- (1 77 77 genExtPushPseudoVariableOrOuterBytecode)
- (1 78 78 genPushConstantZeroBytecode needsFrameNever: 1)
- (1 79 79 genPushConstantOneBytecode needsFrameNever: 1)
-
- (1 80 80 genSpecialSelectorArithmetic isMapped AddRR)
- (1 81 81 genSpecialSelectorArithmetic isMapped SubRR)
- (1 82 82 genSpecialSelectorComparison isMapped JumpLess)
- (1 83 83 genSpecialSelectorComparison isMapped JumpGreater)
- (1 84 84 genSpecialSelectorComparison isMapped JumpLessOrEqual)
- (1 85 85 genSpecialSelectorComparison isMapped JumpGreaterOrEqual)
- (1 86 86 genSpecialSelectorComparison isMapped JumpZero)
- (1 87 87 genSpecialSelectorComparison isMapped JumpNonZero)
- (1 88 93 genSpecialSelectorSend isMapped) " #* #/ #\\ #@ #bitShift: //"
- (1 94 94 genSpecialSelectorArithmetic isMapped AndRR)
- (1 95 95 genSpecialSelectorArithmetic isMapped OrRR)
- (1 96 101 genSpecialSelectorSend isMapped) "#at: #at:put: #size #next #nextPut: #atEnd"
- (1 102 102 genSpecialSelectorEqualsEquals needsFrameNever: notMapped -1) "not mapped because it is directly inlined (for now)"
- (1 103 103 genSpecialSelectorClass needsFrameNever: notMapped 0) "not mapped because it is directly inlined (for now)"
- (1 104 111 genSpecialSelectorSend isMapped) "#blockCopy: #value #value: #do: #new #new: #x #y"
-
- (1 112 127 genSendLiteralSelector0ArgsBytecode isMapped)
- (1 128 143 genSendLiteralSelector1ArgBytecode isMapped)
- (1 144 159 genSendLiteralSelector2ArgsBytecode isMapped)
- (1 160 175 genSendAbsentImplicit0ArgsBytecode isMapped)
-
- (1 176 183 genStoreAndPopReceiverVariableBytecode needsFrameNever: -1) "N.B. not frameless if immutability"
- (1 184 191 genStoreAndPopTemporaryVariableBytecode)
-
- (1 192 199 genShortUnconditionalJump branch v3:ShortForward:Branch:Distance:)
- (1 200 207 genShortJumpIfTrue branch isBranchTrue isMapped "because of mustBeBoolean"
- v3:ShortForward:Branch:Distance:)
- (1 208 215 genShortJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
- v3:ShortForward:Branch:Distance:)
-
- (1 216 216 genReturnReceiver return needsFrameIfInBlock: isMappedInBlock 0)
- (1 217 217 genReturnTopFromMethod return needsFrameIfInBlock: isMappedInBlock -1)
- (1 218 218 genExtReturnTopFromBlock return needsFrameNever: -1)
-
- (1 219 219 duplicateTopBytecode needsFrameNever: 1)
- (1 220 220 genPopStackBytecode needsFrameNever: -1)
- (1 221 221 genExtNopBytecode needsFrameNever: 0)
- (1 222 223 unknownBytecode)
-
- "2 byte bytecodes"
- (2 224 224 extABytecode extension needsFrameNever: 0)
- (2 225 225 extBBytecode extension needsFrameNever: 0)
- (2 226 226 genExtPushReceiverVariableBytecode)
- (2 227 227 genExtPushLiteralVariableBytecode needsFrameNever: 1)
- (2 228 228 genExtPushLiteralBytecode needsFrameNever: 1)
- (2 229 229 genExtPushIntegerBytecode needsFrameNever: 1)
- (2 230 230 genLongPushTemporaryVariableBytecode)
- (2 231 231 genPushNewArrayBytecode)
- (2 232 232 genExtStoreReceiverVariableBytecode)
- (2 233 233 genExtStoreLiteralVariableBytecode)
- (2 234 234 genLongStoreTemporaryVariableBytecode)
- (2 235 235 genExtStoreAndPopReceiverVariableBytecode)
- (2 236 236 genExtStoreAndPopLiteralVariableBytecode)
- (2 237 237 genLongStoreAndPopTemporaryVariableBytecode)
-
- (2 238 238 genExtSendBytecode isMapped)
- (2 239 239 genExtSendSuperBytecode isMapped)
- (2 240 240 genExtSendAbsentImplicitBytecode isMapped)
- (2 241 241 genExtSendAbsentDynamicSuperBytecode isMapped)
-
- (2 242 242 genExtUnconditionalJump branch isMapped "because of interrupt check" v4:Long:Branch:Distance:)
- (2 243 243 genExtJumpIfTrue branch isBranchTrue isMapped "because of mustBeBoolean" v4:Long:Branch:Distance:)
- (2 244 244 genExtJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean" v4:Long:Branch:Distance:)
-
- (2 245 248 unknownBytecode)
-
- "3 byte bytecodes"
- (3 249 249 callPrimitiveBytecode)
- (3 250 250 genPushRemoteTempLongBytecode)
- (3 251 251 genStoreRemoteTempLongBytecode)
- (3 252 252 genStoreAndPopRemoteTempLongBytecode)
- (3 253 253 genExtPushClosureBytecode block v4:Block:Code:Size:)
-
- (3 254 255 unknownBytecode))!
Item was removed:
- ----- Method: StackToRegisterMappingCogit class>>newInitializeBytecodeTableForSqueakV3PlusClosures (in category 'class initialization') -----
- newInitializeBytecodeTableForSqueakV3PlusClosures
- "StackToRegisterMappingCogit newInitializeBytecodeTableForSqueakV3PlusClosures"
-
- isPushNilFunction := #v3:Is:Push:Nil:.
- pushNilSizeFunction := #v3PushNilSize:.
- self flag:
- 'Special selector send class must be inlined to agree with the interpreter, which
- inlines class. If class is sent to e.g. a general instance of ProtoObject then unless
- class is inlined there will be an MNU. It must be that the Cointerpreter and Cogit
- have identical semantics. We get away with not hardwiring the other special
- selectors either because in the Cointerpreter they are not inlined or because they
- are inlined only to instances of classes for which there will always be a method.'.
- self generatorTableFrom: #(
- (1 0 15 genPushReceiverVariableBytecode needsFrameNever: 1)
- (1 16 31 genPushTemporaryVariableBytecode needsFrameIfMod16GENumArgs: 1)
- (1 32 63 genPushLiteralConstantBytecode needsFrameNever: 1)
- (1 64 95 genPushLiteralVariableBytecode needsFrameNever: 1)
- (1 96 103 genStoreAndPopReceiverVariableBytecode needsFrameNever: -1) "N.B. not frameless if immutability"
- (1 104 111 genStoreAndPopTemporaryVariableBytecode)
- (1 112 112 genPushReceiverBytecode needsFrameNever: 1)
- (1 113 113 genPushConstantTrueBytecode needsFrameNever: 1)
- (1 114 114 genPushConstantFalseBytecode needsFrameNever: 1)
- (1 115 115 genPushConstantNilBytecode needsFrameNever: 1)
- (1 116 119 genPushQuickIntegerConstantBytecode needsFrameNever: 1)
- "method returns in blocks need a frame because of nonlocalReturn:through:"
- (1 120 120 genReturnReceiver return needsFrameIfInBlock: isMappedInBlock 0)
- (1 121 121 genReturnTrue return needsFrameIfInBlock: isMappedInBlock 0)
- (1 122 122 genReturnFalse return needsFrameIfInBlock: isMappedInBlock 0)
- (1 123 123 genReturnNil return needsFrameIfInBlock: isMappedInBlock 0)
- (1 124 124 genReturnTopFromMethod return needsFrameIfInBlock: isMappedInBlock -1)
- (1 125 125 genReturnTopFromBlock return needsFrameNever: -1)
-
- (1 126 127 unknownBytecode)
-
- (2 128 128 extendedPushBytecode needsFrameNever: 1)
- (2 129 129 extendedStoreBytecode)
- (2 130 130 extendedStoreAndPopBytecode)
- (2 131 131 genExtendedSendBytecode isMapped)
- (3 132 132 doubleExtendedDoAnythingBytecode isMapped)
- (2 133 133 genExtendedSuperBytecode isMapped)
- (2 134 134 genSecondExtendedSendBytecode isMapped)
- (1 135 135 genPopStackBytecode needsFrameNever: -1)
- (1 136 136 duplicateTopBytecode needsFrameNever: 1)
-
- (1 137 137 genPushActiveContextBytecode)
- (2 138 138 genPushNewArrayBytecode)
-
- (1 139 139 unknownBytecode)
-
- (3 140 140 genPushRemoteTempLongBytecode)
- (3 141 141 genStoreRemoteTempLongBytecode)
- (3 142 142 genStoreAndPopRemoteTempLongBytecode)
- (4 143 143 genPushClosureCopyCopiedValuesBytecode block v3:Block:Code:Size:)
-
- (1 144 151 genShortUnconditionalJump branch v3:ShortForward:Branch:Distance:)
- (1 152 159 genShortJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
- v3:ShortForward:Branch:Distance:)
- (2 160 163 genLongUnconditionalBackwardJump branch isMapped "because of interrupt check"
- v3:Long:Branch:Distance:)
- (2 164 167 genLongUnconditionalForwardJump branch v3:Long:Branch:Distance:)
- (2 168 171 genLongJumpIfTrue branch isBranchTrue isMapped "because of mustBeBoolean"
- v3:LongForward:Branch:Distance:)
- (2 172 175 genLongJumpIfFalse branch isBranchFalse isMapped "because of mustBeBoolean"
- v3:LongForward:Branch:Distance:)
-
- (1 176 176 genSpecialSelectorArithmetic isMapped AddRR)
- (1 177 177 genSpecialSelectorArithmetic isMapped SubRR)
- (1 178 178 genSpecialSelectorComparison isMapped JumpLess)
- (1 179 179 genSpecialSelectorComparison isMapped JumpGreater)
- (1 180 180 genSpecialSelectorComparison isMapped JumpLessOrEqual)
- (1 181 181 genSpecialSelectorComparison isMapped JumpGreaterOrEqual)
- (1 182 182 genSpecialSelectorComparison isMapped JumpZero)
- (1 183 183 genSpecialSelectorComparison isMapped JumpNonZero)
- (1 184 189 genSpecialSelectorSend isMapped) " #* #/ #\\ #@ #bitShift: //"
- (1 190 190 genSpecialSelectorArithmetic isMapped AndRR)
- (1 191 191 genSpecialSelectorArithmetic isMapped OrRR)
- (1 192 197 genSpecialSelectorSend isMapped) "#at: #at:put: #size #next #nextPut: #atEnd"
- (1 198 198 genSpecialSelectorEqualsEquals needsFrameNever: notMapped -1) "not mapped because it is directly inlined (for now)"
- (1 199 199 genSpecialSelectorClass needsFrameNever: notMapped 0) "not mapped because it is directly inlined (for now)"
- (1 200 207 genSpecialSelectorSend isMapped) "#blockCopy: #value #value: #do: #new #new: #x #y"
- (1 208 223 genSendLiteralSelector0ArgsBytecode isMapped)
- (1 224 239 genSendLiteralSelector1ArgBytecode isMapped)
- (1 240 255 genSendLiteralSelector2ArgsBytecode isMapped))!
Item was added:
+ ----- Method: StackToRegisterMappingCogit>>needsFrameIfFollowsSend: (in category 'compile abstract instructions') -----
+ needsFrameIfFollowsSend: isInBlock
+ "As of August 2013, the code generator can't deal with spills in frameless methods (the
+ issue is to do with the stack offset to get at an argument, which is changed when there's a spill).
+ The only context in a spill is needed in a frameless method that I can think of is sends
+ following sends as in e.g. TextColor>>#dominates: other ^other class == self class.
+ Only need to check for the frameless sends since all other sends will force a frame."
+
+ self assert: (prevBCDescriptor notNil and: [prevBCDescriptor needsFrameFunction notNil]).
+ ^prevBCDescriptor generator == #genSpecialSelectorEqualsEquals
+ or: [prevBCDescriptor generator == #genSpecialSelectorClass]!
Item was changed:
----- Method: StackToRegisterMappingCogit>>scanBlock: (in category 'compile abstract instructions') -----
scanBlock: blockStart
"Scan the block to determine if the block needs a frame or not"
| descriptor pc end stackDelta nExts pushingNils |
<var: #blockStart type: #'BlockStart *'>
<var: #descriptor type: #'BytecodeDescriptor *'>
needsFrame := false.
+ prevBCDescriptor := nil.
methodOrBlockNumArgs := blockStart numArgs.
nExts := 0.
pc := blockStart startpc.
end := blockStart startpc + blockStart span.
stackDelta := 0.
pushingNils := true.
[pc < end] whileTrue:
[byte0 := (objectMemory fetchByte: pc ofObject: methodObj) + bytecodeSetOffset.
descriptor := self generatorAt: byte0.
needsFrame ifFalse:
[(descriptor needsFrameFunction isNil
or: [self perform: descriptor needsFrameFunction with: true])
ifTrue: [needsFrame := true]
ifFalse: [stackDelta := stackDelta + descriptor stackDelta]].
(pushingNils
and: [descriptor isExtension not]) ifTrue:
["Count the initial number of pushed nils acting as temp initializers. We can't tell
whether an initial pushNil is an operand reference or a temp initializer, except
when the pushNil is a jump target (has a fixup) in which case it is definitely an
operand reference. So rarely we may end up over-estimating. We will correct
by checking the stack depth at the end of the block in compileBlockBodies."
(pushingNils := (self isPushNil: descriptor pc: pc nExts: nExts method: methodObj)
and: [(self fixupAt: pc - initialPC) targetInstruction = 0]) ifTrue:
[self assert: descriptor numBytes = 1. "see compileMethodBody"
blockStart numInitialNils: blockStart numInitialNils + 1]].
pc := self nextBytecodePCFor: descriptor at: pc exts: nExts in: methodObj.
+ nExts := descriptor isExtension ifTrue: [nExts + 1] ifFalse: [0].
+ prevBCDescriptor := descriptor].
- nExts := descriptor isExtension ifTrue: [nExts + 1] ifFalse: [0]].
"It would be nice of this wasn't necessary but alas we need to do the eager
scan for frameless methods so that we don't end up popping too much off
the simulated stack, e.g. for pushNil; returnTopFromBlock methods."
needsFrame ifFalse:
[self assert: (stackDelta >= 0 and: [blockStart numInitialNils >= stackDelta]).
blockStart numInitialNils: blockStart numInitialNils - stackDelta]!
Item was changed:
----- Method: StackToRegisterMappingCogit>>scanMethod (in category 'compile abstract instructions') -----
scanMethod
"Scan the method to determine
- what the last bytecode is; extra bytes at the end of a method are used to encode things like source pointers or temp names
- if the method needs a frame or not
- what are the targets of any backward branches.
- how many blocks it creates
Answer the block count or on error a negative error code"
+ | latestContinuation nExts descriptor pc numBlocks distance targetPC |
- | latestContinuation nExts descriptor pc numBlocks distance targetPC stackDelta |
<var: #descriptor type: #'BytecodeDescriptor *'>
needsFrame := false.
+ prevBCDescriptor := nil.
(primitiveIndex > 0
and: [coInterpreter isQuickPrimitiveIndex: primitiveIndex]) ifTrue:
[^0].
numBlocks := 0.
pc := latestContinuation := initialPC.
nExts := 0.
- stackDelta := 0.
[pc <= endPC] whileTrue:
[byte0 := (objectMemory fetchByte: pc ofObject: methodObj) + bytecodeSetOffset.
descriptor := self generatorAt: byte0.
(descriptor isReturn
and: [pc >= latestContinuation]) ifTrue:
[endPC := pc].
+ (needsFrame not
+ and: [descriptor needsFrameFunction isNil
+ or: [self perform: descriptor needsFrameFunction with: false]]) ifTrue:
+ [needsFrame := true].
- needsFrame ifFalse:
- [(descriptor needsFrameFunction isNil
- or: [self perform: descriptor needsFrameFunction with: true])
- ifTrue:
- [needsFrame := true]
- ifFalse: "avoid spilling in frameless methods by not compiling frameless
- anything with a stack deeper than a single push."
- [needsFrame := (stackDelta := stackDelta + descriptor stackDelta) > 1]].
descriptor isBranch ifTrue:
[distance := self spanFor: descriptor at: pc exts: nExts in: methodObj.
targetPC := pc + descriptor numBytes + distance.
(self isBackwardBranch: descriptor at: pc exts: nExts in: methodObj)
ifTrue: [self initializeFixupAt: targetPC - initialPC]
ifFalse: [latestContinuation := latestContinuation max: targetPC]].
descriptor isBlockCreation ifTrue:
[numBlocks := numBlocks + 1.
distance := self spanFor: descriptor at: pc exts: nExts in: methodObj.
targetPC := pc + descriptor numBytes + distance.
latestContinuation := latestContinuation max: targetPC].
pc := pc + descriptor numBytes.
+ nExts := descriptor isExtension ifTrue: [nExts + 1] ifFalse: [0].
+ prevBCDescriptor := descriptor].
- nExts := descriptor isExtension ifTrue: [nExts + 1] ifFalse: [0]].
^numBlocks!
Item was removed:
- ----- Method: VMMaker class>>generateNewNewspeakCogVM (in category 'configurations') -----
- generateNewNewspeakCogVM
- "VMMaker generateNewNewspeakCogVM"
- ^VMMaker
- generate: CoInterpreter
- and: StackToRegisterMappingCogit"Cogit chooseCogitClass"
- with: #( NewspeakVM true
- MULTIPLEBYTECODESETS true
- bytecodeTableInitializer newInitializeBytecodeTableForNewspeakV3PlusClosuresNewspeakV4Hybrid)
- to: (FileDirectory default pathFromURI: 'oscogvm/nscogsrc')
- platformDir: (FileDirectory default pathFromURI: 'oscogvm/platforms')
- including:#( AsynchFilePlugin BMPReadWriterPlugin BalloonEnginePlugin BitBltSimulation DSAPlugin DropPlugin
- FileCopyPlugin FilePlugin FloatArrayPlugin FloatMathPlugin InflatePlugin JPEGReadWriter2Plugin
- JPEGReaderPlugin LargeIntegersPlugin Matrix2x3Plugin MiscPrimitivePlugin NewsqueakIA32ABIPlugin
- RePlugin SecurityPlugin SocketPlugin SoundPlugin SqueakSSLPlugin SurfacePlugin ThreadedIA32FFIPlugin
- UUIDPlugin UnixOSProcessPlugin VMProfileLinuxSupportPlugin VMProfileMacSupportPlugin Win32OSProcessPlugin)!
Item was removed:
- ----- Method: VMMaker class>>generateNewSqueakCogVM (in category 'configurations') -----
- generateNewSqueakCogVM
- "VMMaker generateNewSqueakCogVM"
- ^VMMaker
- generate: (Smalltalk at: ([:choices| choices at: (UIManager default chooseFrom: choices) ifAbsent: [^self]]
- value: #(CoInterpreter CoInterpreterMT)))
- and: StackToRegisterMappingCogit
- with: #( MULTIPLEBYTECODESETS false
- NewspeakVM false
- bytecodeTableInitializer newInitializeBytecodeTableForSqueakV3PlusClosures)
- to: (FileDirectory default pathFromURI: 'oscogvm/src')
- platformDir: (FileDirectory default pathFromURI: 'oscogvm/platforms')
- including:#( ADPCMCodecPlugin AsynchFilePlugin BalloonEnginePlugin B3DAcceleratorPlugin
- BMPReadWriterPlugin BitBltSimulation BochsIA32Plugin CroquetPlugin DSAPlugin
- DeflatePlugin DropPlugin FT2Plugin FFTPlugin FileCopyPlugin FilePlugin FloatArrayPlugin
- FloatMathPlugin GeniePlugin HostWindowPlugin IA32ABIPlugin InternetConfigPlugin
- JPEGReadWriter2Plugin JPEGReaderPlugin JoystickTabletPlugin KlattSynthesizerPlugin
- LargeIntegersPlugin LocalePlugin MIDIPlugin MacMenubarPlugin Matrix2x3Plugin
- MiscPrimitivePlugin Mpeg3Plugin QuicktimePlugin RePlugin SecurityPlugin SerialPlugin
- SocketPlugin SoundCodecPlugin SoundGenerationPlugin SoundPlugin SqueakSSLPlugin StarSqueakPlugin
- ThreadedIA32FFIPlugin UnixAioPlugin UUIDPlugin UnixOSProcessPlugin
- Win32OSProcessPlugin VMProfileLinuxSupportPlugin VMProfileMacSupportPlugin)!
More information about the Vm-dev
mailing list