|
From: John M M. <jo...@us...> - 2004-02-19 04:23:27
|
Update of /cvsroot/squeak/squeak/platforms/Mac OS/vm/specialChangeSets/Old In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26777/squeak/platforms/Mac OS/vm/specialChangeSets/Old Added Files: SlightlyFasterActivate-JMM.3.cs Log Message: Previously used before VMMaker3-7b1.sar --- NEW FILE: SlightlyFasterActivate-JMM.3.cs --- 'From Squeak3.6beta of ''4 July 2003'' [latest update: #5373] on 7 August 2003 at 2:27:37 pm'! "Change Set: SlightlyFasterActivate-JMM Date: 6 August 2003 Author: jo...@sm... Alter activateNewMethod to simplify common subexpressions for the compiler and to simplify the two for loops so gcc can produce better assembler. This results in a 2% faster send/sec rate for powerpc"! !Interpreter methodsFor: 'message sending' stamp: 'JMM 8/6/2003 09:48'! activateNewMethod | newContext methodHeader initialIP tempCount nilOop where | methodHeader _ self headerOf: newMethod. newContext _ self allocateOrRecycleContext: (methodHeader bitAnd: LargeContextBit). initialIP _ ((LiteralStart + (self literalCountOfHeader: methodHeader)) * 4) + 1. tempCount _ (methodHeader >> 19) bitAnd: 16r3F. "Assume: newContext will be recorded as a root if necessary by the call to newActiveContext: below, so we can use unchecked stores." where _ (self cCoerce: newContext to: 'char *') + BaseHeaderSize. self longAt: where + (SenderIndex << 2) put: activeContext. self longAt: where + (InstructionPointerIndex << 2) put: (self integerObjectOf: initialIP). self longAt: where + (StackPointerIndex << 2) put: (self integerObjectOf: tempCount). self longAt: where + (MethodIndex << 2) put: newMethod. "Copy the reciever and arguments..." 0 to: argumentCount do: [:i | self longAt: where + ((ReceiverIndex+i) << 2) put: (self stackValue: argumentCount-i)]. "clear remaining temps to nil in case it has been recycled" nilOop _ nilObj. argumentCount+1+ReceiverIndex to: tempCount+ReceiverIndex do: [:i | self longAt: where + (i << 2) put: nilOop]. self pop: argumentCount + 1. reclaimableContextCount _ reclaimableContextCount + 1. self newActiveContext: newContext.! ! !Interpreter methodsFor: 'message sending' stamp: 'JMM 8/7/2003 14:27'! internalActivateNewMethod | methodHeader newContext tempCount argCount2 needsLarge where | self inline: true. methodHeader _ self headerOf: newMethod. needsLarge _ methodHeader bitAnd: LargeContextBit. (needsLarge = 0 and: [freeContexts ~= NilContext]) ifTrue: [newContext _ freeContexts. freeContexts _ self fetchPointer: 0 ofObject: newContext] ifFalse: ["Slower call for large contexts or empty free list" self externalizeIPandSP. newContext _ self allocateOrRecycleContext: needsLarge. self internalizeIPandSP]. tempCount _ (methodHeader >> 19) bitAnd: 16r3F. "Assume: newContext will be recorded as a root if necessary by the call to newActiveContext: below, so we can use unchecked stores." where _ (self cCoerce: newContext to: 'char *') + BaseHeaderSize. self longAt: where + (SenderIndex << 2) put: activeContext. self longAt: where + (InstructionPointerIndex << 2) put: (self integerObjectOf: (((LiteralStart + (self literalCountOfHeader: methodHeader)) * 4) + 1)). self longAt: where + (StackPointerIndex << 2) put: (self integerObjectOf: tempCount). self longAt: where + (MethodIndex << 2) put: newMethod. "Copy the reciever and arguments..." argCount2 _ argumentCount. 0 to: argCount2 do: [:i | self longAt: where + ((ReceiverIndex+i) << 2) put: (self internalStackValue: argCount2-i)]. "clear remaining temps to nil in case it has been recycled" methodHeader _ nilObj. "methodHeader here used just as faster (register?) temp" argCount2+1+ReceiverIndex to: tempCount+ReceiverIndex do: [:i | self longAt: where + (i << 2) put: methodHeader]. self internalPop: argCount2 + 1. reclaimableContextCount _ reclaimableContextCount + 1. self internalNewActiveContext: newContext. ! ! |