VM Maker: VMMaker.oscog-cb.2035.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-cb.2035.mcz

commits-2
 
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!