ClementBera uploaded a new version of BytecodeSets to project VM Maker: http://source.squeak.org/VMMaker/BytecodeSets.spur-cb.66.mcz ==================== Summary ==================== Name: BytecodeSets.spur-cb.66 Author: cb Time: 19 January 2017, 5:52:17.032116 pm UUID: adcb4362-6dd8-49a5-9ca0-156b185b00ea Ancestors: BytecodeSets.spur-eem.65 Added support for branchIfInstanceOf: decoding =============== Diff against BytecodeSets.spur-eem.65 =============== Item was added: + ----- Method: InstructionClient>>branchIfInstanceOf:distance: (in category '*BytecodeSets-instruction decoding') ----- + branchIfInstanceOf: literal distance: distance + "If the object on top of stack has the type -or one of the type- present in the literal (the literal is a behavior or an array of behavior), then pop it. Else jumps by the distance." + ! Item was added: + ----- Method: InstructionPrinter>>branchIfInstanceOf:distance: (in category '*BytecodeSets-SistaV1-decoding') ----- + branchIfInstanceOf: behaviorOrArrayOfBehavior distance: distance + "If the object on top of stack has the type -or one of the type- present in the literal + (the literal is a behavior or an array of behavior), then pop it. Else jumps by the distance." + self print: 'branchIfInstanceOf: ', behaviorOrArrayOfBehavior printString, ' distance: ', distance printString! Item was changed: ----- Method: InstructionStream>>interpretNext3ByteSistaV1Instruction:for:extA:extB:startPC: (in category '*BytecodeSets-SistaV1-decoding') ----- interpretNext3ByteSistaV1Instruction: 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 three-byte codes. For a table of the bytecode set, see EncoderForSistaV1's class comment." | method byte2 byte3 literal | method := self method. byte2 := method at: pc. byte3 := method at: pc + 1. pc := pc + 2. "we search the bytecodes by what we expect to be the static frequency." bytecode = 248 ifTrue: [byte3 >= 128 ifTrue: [^client callInlinePrimitive: byte2 + (byte3 - 128 bitShift: 8)]. ^client callPrimitive: byte2 + (byte3 bitShift: 8)]. "* 249 11111001 xxxxxxxx siyyyyyy push Closure Compiled block literal index xxxxxxxx (+ Extend A * 256) numCopied yyyyyy receiverOnStack: s = 1 ignoreOuterContext: i = 1" bytecode = 249 ifTrue: [literal := method literalAt: (extA bitShift: 8) + byte2 + 1. ^client pushFullClosure: literal numCopied: (byte3 bitAnd: 16r3F)]. bytecode = 250 ifTrue: ["** 250 11111010 eeiiikkk jjjjjjjj Push Closure Num Copied iii (+ExtA//16*8) Num Args kkk (+ ExtA\\16*8) BlockSize jjjjjjjj (+ExtB*256). ee = num extensions" ^client pushClosureCopyNumCopiedValues: ((byte2 bitShift: -3) bitAnd: 7) + (extA // 16 bitShift: 3) numArgs: (byte2 bitAnd: 7) + (extA \\ 16 bitShift: 3) blockSize: byte3 + (extB bitShift: 8)]. bytecode = 251 ifTrue: [^client pushRemoteTemp: byte2 inVectorAt: byte3]. bytecode = 252 ifTrue: [^client storeIntoRemoteTemp: byte2 inVectorAt: byte3]. bytecode = 253 ifTrue: [^client popIntoRemoteTemp: byte2 inVectorAt: byte3]. "** 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)" bytecode = 254 ifTrue: + [extB < 0 ifTrue: [client branchIfInstanceOf: literal distance: (extB + 128 bitShift: 8) + byte3]. + ^ client branchIfNotInstanceOf: literal distance: (extB bitShift: 8) + byte3 ]. - [^ client branchIfNotInstanceOf: literal distance: (extB bitShift: 8) + byte3 ]. ^self unusedBytecode: client at: startPC! Item was changed: ----- Method: StackDepthFinder>>branchIfNotInstanceOf:distance: (in category '*BytecodeSets-SistaV1-decoding') ----- + branchIfNotInstanceOf: behaviorOrArrayOfBehavior distance: delta + self drop. + self doJump: delta! - branchIfNotInstanceOf: behaviorOrArrayOfBehavior distance: anInteger - self drop! |
Free forum by Nabble | Edit this page |