[Vm-dev] VM Maker: VMMaker.oscog-rsf.2072.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Jan 5 02:19:39 UTC 2017


Ronie Salgado Faila uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-rsf.2072.mcz

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

Name: VMMaker.oscog-rsf.2072
Author: rsf
Time: 4 January 2017, 11:19:12.905175 pm
UUID: a71106f7-964a-4165-bd14-cd8b52ca1acf
Ancestors: VMMaker.oscog-eem.2071

Fixing some compilation warnings.
Fixing the order of the arguments of some trampolines.
Fixing the computation of the numTrampolines to return values according to the LowcodeVM flag.
Added a hack in CogObjectRepresentationForSpur to always add the NumStoreTrampolines count. The generated NumTrampolines C define is just a constant, which does not take into account if -DIMMUTABILITY was passed to the compiler, which happens with the PharoVM.

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

Item was changed:
  ----- Method: CogBytecodeDescriptor class>>instVarNamesAndTypesForTranslationDo: (in category 'translation') -----
  instVarNamesAndTypesForTranslationDo: aBinaryBlock
  	"enumerate aBinaryBlock with the names and C type strings for the inst vars to include in a BytecodeDescriptor struct."
  
  	"With hasIRC there are 9 flag bits.  Excluding hasIRC in non-Newspeak VMs keeps the descriptor compact."
  	(NewspeakVM
  		ifTrue: [self instVarNames]
  		ifFalse: [self instVarNames copyWithout: 'hasIRC']) do:
  		[:ivn|
  		aBinaryBlock
  			value: ivn
  			value: (ivn caseOf: {
  							['generator']			->	[#('sqInt (*' ')(void)')].
+ 							['spanFunction']			->	[#('sqInt NoDbgRegParms (*' ')(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt)')].
+ 							['needsFrameFunction']	->	[#('sqInt NoDbgRegParms (*' ')(sqInt)')].
- 							['spanFunction']			->	[#('sqInt (*' ')(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt)')].
- 							['needsFrameFunction']	->	[#('sqInt (*' ')(sqInt)')].
  							['numBytes']			->	['unsigned char'].
  							['stackDelta']			->	['signed char'].
  							['opcode']				->	['unsigned char'] }
  						otherwise: [#('unsigned' ' : 1')])]!

Item was changed:
  ----- Method: CogObjectRepresentation>>genDoubleComparison:invert: (in category 'primitive generators') -----
  genDoubleComparison: jumpOpcodeGenerator invert: invertComparison
  	<option: #DPFPReg0>
+ 	<var: #jumpOpcodeGenerator declareC: 'AbstractInstruction * NoDbgRegParms (*jumpOpcodeGenerator)(void *)'>
- 	<var: #jumpOpcodeGenerator declareC: 'AbstractInstruction *(*jumpOpcodeGenerator)(void *)'>
  	| jumpFail jumpImmediate jumpNonInt jumpCond compare |
  	<var: #jumpImmediate type: #'AbstractInstruction *'>
  	<var: #jumpNonInt type: #'AbstractInstruction *'>
  	<var: #jumpCond type: #'AbstractInstruction *'>
  	<var: #compare type: #'AbstractInstruction *'>
  	<var: #jumpFail type: #'AbstractInstruction *'>
  	cogit processorHasDoublePrecisionFloatingPointSupport ifFalse:
  		[^UnimplementedPrimitive].
  	cogit genLoadArgAtDepth: 0 into: Arg0Reg.
  	self genGetDoubleValueOf: ReceiverResultReg into: DPFPReg0.
  	jumpImmediate := self genJumpImmediate: Arg0Reg.
  	self genGetCompactClassIndexNonImmOf: Arg0Reg into: SendNumArgsReg.
  	self genCmpClassFloatCompactIndexR: SendNumArgsReg.
  	jumpFail := cogit JumpNonZero: 0.
  	self genGetDoubleValueOf: Arg0Reg into: DPFPReg1.
  	invertComparison "May need to invert for NaNs"
  		ifTrue: [compare := cogit CmpRd: DPFPReg0 Rd: DPFPReg1]
  		ifFalse: [compare := cogit CmpRd: DPFPReg1 Rd: DPFPReg0].
  	jumpCond := cogit perform: jumpOpcodeGenerator with: 0. "FP jumps are a little weird"
  	cogit genMoveFalseR: ReceiverResultReg.
  	cogit genPrimReturn.
  	jumpCond jmpTarget: (cogit genMoveTrueR: ReceiverResultReg).
  	cogit genPrimReturn.
  	jumpImmediate jmpTarget: cogit Label.
  	self maybeGenConvertIfSmallFloatIn: Arg0Reg scratchReg: TempReg into: DPFPReg1 andJumpTo: compare.
  	self smallIntegerIsOnlyImmediateType ifFalse:
  		[jumpNonInt := self genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg].
  	self genConvertSmallIntegerToIntegerInReg: Arg0Reg.
  	cogit ConvertR: Arg0Reg Rd: DPFPReg1.
  	cogit Jump: compare.
  	jumpFail jmpTarget: cogit Label.
  	self smallIntegerIsOnlyImmediateType ifFalse:
  		[jumpNonInt jmpTarget: jumpFail getJmpTarget].
  	^CompletePrimitive!

Item was changed:
  ----- Method: CogObjectRepresentation>>genLcByteSizeOf:to: (in category 'inline primitive support') -----
  genLcByteSizeOf: oop to: resultRegister
  	<option: #LowcodeVM>
  	"TODO: Optimize this one avoiding the trampoline"
+ 	oop ~= Arg0Reg ifTrue: [cogit MoveR: oop R: Arg0Reg ].
- 	oop ~= ReceiverResultReg ifTrue: [cogit MoveR: oop R: ReceiverResultReg ].
  	cogit CallRT: ceByteSizeOfTrampoline.
  
  	cogit MoveR: TempReg R: resultRegister.
  	cogit ssPushNativeRegister: resultRegister.!

Item was changed:
  ----- Method: CogObjectRepresentation>>genLcInstantiateOop:constantIndexableSize: (in category 'inline primitive support') -----
  genLcInstantiateOop: classOop constantIndexableSize: indexableSize
  	<option: #LowcodeVM>
+ 	classOop ~= Arg0Reg ifTrue: [cogit MoveR: classOop R: Arg0Reg].
+ 	cogit MoveCq: indexableSize R: Arg1Reg.
- 	classOop ~= ReceiverResultReg ifTrue: [cogit MoveR: classOop R: ReceiverResultReg].
- 	cogit MoveCq: indexableSize R: Arg0Reg.
  	cogit CallRT: ceInstantiateClassIndexableSizeTrampoline.
  
  	cogit MoveR: TempReg R: classOop.
  	cogit ssPushRegister: classOop.!

Item was changed:
  ----- Method: CogObjectRepresentation>>genLcInstantiateOop:indexableSize: (in category 'inline primitive support') -----
  genLcInstantiateOop: classOop indexableSize: indexableSize
  	<option: #LowcodeVM>
+ 	classOop ~= Arg0Reg ifTrue: [
+ 		indexableSize = Arg0Reg ifTrue: [
- 	classOop ~= ReceiverResultReg ifTrue: [
- 		indexableSize = ReceiverResultReg ifTrue: [
  			cogit MoveR: indexableSize R: TempReg.
  		].
+ 		cogit MoveR: classOop R: Arg0Reg
- 		cogit MoveR: classOop R: ReceiverResultReg
  	].
  
+ 	indexableSize ~= Arg1Reg ifTrue: [
+ 		indexableSize = Arg0Reg ifTrue: [
+ 			cogit MoveR: TempReg R: Arg1Reg.
- 	indexableSize ~= Arg0Reg ifTrue: [
- 		indexableSize = ReceiverResultReg ifTrue: [
- 			cogit MoveR: TempReg R: Arg0Reg.
  		] ifFalse: [
+ 			cogit MoveR: indexableSize R: Arg1Reg.
- 			cogit MoveR: indexableSize R: Arg0Reg.
  		]
  	].
  
  	cogit CallRT: ceInstantiateClassIndexableSizeTrampoline.
  
  	cogit MoveR: TempReg R: classOop.
  	cogit ssPushRegister: classOop.!

Item was changed:
  ----- Method: CogObjectRepresentation>>genLcPointerToOop:class: (in category 'inline primitive support') -----
  genLcPointerToOop: pointer class: pointerClass
  	<option: #LowcodeVM>
  	cogit PushR: pointer.
+ 	cogit annotate: (cogit MoveCw: pointerClass R: Arg0Reg) objRef: pointerClass.
+ 	cogit MoveCq: BytesPerOop R: Arg1Reg.
- 	cogit annotate: (cogit MoveCw: pointerClass R: ReceiverResultReg) objRef: pointerClass.
- 	cogit MoveCq: BytesPerOop R: Arg0Reg.
  	cogit CallRT: ceInstantiateClassIndexableSizeTrampoline.
  
  	cogit PopR: pointer.
  	cogit MoveR: pointer Mw: BaseHeaderSize r: TempReg.
  
  	cogit MoveR: TempReg R: pointer.
  	cogit ssPushRegister: pointer.!

Item was changed:
  ----- Method: CogObjectRepresentation>>genSmallIntegerComparison:orDoubleComparison:invert: (in category 'primitive generators') -----
  genSmallIntegerComparison: jumpOpcode orDoubleComparison: jumpFPOpcodeGenerator invert: invertComparison
  	"Stack looks like
  		return address"
  	| jumpNonInt jumpFail jumpCond r |
+ 	<var: #jumpFPOpcodeGenerator declareC: 'AbstractInstruction * NoDbgRegParms (*jumpFPOpcodeGenerator)(void *)'>
- 	<var: #jumpFPOpcodeGenerator declareC: 'AbstractInstruction *(*jumpFPOpcodeGenerator)(void *)'>
  	<var: #jumpNonInt type: #'AbstractInstruction *'>
  	<var: #jumpCond type: #'AbstractInstruction *'>
  	<var: #jumpFail type: #'AbstractInstruction *'>
  	r := self genSmallIntegerComparison: jumpOpcode.
  	r < 0 ifTrue:
  		[^r].
  	self cppIf: #DPFPReg0 defined ifTrue:
  	"Fall through on non-SmallInteger argument.  Argument may be a Float : let us check or fail"
  	[self smallIntegerIsOnlyImmediateType ifFalse:
  		[jumpNonInt := self genJumpImmediate: Arg0Reg].
  	self genGetCompactClassIndexNonImmOf: Arg0Reg into: SendNumArgsReg.
  	self genCmpClassFloatCompactIndexR: SendNumArgsReg.
  	jumpFail := cogit JumpNonZero: 0.
  
  	"It was a Float, so convert the receiver to double and perform the operation"
  	self genConvertSmallIntegerToIntegerInReg: ReceiverResultReg.
  	cogit ConvertR: ReceiverResultReg Rd: DPFPReg0.
  	self genGetDoubleValueOf: Arg0Reg into: DPFPReg1.
  	invertComparison "May need to invert for NaNs"
  		ifTrue: [cogit CmpRd: DPFPReg0 Rd: DPFPReg1]
  		ifFalse: [cogit CmpRd: DPFPReg1 Rd: DPFPReg0].
  	jumpCond := cogit perform: jumpFPOpcodeGenerator with: 0. "FP jumps are a little weird"
  	cogit genMoveFalseR: ReceiverResultReg.
  	cogit genPrimReturn.
  	jumpCond jmpTarget: (cogit genMoveTrueR: ReceiverResultReg).
  	cogit genPrimReturn.
  
  	self smallIntegerIsOnlyImmediateType
  		ifTrue: [jumpFail jmpTarget: cogit Label]
  		ifFalse: [jumpNonInt jmpTarget: (jumpFail jmpTarget: cogit Label)]].
  	^CompletePrimitive!

Item was changed:
  ----- Method: CogObjectRepresentation>>generateLowcodeObjectTrampolines (in category 'initialization') -----
  generateLowcodeObjectTrampolines
  	<option: #LowcodeVM>
  	ceFloatObjectOfTrampoline := cogit genTrampolineFor: #floatObjectOf:
  												called: 'ceFloatObjectOfTrampoline'
  												floatArg: DPFPReg0
  												result: TempReg.
  	ceFloatValueOfTrampoline := cogit genTrampolineFor: #floatValueOf:
  												called: 'ceFloatValueOfTrampoline'
  												arg: ReceiverResultReg
  												floatResult: DPFPReg0.
  	ceInstantiateClassIndexableSizeTrampoline := cogit genTrampolineFor: #instantiateClass:indexableSize:
  												called: 'ceInstantiateClassIndexableSizeTrampoline'
- 												arg: ReceiverResultReg
  												arg: Arg0Reg
+ 												arg: Arg1Reg
  												result: TempReg.
  	ceInstantiateClassTrampoline := cogit genTrampolineFor: #instantiateClass:indexableSize:
  												called: 'ceInstantiateClassTrampoline'
  												arg: ReceiverResultReg
  												arg: 0
  												result: TempReg.
  	ceByteSizeOfTrampoline := cogit genTrampolineFor: #byteSizeOf:
  												called: 'ceByteSizeOfTrampoline'
- 												arg: ReceiverResultReg
  												arg: Arg0Reg
  												result: TempReg.
  	BytesPerOop = 4 ifTrue: [
  		cePositive64BitIntegerTrampoline := cogit genTrampolineFor: #positive64BitIntegerFor:
  													called: 'cePositive64BitIntegerTrampoline'
  													arg: ReceiverResultReg
  													arg: Arg0Reg
  													result: TempReg.
  		cePositive64BitValueOfTrampoline := cogit genTrampolineFor: #positive64BitValueOf:
  													called: 'cePositive64BitValueOfTrampoline'
  													arg: ReceiverResultReg
  													result: TempReg
  													result: Arg0Reg.
  		ceSigned64BitIntegerTrampoline := cogit genTrampolineFor: #signed64BitIntegerFor:
  													called: 'ceSigned64BitIntegerTrampoline'
  													arg: ReceiverResultReg
  													arg: Arg0Reg
  													result: TempReg.
  		ceSigned64BitValueOfTrampoline := cogit genTrampolineFor: #signed64BitValueOf:
  													called: 'ceSigned64BitValueOfTrampoline'
  													arg: ReceiverResultReg
  													result: TempReg
  													result: Arg0Reg.
  	] ifFalse: [
  		cePositive64BitIntegerTrampoline := cogit genTrampolineFor: #positive64BitIntegerFor:
  													called: 'cePositive64BitIntegerTrampoline'
  													arg: ReceiverResultReg
  													result: TempReg.
  		cePositive64BitValueOfTrampoline := cogit genTrampolineFor: #positive64BitValueOf:
  													called: 'cePositive64BitValueOfTrampoline'
  													arg: ReceiverResultReg
  													result: TempReg.
  		ceSigned64BitIntegerTrampoline := cogit genTrampolineFor: #signed64BitIntegerFor:
  													called: 'ceSigned64BitIntegerTrampoline'
  													arg: ReceiverResultReg
  													result: TempReg.
  		ceSigned64BitValueOfTrampoline := cogit genTrampolineFor: #signed64BitValueOf:
  													called: 'ceSigned64BitValueOfTrampoline'
  													arg: ReceiverResultReg
  													result: TempReg.
  	]!

Item was changed:
  ----- Method: CogObjectRepresentationFor32BitSpur class>>numTrampolines (in category 'accessing') -----
  numTrampolines
+ 	^ super numTrampolines + (LowcodeVM ifTrue: [4] ifFalse: [0])!
- 	^ super numTrampolines + 4 "lowcode"!

Item was changed:
  ----- Method: CogObjectRepresentationForSpur class>>numTrampolines (in category 'accessing') -----
  numTrampolines
  	^super numTrampolines
  	 + (SistaV1BytecodeSet
  		ifTrue: [8] "(small,large)x(method,block,fullBlock) context creation,
  					 ceStoreCheckContextReceiverTrampoline and ceScheduleScavengeTrampoline"
  		ifFalse: [6] "(small,large)x(method,block) context creation,
  					 ceStoreCheckContextReceiverTrampoline and ceScheduleScavengeTrampoline")
+ 	 + NumStoreTrampolines "FIXME: the generated C code does not take into account whether IMMUTABILITY is defined to one or zero"
+ 		"((initializationOptions at: #IMMUTABILITY ifAbsent: [false])
- 	 + ((initializationOptions at: #IMMUTABILITY ifAbsent: [false])
  		ifTrue: [NumStoreTrampolines]
+ 		ifFalse: [0])"!
- 		ifFalse: [0])!

Item was changed:
  ----- Method: CogObjectRepresentationForSpur>>generateObjectRepresentationTrampolines (in category 'initialization') -----
  generateObjectRepresentationTrampolines
  	"Do the store check.  Answer the argument for the benefit of the code generator;
  	 ReceiverResultReg may be caller-saved and hence smashed by this call.  Answering
  	 it allows the code generator to reload ReceiverResultReg cheaply.
  	 In Spur the only thing we leave to the run-time is adding the receiver to the
  	 remembered set and setting its isRemembered bit."
  	self 
  		cppIf: IMMUTABILITY
  		ifTrue: 
  			[self cCode: [] inSmalltalk:
  				[ceStoreTrampolines := CArrayAccessor on: (Array new: NumStoreTrampolines)].
  			 0 to: NumStoreTrampolines - 1 do:
  				[:instVarIndex |
  				 ceStoreTrampolines
  					at: instVarIndex
  					put: (self 
  							genStoreTrampolineCalled: (cogit 
  															trampolineName: 'ceStoreTrampoline' 
  															numArgs: instVarIndex 
  															limit: NumStoreTrampolines - 2) 
  							instVarIndex: instVarIndex)]].
  	ceStoreCheckTrampoline := self genStoreCheckTrampoline.
  	ceStoreCheckContextReceiverTrampoline := self genStoreCheckContextReceiverTrampoline.
  	ceScheduleScavengeTrampoline := cogit
  											genTrampolineFor: #ceScheduleScavenge
  											called: 'ceScheduleScavengeTrampoline'
  											regsToSave: CallerSavedRegisterMask.
  	ceSmallActiveContextInMethodTrampoline := self genActiveContextTrampolineLarge: false inBlock: 0 called: 'ceSmallMethodContext'.
  	ceSmallActiveContextInBlockTrampoline := self genActiveContextTrampolineLarge: false inBlock: InVanillaBlock called: 'ceSmallBlockContext'.
  	SistaV1BytecodeSet ifTrue:
  		[ceSmallActiveContextInFullBlockTrampoline := self genActiveContextTrampolineLarge: false inBlock: InFullBlock called: 'ceSmallFullBlockContext'].
  	ceLargeActiveContextInMethodTrampoline := self genActiveContextTrampolineLarge: true inBlock: 0 called: 'ceLargeMethodContext'.
  	ceLargeActiveContextInBlockTrampoline := self genActiveContextTrampolineLarge: true inBlock: InVanillaBlock called: 'ceLargeBlockContext'.
  	SistaV1BytecodeSet ifTrue:
  		[ceLargeActiveContextInFullBlockTrampoline := self genActiveContextTrampolineLarge: true inBlock: InFullBlock called: 'ceLargeFullBlockContext'].
  		
  	LowcodeVM ifTrue: [ self generateLowcodeObjectTrampolines ]!

Item was changed:
  ----- Method: CogSimStackNativeEntry>>stackSpillSize (in category 'accessing') -----
  stackSpillSize
  	<returnTypeC: #sqInt>
  	type caseOf: {
  		[SSConstantInt64]			-> [ ^ 8 ].
  		[SSConstantFloat64]		-> [ ^ 8 ].
  		[SSRegisterDoubleFloat]	-> [ ^ 8 ].
  		[SSRegisterPair]			-> [ ^ 8 ].
  		[SSSpillFloat64]				-> [ ^ 8 ].
  		[SSSpillInt64]				-> [ ^ 8 ].
+ 	} otherwise: [^ BytesPerOop ].
+ 	^ 0!
- 	} otherwise: [^ BytesPerOop ]!

Item was changed:
  ----- Method: Cogit class>>numTrampolines (in category 'accessing') -----
  numTrampolines
+ 	^38 "30 + 4 each for self and super sends" + (LowcodeVM ifTrue: [1] ifFalse: [0])
- 	^38 "30 + 4 each for self and super sends"
  
  	"self withAllSubclasses collect: [:c| {c. (c instVarNames select: [:ea| ea beginsWith: 'ce']) size}]"!

Item was changed:
  ----- Method: Cogit>>cogMNUPICSelector:receiver:methodOperand:numArgs: (in category 'in-line cacheing') -----
  cogMNUPICSelector: selector receiver: rcvr methodOperand: methodOperand numArgs: numArgs
  	<api>
  	"Attempt to create a one-case PIC for an MNU.
  	 The tag for the case is at the send site and so doesn't need to be generated."
  	<returnTypeC: #'CogMethod *'>
  	| startAddress |
  	((objectMemory isYoung: selector)
  	 or: [(objectRepresentation inlineCacheTagForInstance: rcvr) = self picAbortDiscriminatorValue]) ifTrue:
  		[^0].
  	coInterpreter
  		compilationBreak: selector
  		point: (objectMemory numBytesOf: selector)
  		isMNUCase: true.
  	self assert: endCPICCase0 notNil.
  	"get memory in the code zone for the CPIC; if that fails we return an error code for the sender to use to work out how to blow up"
  	startAddress := methodZone allocate: closedPICSize.
  	startAddress = 0 ifTrue:
  		[coInterpreter callForCogCompiledCodeCompaction.
  		 ^0].
  
  	"memcpy the prototype across to our allocated space; because anything else would be silly"
+ 	objectMemory
+ 		mem: (self cCoerceSimple: startAddress to: #'CogMethod *')
+ 		cp: (self cCoerceSimple: cPICPrototype to: #'CogMethod *')
+ 		y: closedPICSize.
- 	objectMemory mem: startAddress cp: cPICPrototype y: closedPICSize.
  	
  	self configureMNUCPIC: (self cCoerceSimple: startAddress to: #'CogMethod *')
  		methodOperand: methodOperand
  		numArgs: numArgs
  		delta: startAddress - cPICPrototype.
  
  	^self
  		fillInCPICHeader: (self cCoerceSimple: startAddress to: #'CogMethod *')
  		numArgs: numArgs
  		numCases: 1
  		hasMNUCase: true
  		selector: selector !

Item was changed:
  ----- Method: Cogit>>cogPICSelector:numArgs:Case0Method:Case1Method:tag:isMNUCase: (in category 'in-line cacheing') -----
  cogPICSelector: selector numArgs: numArgs Case0Method: case0CogMethod Case1Method: case1MethodOrNil tag: case1Tag isMNUCase: isMNUCase
  	"Attempt to create a two-case PIC for case0CogMethod and  case1Method,case1Tag.
  	 The tag for case0CogMethod is at the send site and so doesn't need to be generated.
  	 case1Method may be any of
  		- a Cog method; link to its unchecked entry-point
  		- a CompiledMethod; link to ceInterpretMethodFromPIC:
  		- a CompiledMethod; link to ceMNUFromPICMNUMethod:receiver:"
  	<var: #case0CogMethod type: #'CogMethod *'>
  	<returnTypeC: #'CogMethod *'>
  	| startAddress |
  	(objectMemory isYoung: selector) ifTrue:
  		[^self cCoerceSimple: YoungSelectorInPIC to: #'CogMethod *'].
  	coInterpreter
  		compilationBreak: selector
  		point: (objectMemory numBytesOf: selector)
  		isMNUCase: isMNUCase.
  	
  	"get memory in the code zone for the CPIC; if that fails we return an error code for the sender to use to work out how to blow up"
  	startAddress := methodZone allocate: closedPICSize.
  	startAddress = 0 ifTrue:
  		[^self cCoerceSimple: InsufficientCodeSpace to: #'CogMethod *'].
  
  	"memcpy the prototype across to our allocated space; because anything else would be silly"
+ 	objectMemory
+ 		mem: (self cCoerceSimple: startAddress to: #'CogMethod *')
+ 		cp: (self cCoerceSimple: cPICPrototype to: #'CogMethod *')
+ 		y: closedPICSize.
- 	objectMemory mem: startAddress cp: cPICPrototype y: closedPICSize.
  	
  	self configureCPIC: (self cCoerceSimple: startAddress to: #'CogMethod *')
  		Case0: case0CogMethod
  		Case1Method: case1MethodOrNil
  		tag: case1Tag
  		isMNUCase: isMNUCase
  		numArgs: numArgs
  		delta: startAddress - cPICPrototype .
  
  	^self
  		fillInCPICHeader: (self cCoerceSimple: startAddress to: #'CogMethod *')
  		numArgs: numArgs
  		numCases: 2
  		hasMNUCase: isMNUCase
  		selector: selector !

Item was changed:
  ----- Method: Cogit>>generateRunTimeTrampolines (in category 'initialization') -----
  generateRunTimeTrampolines
  	"Generate the run-time entries at the base of the native code zone and update the base."
  	
  	ceSendMustBeBooleanAddFalseTrampoline := self genMustBeBooleanTrampolineFor: objectMemory falseObject
  														called: 'ceSendMustBeBooleanAddFalseTrampoline'.
  	ceSendMustBeBooleanAddTrueTrampoline := self genMustBeBooleanTrampolineFor: objectMemory trueObject
  														called: 'ceSendMustBeBooleanAddTrueTrampoline'.
  	ceNonLocalReturnTrampoline := self genNonLocalReturnTrampoline.
  	ceCheckForInterruptTrampoline := self genCheckForInterruptsTrampoline.
  	"Neither of the context inst var access trampolines save registers.  Their operation could cause
  	 arbitrary update of stack frames, so the assumption is that callers flush the stack before calling
  	 the context inst var access trampolines, and that everything except the result is dead afterwards."
  	ceFetchContextInstVarTrampoline := self genTrampolineFor: #ceContext:instVar:
  											called: 'ceFetchContextInstVarTrampoline'
  											arg: ReceiverResultReg
  											arg: SendNumArgsReg
  											result: SendNumArgsReg.
  	ceStoreContextInstVarTrampoline := self genTrampolineFor: #ceContext:instVar:value:
  											called: 'ceStoreContextInstVarTrampoline'
  											arg: ReceiverResultReg
  											arg: SendNumArgsReg
  											arg: ClassReg
  											result: ReceiverResultReg. "to keep ReceiverResultReg live.".
  	ceCannotResumeTrampoline := self genTrampolineFor: #ceCannotResume
  											called: 'ceCannotResumeTrampoline'.
  	"These two are unusual; they are reached by return instructions."
  	ceBaseFrameReturnTrampoline := self genReturnTrampolineFor: #ceBaseFrameReturn:
  											called: 'ceBaseFrameReturnTrampoline'
  											arg: ReceiverResultReg.
  	ceReturnToInterpreterTrampoline := self
  											genReturnTrampolineFor: #ceReturnToInterpreter:
  											called: 'ceReturnToInterpreterTrampoline'
  											arg: ReceiverResultReg.
  	ceMallocTrampoline := self genTrampolineFor: #ceMalloc:
  											called: 'ceMallocTrampoline'
  											arg: ReceiverResultReg
  											result: TempReg.
  	ceFreeTrampoline := self genTrampolineFor: #ceFree:
  											called: 'ceFreeTrampoline'
  											arg: ReceiverResultReg.
  	LowcodeVM ifTrue: [
  		ceFFICalloutTrampoline := self genFFICalloutTrampoline.
  	]!

Item was changed:
  ----- Method: VMMaker class>>generateSqueakSpurLowcodeCogVM (in category 'configurations') -----
  generateSqueakSpurLowcodeCogVM
  	"No primitives since we can use those for the Cog VM"
  	^VMMaker
  		generate: CoInterpreter
  		and: StackToRegisterMappingCogit
  		with: #(ObjectMemory Spur32BitCoMemoryManager
  				SistaVM true
          			LowcodeVM true
  				MULTIPLEBYTECODESETS true
  				bytecodeTableInitializer initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid)
  		to: (FileDirectory default pathFromURI: self sourceTree, '/spurlowcodesrc')
  		platformDir: (FileDirectory default pathFromURI: self sourceTree, '/platforms')
  		including:#()!



More information about the Vm-dev mailing list