[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