ClementBera uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-cb.2035.mcz ==================== Summary ==================== Name: VMMaker.oscog-cb.2035 Author: cb Time: 12 December 2016, 7:37:09.935383 pm UUID: 8dd1f98f-643b-4db0-b770-ae057679bef9 Ancestors: VMMaker.oscog-eem.2034 Added support for BranchIfInstanceOf in addition to BranchIfNotInstanceOf by using the sign bit of extB as annotation. =============== Diff against VMMaker.oscog-eem.2034 =============== Item was added: + ----- Method: CogObjectRepresentationFor32BitSpur>>allImmediate:branchIf:instanceOfBehaviors:target: (in category 'sista support') ----- + allImmediate: immediateMask branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp + < inline: true> + <var: #targetFixUp type: #'AbstractInstruction *'> + self assert: immediateMask = objectMemory tagMask. + (self genJumpImmediate: reg) jmpTarget: targetFixUp. + ^0! Item was changed: ----- Method: CogObjectRepresentationFor32BitSpur>>allImmediate:branchIf:notInstanceOfBehaviors:target: (in category 'sista support') ----- allImmediate: immediateMask branchIf: reg notInstanceOfBehaviors: arrayObj target: targetFixUp - | jmpImmediate | < inline: true> <var: #targetFixUp type: #'AbstractInstruction *'> self assert: immediateMask = objectMemory tagMask. + (self genJumpNotImmediate: reg) jmpTarget: targetFixUp. - jmpImmediate := self genJumpNotImmediate: reg. - jmpImmediate jmpTarget: targetFixUp. ^0! Item was added: + ----- Method: CogObjectRepresentationFor32BitSpur>>branch2CasesIf:instanceOfBehaviors:target: (in category 'sista support') ----- + branch2CasesIf: reg instanceOfBehaviors: arrayObj target: targetFixUp + <inline: true> + self Jump: targetFixUp! Item was added: + ----- Method: CogObjectRepresentationFor32BitSpur>>branchIf:hasImmediateTag:target: (in category 'sista support') ----- + branchIf: reg hasImmediateTag: classIndex target: targetFixUp + <var: #targetFixUp type: #'AbstractInstruction *'> + | jmpImmediate| + <inline: true> + cogit MoveR: reg R: TempReg. + classIndex = objectMemory smallIntegerTag ifTrue: + [jmpImmediate := self genJumpSmallIntegerInScratchReg: TempReg]. + classIndex = objectMemory characterTag ifTrue: + [jmpImmediate := self genJumpCharacterInScratchReg: TempReg]. + jmpImmediate jmpTarget: targetFixUp! Item was added: + ----- Method: CogObjectRepresentationFor64BitSpur>>allImmediate:branchIf:instanceOfBehaviors:target: (in category 'sista support') ----- + allImmediate: immediateMask branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp + | tag1 tag2 | + <var: #targetFixUp type: #'AbstractInstruction *'> + immediateMask = objectMemory tagMask ifTrue: [(self genJumpImmediate: reg) jmpTarget: targetFixUp. ^0]. + "TempReg holds the rcvr tag" + "In this case one immediate tag out of the three is not present in arrayObj." + tag1 := objectMemory classTagForClass: (objectMemory fetchPointer: 0 ofObject: arrayObj). + tag2 := objectMemory classTagForClass: (objectMemory fetchPointer: 1 ofObject: arrayObj). + (tag1 = objectMemory smallIntegerTag or: [tag2 = objectMemory smallIntegerTag]) ifTrue: + [(self genJumpSmallIntegerInScratchReg: TempReg) jmpTarget: targetFixUp]. + (tag1 = objectMemory characterTag or: [tag2 = objectMemory characterTag]) ifTrue: + [(self genJumpCharacterInScratchReg: TempReg) jmpTarget: targetFixUp]. + (tag1 = objectMemory smallFloatTag or: [tag2 = objectMemory smallFloatTag]) ifTrue: + [(self genJumpSmallFloatInScratchReg: TempReg) jmpTarget: targetFixUp]. + ^0! Item was added: + ----- Method: CogObjectRepresentationFor64BitSpur>>branch2CasesIf:instanceOfBehaviors:target: (in category 'sista support') ----- + branch2CasesIf: reg instanceOfBehaviors: arrayObj target: targetFixUp + | classObj tag1 tag2 | + < inline: true> + + "look for the 2 tags requiring jmps" + 0 to: (objectMemory numSlotsOf: arrayObj) - 1 do: + [:i| + classObj := objectMemory fetchPointer: i ofObject: arrayObj. + (objectMemory isImmediateClass: classObj) + ifTrue: [ tag1 + ifNil: [tag1 := objectMemory classTagForClass: classObj ] + ifNotNil: [tag2 := objectMemory classTagForClass: classObj ] ] ]. + + (tag1 = objectMemory smallIntegerTag or: [tag2 = objectMemory smallIntegerTag]) ifTrue: + [(self genJumpSmallIntegerInScratchReg: TempReg) jmpTarget: targetFixUp]. + (tag1 = objectMemory characterTag or: [tag2 = objectMemory characterTag]) ifTrue: + [(self genJumpCharacterInScratchReg: TempReg) jmpTarget: targetFixUp]. + (tag1 = objectMemory smallFloatTag or: [tag2 = objectMemory smallFloatTag]) ifTrue: + [(self genJumpSmallFloatInScratchReg: TempReg) jmpTarget: targetFixUp]. + ^ 0! Item was added: + ----- Method: CogObjectRepresentationFor64BitSpur>>branchIf:hasImmediateTag:target: (in category 'sista support') ----- + branchIf: reg hasImmediateTag: classIndex target: targetFixUp + <var: #targetFixUp type: #'AbstractInstruction *'> + | jmpImmediate| + <inline: true> + cogit MoveR: reg R: TempReg. + classIndex = objectMemory smallIntegerTag ifTrue: + [jmpImmediate := self genJumpSmallIntegerInScratchReg: TempReg]. + classIndex = objectMemory characterTag ifTrue: + [jmpImmediate := self genJumpCharacterInScratchReg: TempReg]. + classIndex = objectMemory smallFloatTag ifTrue: + [jmpImmediate := self genJumpSmallFloatInScratchReg: TempReg]. + jmpImmediate jmpTarget: targetFixUp! Item was added: + ----- Method: CogObjectRepresentationForSpur>>branchIf:instanceOfBehavior:target: (in category 'sista support') ----- + branchIf: reg instanceOfBehavior: classObj target: targetFixUp + "Generate a branch if reg is an instance of classObj, otherwise fall- + through. Cannot change the value of reg (may be used afterwards)." + | classIndex jmp | + <inline: true> + <var: #targetFixUp type: #'AbstractInstruction *'> + <var: #jmp type: #'AbstractInstruction *'> + classIndex := objectMemory classTagForClass: classObj. + (objectMemory isImmediateClass: classObj) + ifTrue: + [self branchIf: reg hasImmediateTag: classIndex target: targetFixUp ] + ifFalse: + [jmp := (self genJumpImmediate: reg) . + self genGetClassIndexOfNonImm: reg into: TempReg. + self genCmpClassIndex: classIndex R: TempReg. + cogit JumpZero: targetFixUp. + jmp jmpTarget: cogit Label ]. + ^0! Item was added: + ----- Method: CogObjectRepresentationForSpur>>branchIf:instanceOfBehaviors:target: (in category 'sista support') ----- + branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp + "Generate a branch if reg is an instance of any of the classes in arrayObj, + otherwise fall-through. reg should not be edited." + + | allImmediate noneImmediate immediateMask numNonImmediates classObj | + <var: #targetFixUp type: #'AbstractInstruction *'> + + "let me tell you all about it, let me falsify" + allImmediate := true. noneImmediate := true. immediateMask := 0. numNonImmediates := 0. + 0 to: (objectMemory numSlotsOf: arrayObj) - 1 do: + [:i| + classObj := objectMemory fetchPointer: i ofObject: arrayObj. + (objectMemory isImmediateClass: classObj) + ifTrue: + [noneImmediate := false. + immediateMask := immediateMask + (objectMemory classTagForClass: classObj)] + ifFalse: + [allImmediate := false. + numNonImmediates := numNonImmediates + 1]]. + + noneImmediate ifTrue: [ ^ self noneImmediateBranchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp ]. + + allImmediate ifTrue: [ ^ self allImmediate: immediateMask branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp ]. + + ^ self mixed: numNonImmediates branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp! Item was added: + ----- Method: CogObjectRepresentationForSpur>>mixed:branchIf:instanceOfBehaviors:target: (in category 'sista support') ----- + mixed: numNonImmediates branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp + | jmpImmediate numCases classObj index jmp | + <var: #label type: #'AbstractInstruction *'> + <var: #jmpImmediate type: #'AbstractInstruction *'> + <var: #jmp type: #'AbstractInstruction *'> + <var: #targetFixUp type: #'AbstractInstruction *'> + numCases := objectMemory numSlotsOf: arrayObj. + jmpImmediate := self genJumpImmediate: reg. + + "Rcvr is non immediate" + self genGetClassIndexOfNonImm: reg into: TempReg. + index := 0. + 0 to: numCases - 1 do: + [:i| + classObj := objectMemory fetchPointer: i ofObject: arrayObj. + (objectMemory isImmediateClass: classObj) ifFalse: [ + self genCmpClassIndex: (objectMemory classTagForClass: classObj) R: TempReg. + cogit JumpZero: targetFixUp. + index := index + 1 ] ]. + jmp := cogit Jump: 0. + + "Rcvr is immediate" + jmpImmediate jmpTarget: cogit Label. + numCases - numNonImmediates "num Immediates allowed" + caseOf: + {[ 1 ] -> [ "1 immediate needs to jump. Find it and jump." + 0 to: numCases - 1 do: + [ :j | + classObj := objectMemory fetchPointer: j ofObject: arrayObj. + (objectMemory isImmediateClass: classObj) ifTrue: [ + self branchIf: reg hasImmediateTag: (objectMemory classTagForClass: classObj) target: targetFixUp ] ] ] . + [ 2 ] -> [ "2 immediates needs to jump" + self branch2CasesIf: reg instanceOfBehaviors: arrayObj target: targetFixUp ] . + [ 3 ] -> [ "all 3 needs to jump" self Jump: targetFixUp ] }. + + jmp jmpTarget: self Label. + + ^ 0 + ! Item was added: + ----- Method: CogObjectRepresentationForSpur>>noneImmediateBranchIf:instanceOfBehaviors:target: (in category 'sista support') ----- + noneImmediateBranchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp + "All classes in arrayObj are not immediate" + | classObj jmp | + <var: #targetFixUp type: #'AbstractInstruction *'> + <var: #label type: #'AbstractInstruction *'> + <var: #jmp type: #'AbstractInstruction *'> + jmp := self genJumpImmediate: reg. + self genGetClassIndexOfNonImm: reg into: TempReg. + 0 to: (objectMemory numSlotsOf: arrayObj) - 1 do: + [:i| + classObj := objectMemory fetchPointer: i ofObject: arrayObj. + self genCmpClassIndex: (objectMemory classTagForClass: classObj) R: TempReg. + cogit JumpZero: targetFixUp ]. + jmp jmpTarget: self Label. + ^0! Item was changed: ----- Method: SistaCogit>>genExtJumpIfNotInstanceOfBehaviorsBytecode (in category 'bytecode generators') ----- genExtJumpIfNotInstanceOfBehaviorsBytecode "SistaV1: * 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)" + | reg literal distance targetFixUp inverse | - | reg literal distance targetFixUp | "We loose the information of in which register is stack top when jitting the branch target so we need to flush everything. We could use a fixed register here...." reg := self allocateRegForStackEntryAt: 0. self ssTop popToReg: reg. self ssFlushTo: simStackPtr. "flushed but the value is still in reg" self genPopStackBytecode. literal := self getLiteral: (extA * 256 + byte1). extA := 0. + extB < 0 + ifTrue: [extB := extB + 128. inverse := true] + ifFalse: [inverse := false]. distance := extB * 256 + byte2. extB := 0. targetFixUp := self cCoerceSimple: (self ensureFixupAt: bytecodePC + 3 + distance - initialPC) to: #'AbstractInstruction *'. + inverse + ifFalse: + [(objectMemory isArrayNonImm: literal) + ifTrue: [objectRepresentation branchIf: reg notInstanceOfBehaviors: literal target: targetFixUp] + ifFalse: [objectRepresentation branchIf: reg notInstanceOfBehavior: literal target: targetFixUp] ] + ifTrue: + [(objectMemory isArrayNonImm: literal) + ifTrue: [objectRepresentation branchIf: reg instanceOfBehaviors: literal target: targetFixUp] + ifFalse: [objectRepresentation branchIf: reg instanceOfBehavior: literal target: targetFixUp]]. - - (objectMemory isArrayNonImm: literal) - ifTrue: [objectRepresentation branchIf: reg notInstanceOfBehaviors: literal target: targetFixUp] - ifFalse: [objectRepresentation branchIf: reg notInstanceOfBehavior: literal target: targetFixUp]. + + ^0! Item was changed: ----- Method: StackInterpreter>>extJumpIfNotInstanceOfBehaviorsBytecode (in category 'sista bytecodes') ----- extJumpIfNotInstanceOfBehaviorsBytecode "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)" + | tosClassTag literal distance inverse | - | tosClassTag literal distance | SistaVM ifFalse: [^self respondToUnknownBytecode]. + extB < 0 + ifTrue: [extB := extB + 128. inverse := true] + ifFalse: [inverse := false]. tosClassTag := objectMemory fetchClassTagOf: self internalPopStack. literal := self literal: extA << 8 + self fetchByte. distance := extB << 8 + self fetchByte. extA := 0. extB := 0. (objectMemory isArrayNonImm: literal) ifTrue: [0 to: (objectMemory numSlotsOf: literal) asInteger - 1 do: [:i | tosClassTag = (objectMemory rawClassTagForClass: (objectMemory fetchPointer: i ofObject: literal)) + ifTrue: [ + inverse ifTrue: [ localIP := localIP + distance ]. + ^ self fetchNextBytecode ] ]. + inverse ifFalse: [localIP := localIP + distance]. - ifTrue: [ ^ self fetchNextBytecode ] ]. - localIP := localIP + distance. ^ self fetchNextBytecode] ifFalse: [tosClassTag ~= (objectMemory rawClassTagForClass: literal) ifTrue: + [inverse ifFalse: [localIP := localIP + distance]. - [localIP := localIP + distance. ^ self fetchNextBytecode]]. + inverse ifTrue: [localIP := localIP + distance]. self fetchNextBytecode! |
Free forum by Nabble | Edit this page |