[Vm-dev] VM Maker: VMMaker.oscog-eem.1626.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Jan 9 20:32:41 UTC 2016
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1626.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1626
Author: eem
Time: 9 January 2016, 12:30:43.60787 pm
UUID: 5153564f-5657-42ca-a4c9-84b55b308375
Ancestors: VMMaker.oscog-eem.1625
x64 Cogit:
cecaptureCStackPointers cannot assume VarBaseReg is caller-saved and should save and restore it if used.
=============== Diff against VMMaker.oscog-eem.1625 ===============
Item was changed:
----- Method: CogARMCompiler>>maybeEstablishVarBase (in category 'abstract instructions') -----
maybeEstablishVarBase
"The receiver has a VarBaseReg; generate the code to set it to its value."
+ <inline: true>
cogit MoveCq: cogit varBaseAddress R: VarBaseReg!
Item was added:
+ ----- Method: CogARMCompiler>>maybeRestoreVarBase (in category 'abstract instructions') -----
+ maybeRestoreVarBase
+ "The receiver has a VarBaseReg; generate the code to pop its value."
+ <inline: true>
+ cogit PopR: VarBaseReg!
Item was added:
+ ----- Method: CogARMCompiler>>maybeSaveVarBase (in category 'abstract instructions') -----
+ maybeSaveVarBase
+ "The receiver has a VarBaseReg; generate the code to push its value."
+ <inline: true>
+ cogit PushR: VarBaseReg!
Item was changed:
----- Method: CogAbstractInstruction>>maybeEstablishVarBase (in category 'abstract instructions') -----
maybeEstablishVarBase
+ "If the receiver has a VarBaseReg, generate the code to set it to its value.
+ By default do nothing."
+ <inline: true>!
- "If the receiver has a VarBaseReg, generate the code to set it to its value."
- self subclassResponsibility!
Item was added:
+ ----- Method: CogAbstractInstruction>>maybeRestoreVarBase (in category 'abstract instructions') -----
+ maybeRestoreVarBase
+ "If the receiver has a VarBaseReg, generate the code to pop its value.
+ By default do nothing."
+ <inline: true>!
Item was added:
+ ----- Method: CogAbstractInstruction>>maybeSaveVarBase (in category 'abstract instructions') -----
+ maybeSaveVarBase
+ "If the receiver has a VarBaseReg, generate the code to push its value.
+ By default do nothing."
+ <inline: true>!
Item was removed:
- ----- Method: CogIA32Compiler>>maybeEstablishVarBase (in category 'abstract instructions') -----
- maybeEstablishVarBase
- "The receiver does not have a VarBaseReg; do nothing."!
Item was removed:
- ----- Method: CogMIPSELCompiler>>maybeEstablishVarBase (in category 'abstract instructions') -----
- maybeEstablishVarBase
- "The receiver has a VarBaseReg; generate the code to set it to its value."
- cogit MoveCq: cogit varBaseAddress R: VarBaseReg!
Item was changed:
----- Method: CogX64Compiler>>maybeEstablishVarBase (in category 'abstract instructions') -----
maybeEstablishVarBase
"The receiver has a VarBaseReg; generate the code to set it to its value."
+ <inline: true>
cogit MoveCq: cogit varBaseAddress R: VarBaseReg!
Item was added:
+ ----- Method: CogX64Compiler>>maybeRestoreVarBase (in category 'abstract instructions') -----
+ maybeRestoreVarBase
+ "The receiver has a VarBaseReg; generate the code to pop its value."
+ <inline: true>
+ cogit PopR: VarBaseReg!
Item was added:
+ ----- Method: CogX64Compiler>>maybeSaveVarBase (in category 'abstract instructions') -----
+ maybeSaveVarBase
+ "The receiver has a VarBaseReg; generate the code to push its value."
+ <inline: true>
+ cogit PushR: VarBaseReg!
Item was changed:
----- Method: Cogit>>generateCaptureCStackPointers: (in category 'initialization') -----
generateCaptureCStackPointers: captureFramePointer
"Generate the routine that writes the current values of the C frame and stack pointers into
variables. These are used to establish the C stack in trampolines back into the C run-time.
This is a presumptuous quick hack for x86. It is presumptuous for two reasons. Firstly
the system's frame and stack pointers may differ from those we use in generated code,
e.g. on register-rich RISCs. Secondly the ABI may not support a simple frameless call
as written here (for example 128-bit stack alignment on Mac OS X)."
| startAddress |
<inline: false>
self allocateOpcodes: 32 bytecodes: 0.
startAddress := methodZoneBase.
+ backEnd
+ maybeSaveVarBase;
+ maybeEstablishVarBase. "Must happen first; value may be used in accessing any of the following addresses"
- backEnd maybeEstablishVarBase. "Must happen first; value may be used in accessing any of the following addresses"
captureFramePointer ifTrue:
[self MoveR: FPReg Aw: self cFramePointerAddress].
"Capture the stack pointer prior to the call."
backEnd leafCallStackPointerDelta = 0
ifTrue: [self MoveR: SPReg Aw: self cStackPointerAddress]
ifFalse: [self MoveR: SPReg R: TempReg.
self AddCq: backEnd leafCallStackPointerDelta R: TempReg.
self MoveR: TempReg Aw: self cStackPointerAddress].
+ backEnd
+ maybeRestoreVarBase.
self RetN: 0.
self outputInstructionsForGeneratedRuntimeAt: startAddress.
processor flushICacheFrom: startAddress asUnsignedInteger to: methodZoneBase asUnsignedInteger.
self recordGeneratedRunTime: 'ceCaptureCStackPointers' address: startAddress.
ceCaptureCStackPointers := self cCoerceSimple: startAddress to: #'void (*)(void)'!
More information about the Vm-dev
mailing list