[Vm-dev] VM Maker: VMMaker.oscog-eem.1471.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Sep 27 18:10:01 UTC 2015


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1471.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.1471
Author: eem
Time: 27 September 2015, 10:44:07.215 am
UUID: 59ce1851-0880-4d7b-990f-a19c882dbeae
Ancestors: VMMaker.oscog-eem.1470

Cogit:
Refactor context creation generation code in Sour object representations for sharing between 32 and 64 bits.  Implement some 64-bit obj rep generation support.

=============== Diff against VMMaker.oscog-eem.1470 ===============

Item was removed:
- ----- 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.
- 	1 to: numCopied do:
- 		[:i|
- 		cogit
- 			PopR: TempReg;
- 			MoveR: TempReg
- 				Mw: numCopied - i + ClosureFirstCopiedValueIndex * objectMemory bytesPerOop + objectMemory baseHeaderSize
- 					r: ReceiverResultReg].
- 	^0!

Item was removed:
- ----- Method: CogObjectRepresentationFor32BitSpur>>genGetActiveContextLarge:inBlock: (in category 'initialization') -----
- genGetActiveContextLarge: isLarge inBlock: isInBlock
- 	"Create a trampoline to answer the active context that will
- 	 answer it if a frame is already married, and create it otherwise.
- 	 Assume numArgs is in SendNumArgsReg and ClassReg is free."
- 	| header slotSize jumpSingle loopHead jumpNeedScavenge continuation exit |
- 	<var: #jumpNeedScavenge type: #'AbstractInstruction *'>
- 	<var: #continuation type: #'AbstractInstruction *'>
- 	<var: #jumpSingle type: #'AbstractInstruction *'>
- 	<var: #loopHead type: #'AbstractInstruction *'>
- 	<var: #exit type: #'AbstractInstruction *'>
- 	cogit "load the flag; stash it in both TempReg & ClassReg; do the compare (a prime candidated for use of AndCq:R:R:)"
- 		MoveMw: FoxMethod r: FPReg R: ClassReg;
- 		AndCq: MFMethodFlagHasContextFlag R: ClassReg R: TempReg.
- 	jumpSingle := cogit JumpZero: 0. "jump if flag bit not set"
- 	cogit "since the flag bit was set, get the context in the receiver reg and return"
- 		MoveMw: FoxThisContext r: FPReg R: ReceiverResultReg;
- 		RetN: 0.
- 	jumpSingle jmpTarget: cogit Label.
- 
- 	"OK, it doesn't exist; instantiate and initialize it"
- 	"set the hasContext flag; See CoInterpreter class>>initializeFrameIndices"
- 	cogit
- 		OrCq: MFMethodFlagHasContextFlag R: ClassReg;
- 		MoveR: ClassReg Mw: FoxMethod r: FPReg.
- 	"now get the home CogMethod into ClassReg and save for post-instantiation."
- 	isInBlock
- 		ifTrue:
- 			[cogit
- 				SubCq: 3 R: ClassReg; "-3 is -(hasContext+isBlock) flags"
- 				MoveM16: 0 r: ClassReg R: TempReg;
- 				SubR: TempReg R: ClassReg]
- 		ifFalse:
- 			[cogit SubCq: 1 R: ClassReg]. "-1 is hasContext flag"
- 
- 	"instantiate the context..."
- 	slotSize := isLarge ifTrue: [LargeContextSlots] ifFalse: [SmallContextSlots].
- 	header := objectMemory
- 					headerForSlots: slotSize
- 					format: objectMemory indexablePointersFormat
- 					classIndex: ClassMethodContextCompactIndex.
- 	self flag: #endianness.
- 	cogit
- 		MoveAw: objectMemory freeStartAddress R: ReceiverResultReg;
- 		MoveCq: (self low32BitsOf: header) 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.
- 	jumpNeedScavenge := cogit JumpAboveOrEqual: 0.
- 
- 	"Now initialize the fields of the context.  See CoInterpreter>>marryFrame:SP:copyTemps:"
- 	"sender gets frame pointer as a SmallInteger"
- 	continuation :=
- 	cogit MoveR: FPReg R: TempReg.
- 	self genSetSmallIntegerTagsIn: TempReg.
- 	cogit MoveR: TempReg Mw: objectMemory baseHeaderSize + (SenderIndex * objectMemory bytesPerOop) r: ReceiverResultReg.
- 
- 	"pc gets frame caller as a SmallInteger"
- 	cogit MoveMw: FoxSavedFP r: FPReg R: TempReg.
- 	self genSetSmallIntegerTagsIn: TempReg.
- 	cogit MoveR: TempReg Mw: objectMemory baseHeaderSize + (InstructionPointerIndex * objectMemory bytesPerOop) r: ReceiverResultReg.
- 
- 	"Set the method field, freeing up ClassReg again, and frame's context field,"
- 	cogit
- 		MoveMw: (cogit offset: CogMethod of: #methodObject) r: ClassReg R: TempReg;
- 		MoveR: TempReg Mw: objectMemory baseHeaderSize + (MethodIndex * objectMemory wordSize) r: ReceiverResultReg;
- 		MoveR: ReceiverResultReg Mw: FoxThisContext r: FPReg.
- 
- 	"Now compute stack pointer; this is stackPointer (- 1 for return pc if a CISC) - framePointer - 4 (1 each for saved pc, method, context, receiver) + 1 (1-relative) + numArgs"
- 	"TPR note - the code here is actually doing
- 	context stackPointer := ((((fp - sp) / 4) - [3|4]) + num args) asSmallInteger"
- 	cogit
- 		MoveR: FPReg R: TempReg;
- 		SubR: SPReg R: TempReg;
- 		LogicalShiftRightCq: self log2BytesPerWord R: TempReg;
- 		SubCq: (cogit backEnd hasLinkRegister ifTrue: [3] ifFalse: [4]) R: TempReg;
- 		AddR: SendNumArgsReg R: TempReg.
- 	self genConvertIntegerToSmallIntegerInReg: TempReg.
- 	cogit MoveR: TempReg Mw: objectMemory baseHeaderSize + (StackPointerIndex * objectMemory bytesPerOop) r: ReceiverResultReg.
- 
- 	"Set closureOrNil to either the stacked receiver or nil"
- 	isInBlock
- 		ifTrue:
- 			[cogit
- 				MoveR: SendNumArgsReg R: TempReg;
- 				AddCq: 2 R: TempReg; "+2 for saved fp and saved pc"
- 				MoveXwr: TempReg R: FPReg R: TempReg]
- 		ifFalse:
- 			[cogit genMoveConstant: objectMemory nilObject R: TempReg].
- 	cogit MoveR: TempReg Mw: objectMemory baseHeaderSize + (ClosureIndex * objectMemory bytesPerOop) r: ReceiverResultReg.
- 
- 	"Set the receiver"
- 	cogit
- 		MoveMw: FoxMFReceiver r: FPReg R: TempReg;
- 		MoveR: TempReg Mw: objectMemory baseHeaderSize + (ReceiverIndex * objectMemory bytesPerOop) r: ReceiverResultReg.
- 
- 	"Now copy the arguments.  This is tricky because of the shortage of registers,.  ClassReg ranges
- 	 from 1 to numArgs (SendNumArgsReg), and from ReceiverIndex + 1 to ReceiverIndex + numArgs.
- 	 1 to: numArgs do:
- 		[:i|
- 		temp := longAt(FPReg + ((SendNumArgs - i + 2) * BytesPerWord)). +2 for saved pc and savedfp
- 		longAtput(FPReg + FoxMFReceiver + (i * BytesPerWord), temp)]"
- 	"TPR note: this is a prime candidate for passing off to the backend to do at least faintly optimal code"
- 	cogit MoveCq: 1 R: ClassReg.
- 	loopHead := cogit CmpR: SendNumArgsReg R: ClassReg.
- 	exit := cogit JumpGreater: 0.
- 	cogit
- 		MoveR: SendNumArgsReg R: TempReg;
- 		SubR: ClassReg R: TempReg;
- 		AddCq: 2 R: TempReg; "+2 for saved fp and saved pc"
- 		MoveXwr: TempReg R: FPReg R: TempReg;
- 		AddCq: ReceiverIndex + (objectMemory baseHeaderSize / objectMemory wordSize) R: ClassReg; "Now convert ClassReg from frame index to context index"
- 		MoveR: TempReg Xwr: ClassReg R: ReceiverResultReg;
- 		SubCq: ReceiverIndex + (objectMemory baseHeaderSize / objectMemory wordSize) - 1 R: ClassReg; "convert back adding 1 ;-)"
- 		Jump: loopHead.
- 	exit jmpTarget: cogit Label.
- 
- 	"Finally nil or copy the non-argument temps.
- 	 ClassReg := FPReg + FoxMFReceiver.
- 	 SendNumArgsReg := SendNumArgsReg+ReceiverIndex.
- 	 [ClassReg := ClassReg - 4.
- 	  backEnd hasLinkRegister
- 			ifTrue: [ClassReg > SPReg]
- 			ifFalse: [ClassReg >= SPReg]] whileTrue:
- 		[receiver[SendNumArgsReg] := *ClassReg.
- 		 SendNumArgsReg := SendNumArgsReg + 1]]"
- 	coInterpreter marryFrameCopiesTemps ifFalse:
- 		[cogit MoveCq: objectMemory nilObject R: TempReg].
- 	cogit
- 		MoveR: FPReg R: ClassReg;
- 		AddCq: FoxMFReceiver R: ClassReg;
- 		AddCq: ReceiverIndex + 1 + (objectMemory baseHeaderSize / objectMemory wordSize) R: SendNumArgsReg.
- 	loopHead :=
- 	cogit SubCq: objectMemory wordSize R: ClassReg.
- 	cogit CmpR: SPReg R: ClassReg.
- 	"If on a CISC there's a retpc for the trampoline call on top of stack; if on a RISC there isn't."
- 	exit := cogit backEnd hasLinkRegister
- 				ifTrue: [cogit JumpBelow: 0]
- 				ifFalse: [cogit JumpBelowOrEqual: 0].
- 	coInterpreter marryFrameCopiesTemps ifTrue:
- 		[cogit MoveMw: 0 r: ClassReg R: TempReg].
- 	cogit
- 		MoveR: TempReg Xwr: SendNumArgsReg R: ReceiverResultReg;
- 		AddCq: 1 R: SendNumArgsReg;
- 		Jump: loopHead.
- 	exit jmpTarget: cogit Label.
- 
- 	cogit RetN: 0.
- 	
- 	jumpNeedScavenge jmpTarget: cogit Label.
- 	cogit backEnd saveAndRestoreLinkRegAround:
- 		[cogit CallRT: ceScheduleScavengeTrampoline].
- 	cogit Jump: continuation.
- 	^0!

Item was added:
+ ----- Method: CogObjectRepresentationFor32BitSpur>>genLoadHeaderIntoNewInstance: (in category 'initialization') -----
+ genLoadHeaderIntoNewInstance: header
+ 	"Generate the instructions to move the constant header into a new instance pointed to by ReceiverResultReg."
+ 	<inline: true>
+ 	self flag: #endianness.
+ 	cogit
+ 		MoveCq: (self low32BitsOf: header) R: TempReg;
+ 		MoveR: TempReg Mw: 0 r: ReceiverResultReg;
+ 		MoveCq: header >> 32 R: TempReg;
+ 		MoveR: TempReg Mw: 4 r: ReceiverResultReg!

Item was removed:
- ----- Method: CogObjectRepresentationFor32BitSpur>>genSetSmallIntegerTagsIn: (in category 'compile abstract instructions') -----
- genSetSmallIntegerTagsIn: scratchReg
- 	cogit OrCq: 1 R: scratchReg.
- 	^0!

Item was added:
+ ----- Method: CogObjectRepresentationFor64BitSpur>>genConvertIntegerToSmallIntegerInReg: (in category 'compile abstract instructions') -----
+ genConvertIntegerToSmallIntegerInReg: reg
+ 	cogit LogicalShiftLeftCq: self numTagBits R: reg.
+ 	cogit AddCq: 1 R: reg.
+ 	^0!

Item was added:
+ ----- Method: CogObjectRepresentationFor64BitSpur>>genConvertSmallIntegerToIntegerInReg: (in category 'compile abstract instructions') -----
+ genConvertSmallIntegerToIntegerInReg: reg
+ 	cogit ArithmeticShiftRightCq: self numTagBits R: reg.
+ 	^0!

Item was added:
+ ----- Method: CogObjectRepresentationFor64BitSpur>>genLoadHeaderIntoNewInstance: (in category 'initialization') -----
+ genLoadHeaderIntoNewInstance: header
+ 	"Generate the instructions to move the constant header into a new instance pointed to by ReceiverResultReg."
+ 	<inline: true>
+ 	self flag: #endianness.
+ 	cogit
+ 		MoveCq: header R: TempReg;
+ 		MoveR: TempReg Mw: 0 r: ReceiverResultReg!

Item was added:
+ ----- Method: CogObjectRepresentationFor64BitSpur>>numCharacterBits (in category 'compile abstract instructions') -----
+ numCharacterBits
+ 	^61!

Item was added:
+ ----- Method: CogObjectRepresentationFor64BitSpur>>numSmallIntegerBits (in category 'compile abstract instructions') -----
+ numSmallIntegerBits
+ 	^61!

Item was added:
+ ----- Method: CogObjectRepresentationFor64BitSpur>>numTagBits (in category 'compile abstract instructions') -----
+ numTagBits
+ 	<inline: true>
+ 	^3!

Item was added:
+ ----- Method: CogObjectRepresentationForSpur>>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.
+ 	1 to: numCopied do:
+ 		[:i|
+ 		cogit
+ 			PopR: TempReg;
+ 			MoveR: TempReg
+ 				Mw: numCopied - i + ClosureFirstCopiedValueIndex * objectMemory bytesPerOop + objectMemory baseHeaderSize
+ 					r: ReceiverResultReg].
+ 	^0!

Item was added:
+ ----- Method: CogObjectRepresentationForSpur>>genGetActiveContextLarge:inBlock: (in category 'initialization') -----
+ genGetActiveContextLarge: isLarge inBlock: isInBlock
+ 	"Create a trampoline to answer the active context that will
+ 	 answer it if a frame is already married, and create it otherwise.
+ 	 Assume numArgs is in SendNumArgsReg and ClassReg is free."
+ 	| header slotSize jumpSingle loopHead jumpNeedScavenge continuation exit |
+ 	<var: #jumpNeedScavenge type: #'AbstractInstruction *'>
+ 	<var: #continuation type: #'AbstractInstruction *'>
+ 	<var: #jumpSingle type: #'AbstractInstruction *'>
+ 	<var: #loopHead type: #'AbstractInstruction *'>
+ 	<var: #exit type: #'AbstractInstruction *'>
+ 	cogit "load the flag; stash it in both TempReg & ClassReg; do the compare (a prime candidated for use of AndCq:R:R:)"
+ 		MoveMw: FoxMethod r: FPReg R: ClassReg;
+ 		AndCq: MFMethodFlagHasContextFlag R: ClassReg R: TempReg.
+ 	jumpSingle := cogit JumpZero: 0. "jump if flag bit not set"
+ 	cogit "since the flag bit was set, get the context in the receiver reg and return"
+ 		MoveMw: FoxThisContext r: FPReg R: ReceiverResultReg;
+ 		RetN: 0.
+ 	jumpSingle jmpTarget: cogit Label.
+ 
+ 	"OK, it doesn't exist; instantiate and initialize it"
+ 	"set the hasContext flag; See CoInterpreter class>>initializeFrameIndices"
+ 	cogit
+ 		OrCq: MFMethodFlagHasContextFlag R: ClassReg;
+ 		MoveR: ClassReg Mw: FoxMethod r: FPReg.
+ 	"now get the home CogMethod into ClassReg and save for post-instantiation."
+ 	isInBlock
+ 		ifTrue:
+ 			[cogit
+ 				SubCq: 3 R: ClassReg; "-3 is -(hasContext+isBlock) flags"
+ 				MoveM16: 0 r: ClassReg R: TempReg;
+ 				SubR: TempReg R: ClassReg]
+ 		ifFalse:
+ 			[cogit SubCq: 1 R: ClassReg]. "-1 is hasContext flag"
+ 
+ 	"instantiate the context..."
+ 	slotSize := isLarge ifTrue: [LargeContextSlots] ifFalse: [SmallContextSlots].
+ 	header := objectMemory
+ 					headerForSlots: slotSize
+ 					format: objectMemory indexablePointersFormat
+ 					classIndex: ClassMethodContextCompactIndex.
+ 	self flag: #endianness.
+ 	cogit MoveAw: objectMemory freeStartAddress R: ReceiverResultReg.
+ 	self genLoadHeaderIntoNewInstance: header.
+ 	cogit
+ 		MoveR: ReceiverResultReg R: TempReg;
+ 		AddCq: (objectMemory smallObjectBytesForSlots: slotSize) R: TempReg;
+ 		MoveR: TempReg Aw: objectMemory freeStartAddress;
+ 		CmpCq: objectMemory getScavengeThreshold R: TempReg.
+ 	jumpNeedScavenge := cogit JumpAboveOrEqual: 0.
+ 
+ 	"Now initialize the fields of the context.  See CoInterpreter>>marryFrame:SP:copyTemps:"
+ 	"sender gets frame pointer as a SmallInteger"
+ 	continuation :=
+ 	cogit MoveR: FPReg R: TempReg.
+ 	self genSetSmallIntegerTagsIn: TempReg.
+ 	cogit MoveR: TempReg Mw: objectMemory baseHeaderSize + (SenderIndex * objectMemory bytesPerOop) r: ReceiverResultReg.
+ 
+ 	"pc gets frame caller as a SmallInteger"
+ 	cogit MoveMw: FoxSavedFP r: FPReg R: TempReg.
+ 	self genSetSmallIntegerTagsIn: TempReg.
+ 	cogit MoveR: TempReg Mw: objectMemory baseHeaderSize + (InstructionPointerIndex * objectMemory bytesPerOop) r: ReceiverResultReg.
+ 
+ 	"Set the method field, freeing up ClassReg again, and frame's context field,"
+ 	cogit
+ 		MoveMw: (cogit offset: CogMethod of: #methodObject) r: ClassReg R: TempReg;
+ 		MoveR: TempReg Mw: objectMemory baseHeaderSize + (MethodIndex * objectMemory wordSize) r: ReceiverResultReg;
+ 		MoveR: ReceiverResultReg Mw: FoxThisContext r: FPReg.
+ 
+ 	"Now compute stack pointer; this is stackPointer (- 1 for return pc if a CISC) - framePointer - wordSize (1 each for saved pc, method, context, receiver) + 1 (1-relative) + numArgs"
+ 	"TPR note - the code here is actually doing
+ 	context stackPointer := ((((fp - sp) / wordSize) - [3|4]) + num args) asSmallInteger"
+ 	cogit
+ 		MoveR: FPReg R: TempReg;
+ 		SubR: SPReg R: TempReg;
+ 		LogicalShiftRightCq: self log2BytesPerWord R: TempReg;
+ 		SubCq: (cogit backEnd hasLinkRegister ifTrue: [3] ifFalse: [4]) R: TempReg;
+ 		AddR: SendNumArgsReg R: TempReg.
+ 	self genConvertIntegerToSmallIntegerInReg: TempReg.
+ 	cogit MoveR: TempReg Mw: objectMemory baseHeaderSize + (StackPointerIndex * objectMemory bytesPerOop) r: ReceiverResultReg.
+ 
+ 	"Set closureOrNil to either the stacked receiver or nil"
+ 	isInBlock
+ 		ifTrue:
+ 			[cogit
+ 				MoveR: SendNumArgsReg R: TempReg;
+ 				AddCq: 2 R: TempReg; "+2 for saved fp and saved pc"
+ 				MoveXwr: TempReg R: FPReg R: TempReg]
+ 		ifFalse:
+ 			[cogit genMoveConstant: objectMemory nilObject R: TempReg].
+ 	cogit MoveR: TempReg Mw: objectMemory baseHeaderSize + (ClosureIndex * objectMemory bytesPerOop) r: ReceiverResultReg.
+ 
+ 	"Set the receiver"
+ 	cogit
+ 		MoveMw: FoxMFReceiver r: FPReg R: TempReg;
+ 		MoveR: TempReg Mw: objectMemory baseHeaderSize + (ReceiverIndex * objectMemory bytesPerOop) r: ReceiverResultReg.
+ 
+ 	"Now copy the arguments.  This is tricky because of the shortage of registers,.  ClassReg ranges
+ 	 from 1 to numArgs (SendNumArgsReg), and from ReceiverIndex + 1 to ReceiverIndex + numArgs.
+ 	 1 to: numArgs do:
+ 		[:i|
+ 		temp := longAt(FPReg + ((SendNumArgs - i + 2) * wordSize)). +2 for saved pc and savedfp
+ 		longAtput(FPReg + FoxMFReceiver + (i * wordSize), temp)]"
+ 	"TPR note: this is a prime candidate for passing off to the backend to do at least faintly optimal code"
+ 	cogit MoveCq: 1 R: ClassReg.
+ 	loopHead := cogit CmpR: SendNumArgsReg R: ClassReg.
+ 	exit := cogit JumpGreater: 0.
+ 	cogit
+ 		MoveR: SendNumArgsReg R: TempReg;
+ 		SubR: ClassReg R: TempReg;
+ 		AddCq: 2 R: TempReg; "+2 for saved fp and saved pc"
+ 		MoveXwr: TempReg R: FPReg R: TempReg;
+ 		AddCq: ReceiverIndex + (objectMemory baseHeaderSize / objectMemory wordSize) R: ClassReg; "Now convert ClassReg from frame index to context index"
+ 		MoveR: TempReg Xwr: ClassReg R: ReceiverResultReg;
+ 		SubCq: ReceiverIndex + (objectMemory baseHeaderSize / objectMemory wordSize) - 1 R: ClassReg; "convert back adding 1 ;-)"
+ 		Jump: loopHead.
+ 	exit jmpTarget: cogit Label.
+ 
+ 	"Finally nil or copy the non-argument temps.
+ 	 ClassReg := FPReg + FoxMFReceiver.
+ 	 SendNumArgsReg := SendNumArgsReg+ReceiverIndex.
+ 	 [ClassReg := ClassReg - wordSize.
+ 	  backEnd hasLinkRegister
+ 			ifTrue: [ClassReg > SPReg]
+ 			ifFalse: [ClassReg >= SPReg]] whileTrue:
+ 		[receiver[SendNumArgsReg] := *ClassReg.
+ 		 SendNumArgsReg := SendNumArgsReg + 1]]"
+ 	coInterpreter marryFrameCopiesTemps ifFalse:
+ 		[cogit MoveCq: objectMemory nilObject R: TempReg].
+ 	cogit
+ 		MoveR: FPReg R: ClassReg;
+ 		AddCq: FoxMFReceiver R: ClassReg;
+ 		AddCq: ReceiverIndex + 1 + (objectMemory baseHeaderSize / objectMemory wordSize) R: SendNumArgsReg.
+ 	loopHead :=
+ 	cogit SubCq: objectMemory wordSize R: ClassReg.
+ 	cogit CmpR: SPReg R: ClassReg.
+ 	"If on a CISC there's a retpc for the trampoline call on top of stack; if on a RISC there isn't."
+ 	exit := cogit backEnd hasLinkRegister
+ 				ifTrue: [cogit JumpBelow: 0]
+ 				ifFalse: [cogit JumpBelowOrEqual: 0].
+ 	coInterpreter marryFrameCopiesTemps ifTrue:
+ 		[cogit MoveMw: 0 r: ClassReg R: TempReg].
+ 	cogit
+ 		MoveR: TempReg Xwr: SendNumArgsReg R: ReceiverResultReg;
+ 		AddCq: 1 R: SendNumArgsReg;
+ 		Jump: loopHead.
+ 	exit jmpTarget: cogit Label.
+ 
+ 	cogit RetN: 0.
+ 	
+ 	jumpNeedScavenge jmpTarget: cogit Label.
+ 	cogit backEnd saveAndRestoreLinkRegAround:
+ 		[cogit CallRT: ceScheduleScavengeTrampoline].
+ 	cogit Jump: continuation.
+ 	^0!

Item was added:
+ ----- Method: CogObjectRepresentationForSpur>>genLoadHeaderIntoNewInstance: (in category 'initialization') -----
+ genLoadHeaderIntoNewInstance: header
+ 	"Generate the instructions to move the constant header into a new instance pointed to by ReceiverResultReg."
+ 	^self subclassResponsibility!

Item was changed:
  ----- Method: CogObjectRepresentationForSpur>>genSetSmallIntegerTagsIn: (in category 'compile abstract instructions') -----
  genSetSmallIntegerTagsIn: scratchReg
+ 	cogit OrCq: 1 R: scratchReg.
+ 	^0!
- 	self subclassResponsibility!

Item was added:
+ ----- Method: CogX64Compiler>>hasThreeAddressArithmetic (in category 'testing') -----
+ hasThreeAddressArithmetic
+ 	"Answer if the receiver supports three-address arithmetic instructions"
+ 	<inline: true>
+ 	^false!



More information about the Vm-dev mailing list