[Vm-dev] VM Maker: VMMaker.oscog-eem.126.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Sep 23 01:04:14 UTC 2011
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.126.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.126
Author: eem
Time: 22 September 2011, 6:02:25.985 pm
UUID: 6af3249f-6c5c-4e1b-8a69-f59e542154c5
Ancestors: VMMaker.oscog-eem.125
Cogit:
Fix cPICEndSize mis-computation caused by using rounded-up
closedPICSize. Compute cPICEndSize and /then/ round-up closedPICSize.
Fix for simulation callTargetFromReturnAddress: asserts in relocation calls.
=============== Diff against VMMaker.oscog-eem.125 ===============
Item was changed:
----- Method: CogIA32Compiler>>relocateCallBeforeReturnPC:by: (in category 'inline cacheing') -----
relocateCallBeforeReturnPC: retpc by: delta
| distance |
delta ~= 0 ifTrue:
[distance := ((objectMemory byteAt: retpc - 1) << 24)
+ ((objectMemory byteAt: retpc - 2) << 16)
+ ((objectMemory byteAt: retpc - 3) << 8)
+ (objectMemory byteAt: retpc - 4).
distance := distance + delta.
objectMemory
byteAt: retpc - 1 put: (distance >> 24 bitAnd: 16rFF);
byteAt: retpc - 2 put: (distance >> 16 bitAnd: 16rFF);
byteAt: retpc - 3 put: (distance >> 8 bitAnd: 16rFF);
byteAt: retpc - 4 put: (distance bitAnd: 16rFF).
false
+ ifTrue: [self assert: (self callTargetFromReturnAddress: retpc) signedIntToLong >= cogit minCallAddress]
+ ifFalse: [(self callTargetFromReturnAddress: retpc) signedIntToLong >= cogit minCallAddress ifFalse:
- ifTrue: [self assert: (self callTargetFromReturnAddress: retpc) >= cogit minCallAddress]
- ifFalse: [(self callTargetFromReturnAddress: retpc) >= cogit minCallAddress ifFalse:
[self error: 'relocating call to invalid address']]]!
Item was changed:
----- Method: CogIA32Compiler>>rewriteCallAt:target: (in category 'inline cacheing') -----
rewriteCallAt: callSiteReturnAddress target: callTargetAddress
"Rewrite a call instruction to call a different target. This variant is used to link PICs
in ceSendMiss et al, and to rewrite cached primitive calls. Answer the extent of
the code change which is used to compute the range of the icache to flush."
<var: #callSiteReturnAddress type: #usqInt>
| callDistance |
"self cCode: ''
inSmalltalk: [cogit disassembleFrom: callSiteReturnAddress - 10 to: callSiteReturnAddress - 1]."
false
ifTrue: [self assert: callTargetAddress >= cogit minCallAddress]
ifFalse: [callTargetAddress >= cogit minCallAddress ifFalse:
[self error: 'linking callsite to invalid address']].
callDistance := (callTargetAddress - callSiteReturnAddress) signedIntToLong.
objectMemory
byteAt: callSiteReturnAddress - 1 put: (callDistance >> 24 bitAnd: 16rFF);
byteAt: callSiteReturnAddress - 2 put: (callDistance >> 16 bitAnd: 16rFF);
byteAt: callSiteReturnAddress - 3 put: (callDistance >> 8 bitAnd: 16rFF);
byteAt: callSiteReturnAddress - 4 put: (callDistance bitAnd: 16rFF).
+ self assert: (self callTargetFromReturnAddress: callSiteReturnAddress) signedIntToLong = callTargetAddress.
- self assert: (self callTargetFromReturnAddress: callSiteReturnAddress) = callTargetAddress.
"self cCode: ''
inSmalltalk: [cogit disassembleFrom: callSiteReturnAddress - 10 to: callSiteReturnAddress - 1]."
^5!
Item was changed:
----- Method: CogIA32Compiler>>rewriteInlineCacheAt:tag:target: (in category 'inline cacheing') -----
rewriteInlineCacheAt: callSiteReturnAddress tag: cacheTag target: callTargetAddress
"Rewrite an inline cache to call a different target for a new tag. This variant is used
to link unlinked sends in ceSend:to:numArgs: et al. Answer the extent of the code
change which is used to compute the range of the icache to flush."
<var: #callSiteReturnAddress type: #usqInt>
| callDistance |
"self cCode: ''
inSmalltalk: [cogit disassembleFrom: callSiteReturnAddress - 10 to: callSiteReturnAddress - 1]."
false
ifTrue: [self assert: callTargetAddress >= cogit minCallAddress]
ifFalse: [callTargetAddress >= cogit minCallAddress ifFalse:
[self error: 'linking callsite to invalid address']].
callDistance := (callTargetAddress - callSiteReturnAddress) signedIntToLong.
objectMemory
byteAt: callSiteReturnAddress - 1 put: (callDistance >> 24 bitAnd: 16rFF);
byteAt: callSiteReturnAddress - 2 put: (callDistance >> 16 bitAnd: 16rFF);
byteAt: callSiteReturnAddress - 3 put: (callDistance >> 8 bitAnd: 16rFF);
byteAt: callSiteReturnAddress - 4 put: (callDistance bitAnd: 16rFF);
byteAt: callSiteReturnAddress - 6 put: (cacheTag >> 24 bitAnd: 16rFF);
byteAt: callSiteReturnAddress - 7 put: (cacheTag >> 16 bitAnd: 16rFF);
byteAt: callSiteReturnAddress - 8 put: (cacheTag >> 8 bitAnd: 16rFF);
byteAt: callSiteReturnAddress - 9 put: (cacheTag bitAnd: 16rFF).
+ self assert: (self callTargetFromReturnAddress: callSiteReturnAddress) signedIntToLong = callTargetAddress.
- self assert: (self callTargetFromReturnAddress: callSiteReturnAddress) = callTargetAddress.
"self cCode: ''
inSmalltalk: [cogit disassembleFrom: callSiteReturnAddress - 10 to: callSiteReturnAddress - 1]."
^10!
Item was changed:
----- Method: Cogit>>generateClosedPICPrototype (in category 'initialization') -----
generateClosedPICPrototype
"Generate the prototype ClosedPIC to determine how much space as full PIC takes.
When we first allocate a closed PIC it only has one or two cases and we want to grow it.
So we have to determine how big a full one is before hand."
| headerSize |
numPICCases := 6.
"stack allocate the various collections so that they
are effectively garbage collected on return."
self allocateOpcodes: numPICCases * 7 bytecodes: 0.
self compileClosedPICPrototype.
self computeMaximumSizes.
headerSize := self sizeof: CogMethod.
+ closedPICSize := headerSize + (self generateInstructionsAt: methodZoneBase + headerSize).
- closedPICSize := methodZone roundUpLength: headerSize + (self generateInstructionsAt: methodZoneBase + headerSize).
firstCPICCaseOffset := endCPICCase0 address - methodZoneBase.
cPICCaseSize := endCPICCase1 address - endCPICCase0 address.
+ cPICEndSize := closedPICSize - (numPICCases - 1 * cPICCaseSize + firstCPICCaseOffset).
+ closedPICSize := methodZone roundUpLength: closedPICSize
- cPICEndSize := closedPICSize - (numPICCases - 1 * cPICCaseSize + firstCPICCaseOffset)
"self cCode: ''
inSmalltalk:
[| end |
end := self outputInstructionsAt: methodZoneBase + headerSize.
self disassembleFrom: methodZoneBase + headerSize to: end - 1.
self halt]"!
More information about the Vm-dev
mailing list