ClementBera uploaded a new version of BytecodeSets to project VM Maker: http://source.squeak.org/VMMaker/BytecodeSets.spur-cb.22.mcz
==================== Summary ====================
Name: BytecodeSets.spur-cb.22 Author: cb Time: 1 April 2015, 9:40:25.46 am UUID: 23559a1a-1471-49b6-b888-477e71431fe7 Ancestors: BytecodeSets.spur-cb.21
empty log message
=============== Diff against BytecodeSets.spur-cb.21 ===============
Item was changed: ----- Method: EncoderForSistaV1 class>>selectorToSendOrItselfFor:in:at: (in category 'instruction stream support') ----- selectorToSendOrItselfFor: anInstructionStream in: method at: pc "If anInstructionStream is at a send bytecode then answer the send's selector, otherwise answer anInstructionStream itself. The rationale for answering anInstructionStream instead of, say, nil, is that potentially any existing object can be used as a selector, but since anInstructionStream postdates the method, it can't be one of them.
The compilcation is that for convenience we assume the pc could be pointing to the raw send bytecode after its extensions, or at the extension preceeding the raw send bytecode. 96-111 0110 iiii Send Arithmetic Message #iiii #(#+ #- #< #> #'<=' #'>=' #= #'~=' #* #/ #'\' #@ #bitShift: #'//' #bitAnd: #bitOr:) 112-119 01110 iii Send Special Message #iii #(#at: #at:put: #size #next #nextPut: #atEnd #'==' class) 120 01111000 UNASSIGNED (was: blockCopy:) 121 01111001 Send Special Message #value 122-123 0111101 i Send Special Message #i #(#value: #do:) 124-127 011111 ii Send Special Message #ii #(#new #new: #x #y)) 128-143 1000 iiii Send Literal Selector #iiii With 0 Argument 144-159 1001 iiii Send Literal Selector #iiii With 1 Arguments 160-175 1010 iiii Send Literal Selector #iiii With 2 Arguments * 224 11100000 aaaaaaaa Extend A (Ext A = Ext A prev * 256 + Ext A) * 225 11100001 bbbbbbbb Extend B (Ext B = Ext B prev * 256 + Ext B) ** 234 11101010 iiiiijjj Send Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments ** 235 11101011 iiiiijjj Send To Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments"
| byte | byte := method at: pc. byte < 96 ifTrue: [^anInstructionStream]. byte <= 175 ifTrue: ["special byte or short send" ^byte >= 128 ifTrue: [method literalAt: (byte bitAnd: 15) + 1] + ifFalse: [Smalltalk specialSelectorAt: byte - 95]]. - ifFalse: [Smalltalk specialSelectorAt: byte - 79]]. byte < 234 ifTrue: "need to check for either extension cuz order of extensions is not restricted. so extB could preceed extA" [(byte >= 224 and: [byte <= 225]) ifTrue: [^self extensionsAt: pc in: method into: [:extA :extB :nExtBytes| | byteAfter index | byteAfter := method at: pc + nExtBytes. (byteAfter >= 234 and: [byteAfter <= 235]) ifTrue: [index := ((method at: pc + nExtBytes + 1) bitShift: -3) + (extA bitShift: 5). method literalAt: index + 1] ifFalse: [anInstructionStream]]]. ^anInstructionStream]. byte > 235 ifTrue: [^anInstructionStream]. "they could be extended..." ^self extensionsFor: pc in: method into: [:extA :extB :nExtBytes| | index | index := ((method at: pc + 1) bitShift: -3) + (extA bitShift: 5). method literalAt: index + 1]!
Item was changed: ----- Method: EncoderForSistaV1>>genReturnTopToCaller (in category 'bytecode generation') ----- genReturnTopToCaller + "94 1011101 Return Stack Top From Block [* return from enclosing block N, ExtA]" - "93 1011101 Return Stack Top From Block [* return from enclosing block N, ExtA]" "If extended, the least significant bit of the extension determines if we return to the caller or not and the most significant bits determine how many levels of the static chain to return from. ExtA = iiiiiiij iiiiiii=0,j=0 => return to caller iiiiiii=0,j=1 => illegal iiiiiii=1,j=0 => return to outerContext iiiiiii=1,j=1 => return to outerContext sender/return from outerContext iiiiiii=2,j=0 => return to outerContext outerContext iiiiiii=2,j=1 => return to outerContext outerContext sender/return from outerContext outerContext etc"
stream nextPut: 94!
vm-dev@lists.squeakfoundation.org