Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.564.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.564 Author: eem Time: 17 December 2013, 5:41:30.917 pm UUID: 70d96811-1a51-4f85-9f12-cb5a3ba8a8bf Ancestors: VMMaker.oscog-eem.563 Make the instantiation primtijevs fail for format 7 (forwarded format) and name this for use as the format of immediate classes. Include both variants of the get class tag code in the Spur obj rep. =============== Diff against VMMaker.oscog-eem.563 =============== Item was changed: ----- Method: CogObjectRepresentationFor32BitSpur>>getInlineCacheClassTagFrom:into: (in category 'compile abstract instructions') ----- getInlineCacheClassTagFrom: sourceReg into: destReg "Extract the inline cache tag for the object in sourceReg into destReg. The inline cache tag for a given object is the value loaded in inline caches to distinguish objects of different classes. In Spur this is either the tags for immediates, (with 1 & 3 collapsed to 1 for SmallIntegers, and 2 collapsed to 0 for Characters), or the receiver's classIndex. Generate something like this: Lentry: movl rSource, rDest andl $0x3, rDest jz LnotImm andl $1, rDest j Lcmp LnotImm: movl 0(%edx), rDest andl $0x3fffff, rDest Lcmp: At least on a 2.2GHz Intel Core i7 it is slightly faster, 136m sends/sec vs 130m sends/sec for nfib in tinyBenchmarks, than Limm: andl $0x1, rDest j Lcmp Lentry: movl rSource, rDest andl $0x3, rDest jnz Limm movl 0(%edx), rDest andl $0x3fffff, rDest Lcmp: " + | immLabel jumpNotImm entryLabel jumpCompare | + <var: #immLabel type: #'AbstractInstruction *'> - | jumpNotImm entryLabel jumpCompare | <var: #jumpNotImm type: #'AbstractInstruction *'> <var: #entryLabel type: #'AbstractInstruction *'> <var: #jumpCompare type: #'AbstractInstruction *'> + true + ifTrue: + [cogit AlignmentNops: (BytesPerWord max: 8). + entryLabel := cogit Label. + cogit MoveR: sourceReg R: destReg. + cogit AndCq: objectMemory tagMask R: destReg. + jumpNotImm := cogit JumpZero: 0. + cogit AndCq: 1 R: destReg. + jumpCompare := cogit Jump: 0. + "Get least significant half of header word in destReg" + self flag: #endianness. + jumpNotImm jmpTarget: + (cogit MoveMw: 0 r: sourceReg R: destReg). + jumpCompare jmpTarget: + (cogit AndCq: objectMemory classIndexMask R: destReg)] + ifFalse: + [cogit AlignmentNops: BytesPerWord. + immLabel := cogit Label. + cogit AndCq: 1 R: destReg. + jumpCompare := cogit Jump: 0. + cogit AlignmentNops: BytesPerWord. + entryLabel := cogit Label. + cogit MoveR: sourceReg R: destReg. + cogit AndCq: objectMemory tagMask R: destReg. + cogit JumpNonZero: immLabel. + self flag: #endianness. + "Get least significant half of header word in destReg" + cogit MoveMw: 0 r: sourceReg R: destReg. + cogit AndCq: objectMemory classIndexMask R: destReg. + jumpCompare jmpTarget: cogit Label]. - cogit AlignmentNops: (BytesPerWord max: 8). - entryLabel := cogit Label. - cogit MoveR: sourceReg R: destReg. - cogit AndCq: objectMemory tagMask R: destReg. - jumpNotImm := cogit JumpZero: 0. - cogit AndCq: 1 R: destReg. - jumpCompare := cogit Jump: 0. - "Get least significant half of header word in destReg" - self flag: #endianness. - jumpNotImm jmpTarget: - (cogit MoveMw: 0 r: sourceReg R: destReg). - jumpCompare jmpTarget: - (cogit AndCq: objectMemory classIndexMask R: destReg). ^entryLabel! Item was changed: ----- Method: Spur32BitMemoryManager>>instantiateClass:indexableSize: (in category 'instantiation') ----- instantiateClass: classObj indexableSize: nElements | instSpec classFormat numSlots classIndex newObj fillValue | classFormat := self formatOfClass: classObj. instSpec := self instSpecOfClassFormat: classFormat. fillValue := 0. instSpec caseOf: { [self arrayFormat] -> [numSlots := nElements. fillValue := nilObj]. [self indexablePointersFormat] -> [numSlots := (self fixedFieldsOfClassFormat: classFormat) + nElements. fillValue := nilObj]. [self weakArrayFormat] -> [numSlots := (self fixedFieldsOfClassFormat: classFormat) + nElements. fillValue := nilObj]. [self sixtyFourBitIndexableFormat] -> [numSlots := nElements * 2]. [self firstLongFormat] -> [numSlots := nElements]. [self firstShortFormat] -> [numSlots := nElements + 1 // 2. instSpec := instSpec + (nElements bitAnd: 1)]. [self firstByteFormat] -> [numSlots := nElements + 3 // 4. instSpec := instSpec + (4 - nElements bitAnd: 3)]. [self firstCompiledMethodFormat] -> [numSlots := nElements + 3 // 4. instSpec := instSpec + (4 - nElements bitAnd: 3)] } otherwise: ["some Squeak images include funky fixed subclasses of abstract variable superclasses. e.g. DirectoryEntry as a subclass of ArrayedCollection. Allow fixed classes to be instantiated here iff nElements = 0." + (nElements ~= 0 or: [instSpec > self lastPointerFormat]) ifTrue: - (nElements ~= 0 or: [instSpec >= self sixtyFourBitIndexableFormat]) ifTrue: [^nil]. numSlots := self fixedFieldsOfClassFormat: classFormat]. "non-indexable" classIndex := self ensureBehaviorHash: classObj. classIndex < 0 ifTrue: [coInterpreter primitiveFailFor: classIndex negated. ^nil]. numSlots > self maxSlotsForNewSpaceAlloc ifTrue: [newObj := self allocateSlotsInOldSpace: numSlots format: instSpec classIndex: classIndex] ifFalse: [newObj := self allocateSlots: numSlots format: instSpec classIndex: classIndex]. newObj ifNotNil: [self fillObj: newObj numSlots: numSlots with: fillValue]. ^newObj! Item was changed: ----- Method: Spur64BitMemoryManager>>instantiateClass:indexableSize: (in category 'instantiation') ----- instantiateClass: classObj indexableSize: nElements | instSpec classFormat numSlots classIndex newObj fillValue | classFormat := self formatOfClass: classObj. instSpec := self instSpecOfClassFormat: classFormat. fillValue := 0. instSpec caseOf: { [self arrayFormat] -> [numSlots := nElements. fillValue := nilObj]. [self indexablePointersFormat] -> [numSlots := (self fixedFieldsOfClassFormat: classFormat) + nElements. fillValue := nilObj]. [self weakArrayFormat] -> [numSlots := (self fixedFieldsOfClassFormat: classFormat) + nElements. fillValue := nilObj]. [self sixtyFourBitIndexableFormat] -> [numSlots := nElements]. [self firstLongFormat] -> [numSlots := nElements + 1 // 2. instSpec := instSpec + (nElements bitAnd: 1)]. [self firstShortFormat] -> [numSlots := nElements + 3 // 4. instSpec := instSpec + (4 - nElements bitAnd: 3)]. [self firstByteFormat] -> [numSlots := nElements + 7 // 8. instSpec := instSpec + (8 - nElements bitAnd: 7)]. [self firstCompiledMethodFormat] -> [numSlots := nElements + 7 // 8. instSpec := instSpec + (8 - nElements bitAnd: 7)] } otherwise: ["some Squeak images include funky fixed subclasses of abstract variable superclasses. e.g. DirectoryEntry as a subclass of ArrayedCollection. Allow fixed classes to be instantiated here iff nElements = 0." + (nElements ~= 0 or: [instSpec > self lastPointerFormat]) ifTrue: - (nElements ~= 0 or: [instSpec >= self sixtyFourBitIndexableFormat]) ifTrue: [^nil]. numSlots := self fixedFieldsOfClassFormat: classFormat]. "non-indexable" classIndex := self ensureBehaviorHash: classObj. classIndex < 0 ifTrue: [coInterpreter primitiveFailFor: classIndex negated. ^nil]. numSlots > self maxSlotsForNewSpaceAlloc ifTrue: [newObj := self allocateSlotsInOldSpace: numSlots format: instSpec classIndex: classIndex] ifFalse: [newObj := self allocateSlots: numSlots format: instSpec classIndex: classIndex]. newObj ifNotNil: [self fillObj: newObj numSlots: numSlots with: fillValue]. ^newObj! Item was added: + ----- Method: SpurMemoryManager>>instSpecForImmediateClasses (in category 'header formats') ----- + instSpecForImmediateClasses + "Use the format for forwarded objects for immediate classes. Immediate classes (SmallInteger, + Character, etc) can't be instantiated, so the inst spec should be an invalid one to cause the + instantiation primitives to fail. The forwardedFormat is internal to the SpurMemoryManager, + used to mark forwarded objects only, and so is suitable." + ^self forwardedFormat! Item was changed: ----- Method: SpurSegmentManager>>initForBootstrap (in category 'spur bootstrap') ----- initForBootstrap + numSegInfos = 0 ifTrue: + [self allocateOrExtendSegmentInfos]! - self allocateOrExtendSegmentInfos! |
Free forum by Nabble | Edit this page |