Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.744.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.744 Author: eem Time: 1 June 2014, 11:27:29.023 am UUID: 22b7a9e4-4046-41fd-a835-969d865245e0 Ancestors: VMMaker.oscog-eem.743
In Spur refactor closure creeation in the Cogit to not flush copied values to the stack, assigning them direct to the closure. Generates much more compact code.
=============== Diff against VMMaker.oscog-eem.743 ===============
Item was added: + ----- Method: CogObjectRepresentation>>createsClosuresInline (in category 'bytecode generator support') ----- + createsClosuresInline + "Answer if the object representation allocates closures inline. By + default answer false. Better code can be generated when creating + closures inline if copied values are /not/ flushed to the stack." + ^false!
Item was added: + ----- Method: CogObjectRepresentationFor32BitSpur>>createsClosuresInline (in category 'bytecode generator support') ----- + createsClosuresInline + "Answer if the object representation allocates closures inline. By + default answer false. Better code can be generated when creating + closures inline if copied values are /not/ flushed to the stack." + ^true!
Item was changed: ----- Method: CogObjectRepresentationFor32BitSpur>>genCreateClosureAt:numArgs:numCopied:contextNumArgs:large:inBlock: (in category 'bytecode generator support') ----- genCreateClosureAt: bcpc numArgs: numArgs numCopied: numCopied contextNumArgs: ctxtNumArgs large: isLargeCtxt inBlock: isInBlock "Create a closure with the given startpc, numArgs and numCopied within a context with ctxtNumArgs, large if isLargeCtxt that is in a block if isInBlock. If numCopied > 0 pop those values off the stack." + self genNoPopCreateClosureAt: bcpc + numArgs: numArgs + numCopied: numCopied + contextNumArgs: ctxtNumArgs + large: isLargeCtxt + inBlock: isInBlock. - | slotSize header skip | - <var: #skip type: #'AbstractInstruction *'> - - "First get thisContext into ReceiverResultRega and thence in ClassReg." - self genGetActiveContextNumArgs: ctxtNumArgs large: isLargeCtxt inBlock: isInBlock. - cogit MoveR: ReceiverResultReg R: ClassReg. - - slotSize := ClosureFirstCopiedValueIndex + numCopied. - header := objectMemory - headerForSlots: slotSize - format: objectMemory indexablePointersFormat - classIndex: ClassBlockClosureCompactIndex. - cogit - MoveAw: objectMemory freeStartAddress R: ReceiverResultReg; - MoveCq: (self cCoerceSimple: header to: #usqInt) R: TempReg; - MoveR: TempReg Mw: 0 r: ReceiverResultReg; - MoveCq: header >> 32 R: TempReg; - MoveR: TempReg Mw: 4 r: ReceiverResultReg; - MoveR: ReceiverResultReg R: TempReg; - AddCq: (objectMemory smallObjectBytesForSlots: slotSize) R: TempReg; - MoveR: TempReg Aw: objectMemory freeStartAddress; - CmpCq: objectMemory getScavengeThreshold R: TempReg. - skip := cogit JumpBelow: 0. - cogit CallRT: ceSheduleScavengeTrampoline. - skip jmpTarget: cogit Label. - - cogit - MoveR: ClassReg Mw: ClosureOuterContextIndex * BytesPerOop + BaseHeaderSize r: ReceiverResultReg; - MoveCq: (objectMemory integerObjectOf: bcpc) R: TempReg; - MoveR: TempReg Mw: ClosureStartPCIndex * BytesPerOop + BaseHeaderSize r: ReceiverResultReg; - MoveCq: (objectMemory integerObjectOf: numArgs) R: TempReg; - MoveR: TempReg Mw: ClosureNumArgsIndex * BytesPerOop + BaseHeaderSize r: ReceiverResultReg. 1 to: numCopied do: [:i| cogit PopR: TempReg; MoveR: TempReg Mw: numCopied - i + ClosureFirstCopiedValueIndex * BytesPerOop + BaseHeaderSize r: ReceiverResultReg]. ^0!
Item was added: + ----- Method: CogObjectRepresentationFor32BitSpur>>genNoPopCreateClosureAt:numArgs:numCopied:contextNumArgs:large:inBlock: (in category 'bytecode generator support') ----- + genNoPopCreateClosureAt: bcpc numArgs: numArgs numCopied: numCopied contextNumArgs: ctxtNumArgs large: isLargeCtxt inBlock: isInBlock + "Create a closure with the given startpc, numArgs and numCopied + within a context with ctxtNumArgs, large if isLargeCtxt that is in a + block if isInBlock. Do /not/ initialize the copied values." + | slotSize header skip | + <var: #skip type: #'AbstractInstruction *'> + + "First get thisContext into ReceiverResultRega and thence in ClassReg." + self genGetActiveContextNumArgs: ctxtNumArgs large: isLargeCtxt inBlock: isInBlock. + cogit MoveR: ReceiverResultReg R: ClassReg. + + slotSize := ClosureFirstCopiedValueIndex + numCopied. + header := objectMemory + headerForSlots: slotSize + format: objectMemory indexablePointersFormat + classIndex: ClassBlockClosureCompactIndex. + cogit + MoveAw: objectMemory freeStartAddress R: ReceiverResultReg; + MoveCq: (self cCoerceSimple: header to: #usqInt) R: TempReg; + MoveR: TempReg Mw: 0 r: ReceiverResultReg; + MoveCq: header >> 32 R: TempReg; + MoveR: TempReg Mw: 4 r: ReceiverResultReg; + MoveR: ReceiverResultReg R: TempReg; + AddCq: (objectMemory smallObjectBytesForSlots: slotSize) R: TempReg; + MoveR: TempReg Aw: objectMemory freeStartAddress; + CmpCq: objectMemory getScavengeThreshold R: TempReg. + skip := cogit JumpBelow: 0. + cogit CallRT: ceSheduleScavengeTrampoline. + skip jmpTarget: cogit Label. + + cogit + MoveR: ClassReg Mw: ClosureOuterContextIndex * BytesPerOop + BaseHeaderSize r: ReceiverResultReg; + MoveCq: (objectMemory integerObjectOf: bcpc) R: TempReg; + MoveR: TempReg Mw: ClosureStartPCIndex * BytesPerOop + BaseHeaderSize r: ReceiverResultReg; + MoveCq: (objectMemory integerObjectOf: numArgs) R: TempReg; + MoveR: TempReg Mw: ClosureNumArgsIndex * BytesPerOop + BaseHeaderSize r: ReceiverResultReg. + ^0!
Item was changed: ----- Method: StackToRegisterMappingCogit>>genPushClosureCopyCopiedValuesBytecode (in category 'bytecode generators') ----- genPushClosureCopyCopiedValuesBytecode "Block compilation. At this point in the method create the block. Note its start and defer generating code for it until after the method and any other preceeding blocks. The block's actual code will be compiled later." "143 10001111 llllkkkk jjjjjjjj iiiiiiii Push Closure Num Copied llll Num Args kkkk BlockSize jjjjjjjjiiiiiiii" | numArgs numCopied | self assert: needsFrame. self addBlockStartAt: bytecodePC + 4 "0 relative" numArgs: (numArgs := byte1 bitAnd: 16rF) numCopied: (numCopied := byte1 >> 4) span: (byte2 << 8) + byte3. + + objectRepresentation createsClosuresInline ifTrue: + [self assert: objectRepresentation getActiveContextAllocatesInMachineCode. + optStatus isReceiverResultRegLive: false. + self ssAllocateCallReg: ReceiverResultReg + and: SendNumArgsReg + and: ClassReg. + objectRepresentation + genNoPopCreateClosureAt: bytecodePC + 5 "1 relative" + numArgs: numArgs + numCopied: numCopied + contextNumArgs: methodOrBlockNumArgs + large: (coInterpreter methodNeedsLargeContext: methodObj) + inBlock: inBlock. + 1 to: numCopied do: + [:i| | reg | + reg := self ssStorePop: true toPreferredReg: TempReg. + objectRepresentation + genStoreSourceReg: reg + slotIndex: ClosureFirstCopiedValueIndex + numCopied - i + intoNewObjectInDestReg: ReceiverResultReg]. + ^self ssPushRegister: ReceiverResultReg]. + numCopied > 0 ifTrue: [self ssFlushTo: simStackPtr]. optStatus isReceiverResultRegLive: false. objectRepresentation getActiveContextAllocatesInMachineCode ifTrue: [self ssAllocateCallReg: ReceiverResultReg and: SendNumArgsReg and: ClassReg] ifFalse: [self ssAllocateCallReg: SendNumArgsReg and: ReceiverResultReg]. objectRepresentation genCreateClosureAt: bytecodePC + 5 "1 relative" numArgs: numArgs numCopied: numCopied contextNumArgs: methodOrBlockNumArgs large: (coInterpreter methodNeedsLargeContext: methodObj) inBlock: inBlock. numCopied > 0 ifTrue: [self ssPop: numCopied]. ^self ssPushRegister: ReceiverResultReg!
vm-dev@lists.squeakfoundation.org