[Vm-dev] VM Maker: BytecodeSets.spur-eem.11.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Aug 13 17:12:04 UTC 2014
Eliot Miranda uploaded a new version of BytecodeSets to project VM Maker:
http://source.squeak.org/VMMaker/BytecodeSets.spur-eem.11.mcz
==================== Summary ====================
Name: BytecodeSets.spur-eem.11
Author: eem
Time: 13 August 2014, 10:11:57.09 am
UUID: 59e46149-58c6-47f6-9a2f-81787a393b7d
Ancestors: BytecodeSets-eem.10
Save BytecodeSets for latest version of Spur bootstrap
(Cog.190) with changes to compiler, etc.
=============== Diff against BytecodeSets-eem.10 ===============
Item was removed:
- ----- Method: EncoderForNewsqueakV4>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method encoding') -----
- computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex
- numTemps > 63 ifTrue:
- [^self error: 'Cannot compile -- too many temporary variables'].
- numLits > 65535 ifTrue:
- [^self error: 'Cannot compile -- too many literals'].
- ^SmallInteger minVal "sign bit is the flag for the alternative bytecode set"
- + (numArgs bitShift: 24)
- + (numTemps bitShift: 18)
- "+ (largeBit bitShift: 17)" "largeBit gets filled in later"
- + numLits
- + (primitiveIndex > 0 ifTrue: [1 bitShift: 16] ifFalse: [0])!
Item was changed:
----- Method: EncoderForNewsqueakV4>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive:accessModifier: (in category 'method encoding') -----
computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex accessModifier: accessModifier
numArgs > 15 ifTrue:
[^self error: 'Cannot compile -- too many arguments'].
numTemps > 63 ifTrue:
[^self error: 'Cannot compile -- too many temporary variables'].
numLits > 65535 ifTrue:
[^self error: 'Cannot compile -- too many literals'].
+ ^(CompiledMethod headerFlagForEncoder: self)
+ + (accessModifier = #protected ifTrue: [1 bitShift: 29] ifFalse: [0])
+ + (accessModifier = #private ifTrue: [1 bitShift: 28] ifFalse: [0])
- ^SmallInteger minVal "sign bit is the flag for the alternative bytecode set"
- + (accessModifier = #protected ifTrue: [ 1 bitShift: 29 ] ifFalse: [ 0 ])
- + (accessModifier = #private ifTrue: [ 1 bitShift: 28 ] ifFalse: [ 0 ])
+ (numArgs bitShift: 24)
+ (numTemps bitShift: 18)
"+ (largeBit bitShift: 17)" "largeBit gets filled in later"
+ + (primitiveIndex > 0 ifTrue: [1 bitShift: 16] ifFalse: [0])
+ + numLits!
- + ((Smalltalk vmParameterAt: 65) == true
- ifTrue: [numLits + (primitiveIndex > 0 ifTrue: [1 bitShift: 16] ifFalse: [0])]
- ifFalse: [numLits > 255 ifTrue: [self error: 'vm does not support large methods'].
- primitiveIndex > 511 ifTrue: [self error: 'hack does not support primitive > 511'].
- (numLits bitShift: 9)
- + (primitiveIndex bitAnd: 511)])!
Item was removed:
- ----- Method: EncoderForNewsqueakV4>>generateMethodOfClass:trailer:from: (in category 'method encoding') -----
- generateMethodOfClass: aCompiledMethodClass trailer: trailer from: methodNode
- "The receiver is the root of a parse tree. Answer an instance of aCompiledMethodClass.
- The argument, trailer, is arbitrary but is typically either the reference to the source code
- that is stored with every CompiledMethod, or an encoding of the method's temporary names."
-
- | primErrNode blkSize nLits locals literals header method stack |
- primErrNode := methodNode primitiveErrorVariableName ifNotNil:
- [self fixTemp: methodNode primitiveErrorVariableName].
- methodNode ensureClosureAnalysisDone.
- self rootNode: methodNode. "this is for BlockNode>>sizeCodeForClosureValue:"
- blkSize := (methodNode block sizeCodeForEvaluatedValue: self)
- + (methodNode primitive > 0
- ifTrue: [self sizeCallPrimitive: methodNode primitive]
- ifFalse: [0])
- + (primErrNode
- ifNil: [0]
- ifNotNil:
- [primErrNode
- index: methodNode arguments size + methodNode temporaries size;
- sizeCodeForStore: self "The VM relies on storeIntoTemp: (129)"]).
- locals := methodNode arguments, methodNode temporaries, (primErrNode ifNil: [#()] ifNotNil: [{primErrNode}]).
- self noteBlockExtent: methodNode block blockExtent hasLocals: locals.
- header := self computeMethodHeaderForNumArgs: methodNode arguments size
- numTemps: locals size
- numLits: (nLits := (literals := self allLiterals) size)
- primitive: methodNode primitive.
- method := trailer
- createMethod: blkSize
- class: aCompiledMethodClass
- header: header.
- 1 to: nLits do: [:lit | method literalAt: lit put: (literals at: lit)].
- self streamToMethod: method.
- stack := ParseStack new init.
- methodNode primitive > 0 ifTrue:
- [self genCallPrimitive: methodNode primitive].
- primErrNode ifNotNil:
- [primErrNode emitCodeForStore: stack encoder: self].
- stack position: method numTemps.
- [methodNode block emitCodeForEvaluatedValue: stack encoder: self]
- on: Error "If an attempt is made to write too much code the method will be asked"
- do: [:ex| "to grow, and the grow attempt will fail in CompiledMethod class>>#new:"
- ex signalerContext sender method = (CompiledMethod class>>#new:)
- ifTrue: [^self error: 'Compiler code size discrepancy']
- ifFalse: [ex pass]].
- stack position ~= (method numTemps + 1) ifTrue:
- [^self error: 'Compiler stack discrepancy'].
- self methodStreamPosition ~= (method size - trailer size) ifTrue:
- [^self error: 'Compiler code size discrepancy'].
- method needsFrameSize: stack size - method numTemps.
- ^method!
Item was removed:
- ----- Method: EncoderForSistaV1>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method encoding') -----
- computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex
- numTemps > 63 ifTrue:
- [^self error: 'Cannot compile -- too many temporary variables'].
- numLits > 65535 ifTrue:
- [^self error: 'Cannot compile -- too many literals'].
- ^SmallInteger minVal "sign bit is the flag for the alternative bytecode set"
- + (numArgs bitShift: 24)
- + (numTemps bitShift: 18)
- "+ (largeBit bitShift: 17)" "largeBit gets filled in later"
- + numLits
- + (primitiveIndex > 0 ifTrue: [1 bitShift: 16] ifFalse: [0])!
Item was removed:
- ----- Method: EncoderForSistaV1>>generateMethodOfClass:trailer:from: (in category 'method encoding') -----
- generateMethodOfClass: aCompiledMethodClass trailer: trailer from: methodNode
- "The receiver is the root of a parse tree. Answer an instance of aCompiledMethodClass.
- The argument, trailer, is arbitrary but is typically either the reference to the source code
- that is stored with every CompiledMethod, or an encoding of the method's temporary names."
-
- | primErrNode blkSize nLits locals literals header method stack |
- primErrNode := methodNode primitiveErrorVariableName ifNotNil:
- [self fixTemp: methodNode primitiveErrorVariableName].
- methodNode ensureClosureAnalysisDone.
- self rootNode: methodNode. "this is for BlockNode>>sizeCodeForClosureValue:"
- blkSize := (methodNode block sizeCodeForEvaluatedValue: self)
- + (methodNode primitive > 0
- ifTrue: [self sizeCallPrimitive: methodNode primitive]
- ifFalse: [0])
- + (primErrNode
- ifNil: [0]
- ifNotNil:
- [primErrNode
- index: methodNode arguments size + methodNode temporaries size;
- sizeCodeForStore: self "The VM relies on storeIntoTemp: (129)"]).
- locals := methodNode arguments, methodNode temporaries, (primErrNode ifNil: [#()] ifNotNil: [{primErrNode}]).
- self noteBlockExtent: methodNode block blockExtent hasLocals: locals.
- header := self computeMethodHeaderForNumArgs: methodNode arguments size
- numTemps: locals size
- numLits: (nLits := (literals := self allLiterals) size)
- primitive: methodNode primitive.
- method := trailer
- createMethod: blkSize
- class: aCompiledMethodClass
- header: header.
- 1 to: nLits do: [:lit | method literalAt: lit put: (literals at: lit)].
- self streamToMethod: method.
- stack := ParseStack new init.
- methodNode primitive > 0 ifTrue:
- [self genCallPrimitive: methodNode primitive].
- primErrNode ifNotNil:
- [primErrNode emitCodeForStore: stack encoder: self].
- stack position: method numTemps.
- [methodNode block emitCodeForEvaluatedValue: stack encoder: self]
- on: Error "If an attempt is made to write too much code the method will be asked"
- do: [:ex| "to grow, and the grow attempt will fail in CompiledMethod class>>#new:"
- ex signalerContext sender method = (CompiledMethod class>>#new:)
- ifTrue: [^self error: 'Compiler code size discrepancy']
- ifFalse: [ex pass]].
- stack position ~= (method numTemps + 1) ifTrue:
- [^self error: 'Compiler stack discrepancy'].
- self methodStreamPosition ~= (method size - trailer size) ifTrue:
- [^self error: 'Compiler code size discrepancy'].
- method needsFrameSize: stack size - method numTemps.
- ^method!
Item was removed:
- ----- Method: InstructionClient>>callPrimitive: (in category '*BytecodeSets-instruction decoding') -----
- callPrimitive: pimIndex
- "SqueakV3PlusClosures: 239 11101111 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)
- NewsqueakV4: 249 11111001 iiiiiiii jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)
- SistaV1: 248 11111000 iiiiiiii mjjjjjjj Call Primitive #iiiiiiii + (jjjjjjj * 256)
- m=1 means inlined primitive, no hard return after execution."!
Item was removed:
- ----- Method: MethodNode>>generate:using: (in category '*BytecodeSets-code generation') -----
- generate: trailer using: aCompiledMethodClass
- "The receiver is the root of a parse tree. Answer an instance of aCompiledMethodClass.
- The argument, trailer, is arbitrary but is typically either the reference to the source code
- that is stored with every CompiledMethod, or an encoding of the method's temporary names."
-
- | method |
- self generate: trailer
- using: aCompiledMethodClass
- ifQuick:
- [:m |
- m literalAt: 2 put: encoder associationForClass;
- properties: properties.
- ^m].
- method := encoder generateMethodOfClass: aCompiledMethodClass trailer: trailer from: self.
- method properties: properties.
- ^method!
More information about the Vm-dev
mailing list