[Vm-dev] VM Maker: BytecodeSets.spur-cb.41.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Apr 5 01:20:51 UTC 2016
Eliot Miranda uploaded a new version of BytecodeSets to project VM Maker:
http://source.squeak.org/VMMaker/BytecodeSets.spur-cb.41.mcz
==================== Summary ====================
Name: BytecodeSets.spur-cb.41
Author: cb
Time: 4 April 2016, 6:20:45.399 pm
UUID: d61f7d7f-e207-48aa-b772-b78032fc6810
Ancestors: BytecodeSets.spur-rmacnak.40
Added support for multiple new bytecode instructions, especially the new full block closure bytecode.
=============== Diff against BytecodeSets.spur-rmacnak.40 ===============
Item was changed:
BytecodeEncoder subclass: #EncoderForSistaV1
(excessive size, no diff calculated)
Item was changed:
+ ----- Method: EncoderForSistaV1>>genBranchIfNotInstanceOf:distance: (in category 'extended bytecode generation') -----
- ----- Method: EncoderForSistaV1>>genBranchIfNotInstanceOf:distance: (in category 'bytecode generation') -----
genBranchIfNotInstanceOf: literalIndex distance: distance
"254 11111110 kkkkkkkk jjjjjjjj branch If Not Instance Of Behavior/Array Of Behavior kkkkkkkk (+ Extend A * 256, where Extend A >= 0) distance jjjjjjjj (+ Extend B * 256, where Extend B >= 0)"
| extendedIndex extendedDistance |
(literalIndex < 0 or: [literalIndex > 65535]) ifTrue:
[^self outOfRangeError: 'index' index: literalIndex range: 0 to: 65536].
(distance < 1 or: [distance > 32767]) ifTrue:
[^self outOfRangeError: 'distance' index: distance range: 0 to: 32767].
(extendedIndex := literalIndex) > 255 ifTrue:
[self genUnsignedSingleExtendA: extendedIndex // 256.
extendedIndex := extendedIndex \\ 256].
(extendedDistance := distance) > 255 ifTrue:
[self genUnsignedSingleExtendB: (distance bitShift: -8).
extendedDistance := distance bitAnd: 255].
stream
nextPut: 254;
nextPut: extendedIndex;
nextPut: extendedDistance!
Item was added:
+ ----- Method: EncoderForSistaV1>>genBranchPopFalseNoMustBeBoolean: (in category 'extended bytecode generation') -----
+ genBranchPopFalseNoMustBeBoolean: distance
+ self genNoMustBeBooleanFlag.
+ self genBranchPopFalseLong: distance!
Item was added:
+ ----- Method: EncoderForSistaV1>>genBranchPopTrueNoMustBeBoolean: (in category 'extended bytecode generation') -----
+ genBranchPopTrueNoMustBeBoolean: distance
+ self genNoMustBeBooleanFlag.
+ self genBranchPopTrueLong: distance!
Item was changed:
+ ----- Method: EncoderForSistaV1>>genCallInlinePrimitive: (in category 'extended bytecode generation') -----
- ----- Method: EncoderForSistaV1>>genCallInlinePrimitive: (in category 'bytecode generation') -----
genCallInlinePrimitive: primitiveIndex
"248 11111000 i i i i i i i i 1jjjjjjj Call Primitive #iiiiiiii + (jjjjjjj * 256)"
"N.B. We could have made CallPrimitive a 2-byte code taking an extension, but that would
complicate the VM's determination of the primitive number and the primitive error code
store since the extension, being optional, would make the sequence variable length."
(primitiveIndex < 1 or: [primitiveIndex > 32767]) ifTrue:
[self outOfRangeError: 'primitive index' index: primitiveIndex range: 1 to: 32767].
stream
nextPut: 248;
nextPut: (primitiveIndex bitAnd: 255);
nextPut: (primitiveIndex bitShift: -8) + 128!
Item was added:
+ ----- Method: EncoderForSistaV1>>genNoMustBeBooleanFlag (in category 'extended bytecode generation') -----
+ genNoMustBeBooleanFlag
+ self genUnsignedSingleExtendA: 1!
Item was added:
+ ----- Method: EncoderForSistaV1>>genNoStoreCheckFlag (in category 'extended bytecode generation') -----
+ genNoStoreCheckFlag
+ self genUnsignedSingleExtendB: 1!
Item was changed:
+ ----- Method: EncoderForSistaV1>>genNop (in category 'extended bytecode generation') -----
- ----- Method: EncoderForSistaV1>>genNop (in category 'bytecode generation') -----
genNop
"95 01011111 Nop"
stream nextPut: 95!
Item was added:
+ ----- Method: EncoderForSistaV1>>genPushFullClosure:numCopied:receiverOnStack:outerContextNeeded: (in category 'extended bytecode generation') -----
+ genPushFullClosure: compiledBlockLiteralIndex numCopied: numCopied receiverOnStack: receiverOnStack outerContextNeeded: outerContextNeeded
+ "* 255 11111111 xxxxxxxx siyyyyyy push Closure Compiled block literal index xxxxxxxx (+ Extend A * 256) numCopied yyyyyy receiverOnStack: s = 1 needsOuterContext: i = 1"
+ | extendedIndex |
+ (numCopied < 1 or: [numCopied > 64]) ifTrue:
+ [self outOfRangeError: 'num copied' index: numCopied range: 1 to: 64].
+ (compiledBlockLiteralIndex < 0 or: [compiledBlockLiteralIndex > 32768]) ifTrue:
+ [^self outOfRangeError: 'index' index: compiledBlockLiteralIndex range: 0 to: 32768].
+ (extendedIndex := compiledBlockLiteralIndex) > 255 ifTrue:
+ [self genUnsignedSingleExtendA: extendedIndex // 256.
+ extendedIndex := extendedIndex \\ 256].
+ stream
+ nextPut: 255;
+ nextPut: extendedIndex;
+ nextPut: receiverOnStack asBit << 7 + (outerContextNeeded asBit << 6) + numCopied!
Item was changed:
----- Method: EncoderForSistaV1>>genPushLiteral: (in category 'bytecode generation') -----
genPushLiteral: literalIndex
| extendedIndex |
+ (literalIndex < 0 or: [literalIndex > 32768]) ifTrue:
+ [^self outOfRangeError: 'index' index: literalIndex range: 0 to: 32768].
- (literalIndex < 0 or: [literalIndex > 65535]) ifTrue:
- [^self outOfRangeError: 'index' index: literalIndex range: 0 to: 65536].
literalIndex < 32 ifTrue:
["32-63 001iiiii Push Literal #iiiii"
stream nextPut: 32 + literalIndex.
^self].
"228 11100100 i i i i i i i i Push Literal #iiiiiiii (+ Extend A * 256)"
(extendedIndex := literalIndex) > 255 ifTrue:
[self genUnsignedSingleExtendA: extendedIndex // 256.
extendedIndex := extendedIndex \\ 256].
stream
nextPut: 228;
nextPut: extendedIndex!
Item was changed:
----- Method: EncoderForSistaV1>>genPushLiteralVar: (in category 'bytecode generation') -----
genPushLiteralVar: literalIndex
| extendedIndex |
+ (literalIndex < 0 or: [literalIndex > 32768]) ifTrue:
+ [^self outOfRangeError: 'index' index: literalIndex range: 0 to: 32768].
- (literalIndex < 0 or: [literalIndex > 65535]) ifTrue:
- [^self outOfRangeError: 'index' index: literalIndex range: 0 to: 65535].
literalIndex < 16 ifTrue:
["16-31 0001 i i i i Push Literal Variable #iiii"
stream nextPut: 16 + literalIndex.
^self].
"227 11100011 i i i i i i i i Push Literal Variable #iiiiiiii (+ Extend A * 256)"
(extendedIndex := literalIndex) > 255 ifTrue:
[self genUnsignedSingleExtendA: extendedIndex // 256.
extendedIndex := extendedIndex \\ 256].
stream
nextPut: 227;
nextPut: extendedIndex!
Item was added:
+ ----- Method: EncoderForSistaV1>>genPushRemoteInstanceVariable:inObjectAt: (in category 'extended bytecode generation') -----
+ genPushRemoteInstanceVariable: instanceVariableIndex inObjectAt: tempIndex
+ "251 11111011 kkkkkkkk sjjjjjjj Push Temp At kkkkkkkk In Temp Vector At: jjjjjjj, s = 1 implies remote inst var access instead of remote temp vector access"
+
+ (instanceVariableIndex < 0 or: [instanceVariableIndex > 65535]) ifTrue:
+ [^self outOfRangeError: 'instanceVariableIndex' index: instanceVariableIndex range: 0 to: 65535].
+ (tempIndex < 0 or: [tempIndex >= 128]) ifTrue:
+ [^self outOfRangeError: 'tempVectorIndex' index: tempIndex range: 0 to: 127].
+ instanceVariableIndex > 255 ifTrue:
+ [self genUnsignedSingleExtendA: instanceVariableIndex // 256].
+ stream
+ nextPut: 251;
+ nextPut: instanceVariableIndex \\ 256;
+ nextPut: 1 << 7 + tempIndex!
Item was changed:
----- Method: EncoderForSistaV1>>genPushRemoteTemp:inVectorAt: (in category 'bytecode generation') -----
genPushRemoteTemp: tempIndex inVectorAt: tempVectorIndex
+ "251 11111011 kkkkkkkk sjjjjjjj Push Temp At kkkkkkkk In Temp Vector At: jjjjjjj, s = 1 implies remote inst var access instead of remote temp vector access"
- "251 11111011 kkkkkkkk jjjjjjjj Push Temp At kkkkkkkk In Temp Vector At: jjjjjjjj"
(tempIndex < 0 or: [tempIndex >= 256]) ifTrue:
[^self outOfRangeError: 'remoteTempIndex' index: tempIndex range: 0 to: 255].
+ (tempVectorIndex < 0 or: [tempVectorIndex >= 128]) ifTrue:
+ [^self outOfRangeError: 'tempVectorIndex' index: tempVectorIndex range: 0 to: 127].
- (tempVectorIndex < 0 or: [tempVectorIndex >= 256]) ifTrue:
- [^self outOfRangeError: 'tempVectorIndex' index: tempVectorIndex range: 0 to: 255].
stream
nextPut: 251;
nextPut: tempIndex;
nextPut: tempVectorIndex!
Item was changed:
----- Method: EncoderForSistaV1>>genStoreLiteralVar: (in category 'bytecode generation') -----
genStoreLiteralVar: literalIndex
"244 11110100 iiiiiiii Store Literal Variable #iiiiiiii (+ Extend A * 256)"
+ (literalIndex < 0 or: [literalIndex > 32768]) ifTrue:
+ [^self outOfRangeError: 'index' index: literalIndex range: 0 to: 32768].
- (literalIndex < 0 or: [literalIndex > 65535]) ifTrue:
- [^self outOfRangeError: 'index' index: literalIndex range: 0 to: 65535].
literalIndex > 255 ifTrue:
[self genUnsignedSingleExtendA: literalIndex // 256].
stream
nextPut: 244;
nextPut: literalIndex \\ 256!
Item was changed:
----- Method: EncoderForSistaV1>>genStorePopLiteralVar: (in category 'bytecode generation') -----
genStorePopLiteralVar: literalIndex
"241 11110001 iiiiiiii Pop and Store Literal Variable #iiiiiiii (+ Extend A * 256)"
+ (literalIndex < 0 or: [literalIndex > 32768]) ifTrue:
+ [^self outOfRangeError: 'index' index: literalIndex range: 0 to: 32768].
- (literalIndex < 0 or: [literalIndex > 65535]) ifTrue:
- [^self outOfRangeError: 'index' index: literalIndex range: 0 to: 65535].
literalIndex > 255 ifTrue:
[self genUnsignedSingleExtendA: literalIndex // 256].
stream
nextPut: 241;
nextPut: literalIndex \\ 256!
Item was added:
+ ----- Method: EncoderForSistaV1>>genStorePopRemoteInstanceVariable:inObjectAt: (in category 'extended bytecode generation') -----
+ genStorePopRemoteInstanceVariable: instanceVariableIndex inObjectAt: tempIndex
+ "*253 (3) 11111101 kkkkkkkk sjjjjjjj Pop and Store Temp At kkkkkkkk In Temp Vector At: jjjjjjj s = 1 implies remote inst var access instead of remote temp vector access"
+
+ (instanceVariableIndex < 0 or: [instanceVariableIndex > 65535]) ifTrue:
+ [^self outOfRangeError: 'instanceVariableIndex' index: instanceVariableIndex range: 0 to: 65535].
+ (tempIndex < 0 or: [tempIndex >= 128]) ifTrue:
+ [^self outOfRangeError: 'tempVectorIndex' index: tempIndex range: 0 to: 127].
+ instanceVariableIndex > 255 ifTrue:
+ [self genUnsignedSingleExtendA: instanceVariableIndex // 256].
+ stream
+ nextPut: 253;
+ nextPut: instanceVariableIndex \\ 256;
+ nextPut: 1 << 7 + tempIndex!
Item was changed:
----- Method: EncoderForSistaV1>>genStorePopRemoteTemp:inVectorAt: (in category 'bytecode generation') -----
genStorePopRemoteTemp: tempIndex inVectorAt: tempVectorIndex
+ "* 253 (3) 11111101 kkkkkkkk sjjjjjjj Pop and Store Temp At kkkkkkkk In Temp Vector At: jjjjjjj s = 1 implies remote inst var access instead of remote temp vector access"
- "253 11111101 kkkkkkkk jjjjjjjj Pop and Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj"
(tempIndex < 0 or: [tempIndex >= 256]) ifTrue:
[^self outOfRangeError: 'remoteTempIndex' index: tempIndex range: 0 to: 255].
+ (tempVectorIndex < 0 or: [tempVectorIndex >= 128]) ifTrue:
+ [^self outOfRangeError: 'tempVectorIndex' index: tempVectorIndex range: 0 to: 127].
- (tempVectorIndex < 0 or: [tempVectorIndex >= 256]) ifTrue:
- [^self outOfRangeError: 'tempVectorIndex' index: tempVectorIndex range: 0 to: 255].
stream
nextPut: 253;
nextPut: tempIndex;
nextPut: tempVectorIndex!
Item was added:
+ ----- Method: EncoderForSistaV1>>genStoreRemoteInstanceVariable:inObjectAt: (in category 'extended bytecode generation') -----
+ genStoreRemoteInstanceVariable: instanceVariableIndex inObjectAt: tempIndex
+ "*252 (3) 11111100 kkkkkkkk sjjjjjjj Store Temp At kkkkkkkk In Temp Vector At: jjjjjjj s = 1 implies remote inst var access instead of remote temp vector access"
+
+ (instanceVariableIndex < 0 or: [instanceVariableIndex > 65535]) ifTrue:
+ [^self outOfRangeError: 'instanceVariableIndex' index: instanceVariableIndex range: 0 to: 65535].
+ (tempIndex < 0 or: [tempIndex >= 128]) ifTrue:
+ [^self outOfRangeError: 'tempVectorIndex' index: tempIndex range: 0 to: 127].
+ instanceVariableIndex > 255 ifTrue:
+ [self genUnsignedSingleExtendA: instanceVariableIndex // 256].
+ stream
+ nextPut: 252;
+ nextPut: instanceVariableIndex \\ 256;
+ nextPut: 1 << 7 + tempIndex!
Item was changed:
----- Method: EncoderForSistaV1>>genStoreRemoteTemp:inVectorAt: (in category 'bytecode generation') -----
genStoreRemoteTemp: tempIndex inVectorAt: tempVectorIndex
+ "*252 (3) 11111100 kkkkkkkk sjjjjjjj Store Temp At kkkkkkkk In Temp Vector At: jjjjjjj s = 1 implies remote inst var access instead of remote temp vector access"
- "252 11111100 kkkkkkkk jjjjjjjj Store Temp At kkkkkkkk In Temp Vector At: jjjjjjjj"
(tempIndex < 0 or: [tempIndex >= 256]) ifTrue:
[^self outOfRangeError: 'remoteTempIndex' index: tempIndex range: 0 to: 255].
+ (tempVectorIndex < 0 or: [tempVectorIndex >= 128]) ifTrue:
+ [^self outOfRangeError: 'tempVectorIndex' index: tempVectorIndex range: 0 to: 127].
- (tempVectorIndex < 0 or: [tempVectorIndex >= 256]) ifTrue:
- [^self outOfRangeError: 'tempVectorIndex' index: tempVectorIndex range: 0 to: 255].
stream
nextPut: 252;
nextPut: tempIndex;
nextPut: tempVectorIndex!
Item was changed:
+ ----- Method: EncoderForSistaV1>>genTrap (in category 'extended bytecode generation') -----
- ----- Method: EncoderForSistaV1>>genTrap (in category 'bytecode generation') -----
genTrap
"217 11011001 Unconditionnal trap"
stream nextPut: 217!
Item was added:
+ BlockClosure variableSubclass: #FullBlockClosure
+ instanceVariableNames: 'receiver'
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'BytecodeSets-SistaV1'!
Item was added:
+ ----- Method: FullBlockClosure>>asContextWithSender: (in category 'private') -----
+ asContextWithSender: aContext
+ "Inner private support method for evaluation. Do not use unless you know what you're doing."
+
+ ^(MethodContext newForMethod: self compiledBlock)
+ setSender: aContext
+ receiver: self receiver
+ method: self compiledBlock
+ closure: self
+ startpc: self startpc;
+ privRefresh!
Item was added:
+ ----- Method: FullBlockClosure>>compiledBlock (in category 'accessing') -----
+ compiledBlock
+ "To be able to inherit from BlockClosure"
+ ^ startpc!
Item was added:
+ ----- Method: FullBlockClosure>>home (in category 'accessing') -----
+ home
+ ^ outerContext ifNotNil: [ outerContext home ]!
Item was added:
+ ----- Method: FullBlockClosure>>method (in category 'accessing') -----
+ method
+ ^ self compiledBlock!
Item was added:
+ ----- Method: FullBlockClosure>>numTemps (in category 'accessing') -----
+ numTemps
+ ^ self compiledBlock numTemps!
Item was added:
+ ----- Method: FullBlockClosure>>receiver (in category 'accessing') -----
+ receiver
+ ^ receiver!
Item was added:
+ ----- Method: FullBlockClosure>>startpc (in category 'accessing') -----
+ startpc
+ ^ self compiledBlock initialPC!
More information about the Vm-dev
mailing list