[Vm-dev] VM Maker: BytecodeSets.spur-cb.25.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Apr 1 21:14:38 UTC 2015


ClementBera uploaded a new version of BytecodeSets to project VM Maker:
http://source.squeak.org/VMMaker/BytecodeSets.spur-cb.25.mcz

==================== Summary ====================

Name: BytecodeSets.spur-cb.25
Author: cb
Time: 1 April 2015, 2:14:33.53 pm
UUID: 2e129070-202a-4aa4-ad8a-a82f0a522a90
Ancestors: BytecodeSets.spur-cb.24

- Bytecode for push true and push false were inverted.
- fix two bugs in sistaV1 bytecode decoding.

=============== Diff against BytecodeSets.spur-cb.24 ===============

Item was changed:
  ----- Method: EncoderForSistaV1>>genPushSpecialLiteral: (in category 'bytecode generation') -----
  genPushSpecialLiteral: aLiteral
  	"77			01001101			Push true
  	 78			01001110			Push false
  	 79			01001111			Push nil
  	 80			01010000			Push 0
  	 81			01010001			Push 1
  	 232		11101000	iiiiiiii		Push Integer #iiiiiiii (+ Extend B * 256, where bbbbbbbb = sddddddd, e.g. -32768 = i=0, a=0, s=1)"
  	| index |
  	aLiteral isInteger ifTrue:
  		[aLiteral == 0 ifTrue:
  			[stream nextPut: 80.
  			 ^self].
  		 aLiteral == 1 ifTrue:
  			[stream nextPut: 81.
  			 ^self].
  		 ^self genPushInteger: aLiteral].
+ 	index := #(true false nil)
- 	index := #(false true nil)
  					indexOf: aLiteral
  					ifAbsent: [^self error: 'push special literal: ', aLiteral printString,  ' is not one of true false nil'].
  	stream nextPut: 76 + index!

Item was changed:
  ----- Method: InstructionStream>>interpretNext2ByteSistaV1Instruction:for:extA:extB:startPC: (in category '*BytecodeSets-SistaV1-decoding') -----
  interpretNext2ByteSistaV1Instruction: bytecode for: client extA: extA extB: extB startPC: startPC
  	"Send to the argument, client, a message that specifies the next instruction.
  	 This method handles the two-byte codes.
  	 For a table of the bytecode set, see EncoderForV1's class comment."
  
  	| byte method |
  	method := self method.
  	byte := self method at: pc.
  	pc := pc + 1.
  	"We do an inline quasi-binary search on bytecode"
  	bytecode < 234 ifTrue: "pushes"
  		[bytecode < 231 ifTrue:
  			[bytecode < 229 ifTrue:
  				[| literal |
  				 bytecode = 226 ifTrue:
  					[^client pushReceiverVariable: (extA bitShift: 8) + byte].
  				 literal := method literalAt: (extA bitShift: 8) + byte + 1.
  				 bytecode = 227 ifTrue:
  					[^client pushLiteralVariable: literal].
  				 ^client pushConstant: literal].
  			bytecode = 229 ifTrue:
  				[^client pushClosureTemps: byte].
  			^client pushTemporaryVariable: byte].
  		bytecode = 231 ifTrue:
  			[^byte < 128
  				ifTrue: [client pushNewArrayOfSize: byte]
  				ifFalse: [client pushConsArrayWithElements: byte - 128]].
  		bytecode = 232 ifTrue:
  			[^client pushConstant: (extB bitShift: 8) + byte].
  		^client pushConstant: (Character value: (extB bitShift: 8) + byte)].
  	bytecode < 240 ifTrue: "sends, trap and jump"
  		[bytecode < 236 ifTrue: "sends"
  			[^client
  				send: (method literalAt: (extA bitShift: 5) + (byte // 8) + 1)
+ 				super: bytecode = 235
- 				super: bytecode = 239
  				numArgs: (extB bitShift: 3) + (byte \\ 8)].
  		 bytecode = 236 ifTrue:
  			[^client trapIfNotInstanceOf: (method literalAt: (extA bitShift: 8) + byte + 1)].
  		bytecode = 237 ifTrue:
  			[^client jump: (extB bitShift: 8) + byte].
  		 ^client jump: (extB bitShift: 8) + byte if: bytecode = 238].
  	bytecode < 243 ifTrue:
  		[bytecode = 240 ifTrue:
  			[^client popIntoReceiverVariable: (extA bitShift: 8) + byte].
  		 bytecode = 241 ifTrue:
  			[^client popIntoLiteralVariable: (method literalAt: (extA bitShift: 8) + byte + 1)].
  		 ^client popIntoTemporaryVariable: byte].
  	bytecode = 243 ifTrue:
  		[^client storeIntoReceiverVariable: (extA bitShift: 8) + byte].
  	bytecode = 244 ifTrue:
  		[^client storeIntoLiteralVariable: (method literalAt: (extA bitShift: 8) + byte + 1)].
  	bytecode = 245 ifTrue:
  		[^client storeIntoTemporaryVariable: byte].
  	"246-247	1111011 i	xxxxxxxx	UNASSIGNED"
  	^self unusedBytecode: client at: startPC!

Item was changed:
  ----- Method: InstructionStream>>interpretNextSistaV1InstructionFor: (in category '*BytecodeSets-SistaV1-decoding') -----
  interpretNextSistaV1InstructionFor: client
  	"Send to the argument, client, a message that specifies the next instruction."
  
  	| byte div16 offset method extA extB savedPC |
  	method := self method.
  	"For a table of the bytecode set, see EncoderForSistaV1's class comment."
  	"consume and compute any extensions first."
  	extA := extB := 0.
  	savedPC := pc.
  	[byte := self method at: pc.
  	 pc := pc + 1.
  	 byte >= 16rE0 and: [byte <= 16rE1]] whileTrue:
  		[| extByte |
  		 extByte := self method at: pc.
  		 pc := pc + 1.
  		 byte = 16rE0
  			ifTrue:
  				[extA := (extA bitShift: 8) + extByte]
  			ifFalse:
  				[extB := (extB = 0 and: [extByte > 127])
  							ifTrue: [extByte - 256]
  							ifFalse: [(extB bitShift: 8) + extByte]]].
  	div16 := byte // 16.
  	offset := byte \\ 16.
  	"We do an inline quasi-binary search on each of the possible 16 values of div16"
  	div16 < 11 ifTrue:
  		[div16 < 6 ifTrue:
  			[div16 < 4 ifTrue:
  				[div16 < 2 ifTrue:
  					[div16 = 0 ifTrue:
  						 [^client pushReceiverVariable: offset].
  					^client pushLiteralVariable: (method literalAt: offset + 1)]. "div16 = 1"
  				 ^client pushConstant: (method literalAt: byte \\ 32 + 1)].
  			 div16 = 4 ifTrue:
  				[offset < 12 ifTrue:
  					[^client pushTemporaryVariable: offset].
  				 offset = 12 ifTrue:
  					[^client pushReceiver].
  				 offset = 13 ifTrue:
  					[^client pushConstant: true].
  				 offset = 14 ifTrue:
  					[^client pushConstant: false].
  				 offset = 15 ifTrue:
  					[^client pushConstant: nil]].
  			"div16 = 5"
  			 offset < 2 ifTrue:
  				[^client pushConstant: offset].
  			 offset = 2 ifTrue:
  				[^self interpretSistaV1ExtendedPush: extB for: client].
  			 offset = 3 ifTrue:
  				[^client doDup].
  			
  			 offset = 8 ifTrue:
  				[^client methodReturnReceiver].
  			 offset = 9 ifTrue:
  				[^client methodReturnConstant: true].
  			 offset = 10 ifTrue:
  				[^client methodReturnConstant: false].
  			 offset = 11 ifTrue:
  				[^client methodReturnConstant: nil].
  			 offset = 12 ifTrue:
  				[^client methodReturnTop].
  			 offset = 13 ifTrue:
  				[^client blockReturnConstant: nil].
  			 offset = 14 ifTrue:
  				[^client blockReturnTop].
  			 offset = 15 ifTrue:
  				[^client doNop].
  			 ^self unusedBytecode: client at: savedPC].
  		"short sends"
  		div16 = 6 ifTrue:
  			[^client
  				send: (Smalltalk specialSelectorAt: offset + 1)
  				super: false
  				numArgs: (Smalltalk specialNargsAt: offset + 1)].
  		 div16 = 7 ifTrue:
  			[^client
  				send: (Smalltalk specialSelectorAt: offset + 17)
  				super: false
  				numArgs: (Smalltalk specialNargsAt: offset + 17)].
  		^client
  			send: (method literalAt: offset + 1)
  			super: false
  			numArgs: div16 - 8].
  	"div16 >= 11; bytecode >= 176"
  	div16 < 14 ifTrue:
  		[div16 = 11 ifTrue:
  			[offset < 8 ifTrue:
  				[^client jump: offset + 1].
  			 ^client jump: offset - 7 if: true].
  		 div16 = 12 ifTrue:
  			[offset < 8 ifTrue:
  				[^client jump: offset + 1 if: false].
  			 ^client popIntoReceiverVariable: offset - 8].
  		 "div16 = 13"
  		 offset < 8 ifTrue:
  		 	[^client popIntoTemporaryVariable: offset].
+ 		 offset = 8 ifTrue: [ ^ client doPop ].
- 		 offset = 9 ifTrue:
- 			[^client doDup].
  		 ^self unusedBytecode: client at: savedPC].
  	"2 byte and 3 byte codes"
  	byte < 248 ifTrue:
  		[^self interpretNext2ByteSistaV1Instruction: byte for: client extA: extA extB: extB startPC: savedPC].
  	^self interpretNext3ByteSistaV1Instruction: byte for: client extA: extA extB: extB startPC: savedPC!



More information about the Vm-dev mailing list