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

commits at source.squeak.org commits at source.squeak.org
Thu Nov 12 02:39:48 UTC 2020


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

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

Name: VMMaker.oscog-eem.2880
Author: eem
Time: 11 November 2020, 6:39:39.03013 pm
UUID: 6baaab83-7f09-434a-9db1-affff34cc15a
Ancestors: VMMaker.oscog-eem.2879

...and there's a lot more where that came from.

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

Item was changed:
  ----- Method: CoInterpreter>>isCFramePointerInUse:_: (in category 'cog jit support') -----
  isCFramePointerInUse: cFrmPtrPtr _: cStkPtrPtr
+ 	<var: 'cFrmPtrPtr' type: #'usqIntptr_t *'>
+ 	<var: 'cStkPtrPtr' type: #'usqIntptr_t *'>
- 	<var: 'cFrmPtrPtr' type: 'usqIntptr_t *'>
- 	<var: 'cStkPtrPtr' type: 'usqIntptr_t *'>
  	<doNotGenerate>
  	"This must be implemented externally, e.g. in sqPlatMain.c."
  	^self class initializationOptions at: #isCFramePointerInUse ifAbsent: [true]!

Item was changed:
  ----- Method: CogClass>>cCoerceSimple:to: (in category 'translation support') -----
  cCoerceSimple: value to: cTypeString
  	<doNotGenerate>
  	"Type coercion for translation and simulation.
  	 For simulation answer a suitable surrogate for the struct types"
  	^cTypeString caseOf:
  	   {	[#'unsigned long']							->	[value].
  		[#'unsigned int']							->	[value].
  		[#'unsigned short']							->	[value].
  		[#sqInt]									->	[value].
  		[#'sqIntptr_t']								->	[value].
  		[#'usqIntptr_t']								->	[value].
  		[#usqInt]									->	[value].
  		[#sqLong]									->	[value].
  		[#usqLong]								->	[value].
  		[#'AbstractInstruction *']					->	[value].
  		[#'SpurSegmentInfo *']						->	[value].
  		[#'BytecodeFixup *']						->	[value].
  		[#'CogMethod *']							->	[value].
  		[#'char *']									->	[value].
  		[#'sqInt *']									->	[value].
  		[#'void *']									->	[value].
  		[#void]										->	[value].
  		[#'void (*)()']								->	[value].
  		[#'void (*)(void)']							->	[value].
  		[#'usqIntptr_t (*)(void)']					->	[value].
  		[#'void (*)(usqIntptr_t,usqIntptr_t)']		->	[value].
+ 		[#'usqIntptr_t (*)(usqIntptr_t)']			->	[value].
+ 		[#'usqIntptr_t (*)(void)']					->	[value] }!
- 		[#'uintptr_t (*)(uintptr_t)']					->	[value].
- 		[#'uintptr_t (*)(void)']						->	[value] }!

Item was changed:
  ----- Method: CogIA32Compiler class>>declareCVarsIn: (in category 'translation') -----
  declareCVarsIn: aCCodeGenerator
  	aCCodeGenerator
+ 		declareVar: 'cpuidWord0' type: #usqIntptr_t;
+ 		declareVar: 'cpuidWord1' type: #usqIntptr_t!
- 		declareVar: 'cpuidWord0' type: #uintptr_t;
- 		declareVar: 'cpuidWord1' type: #uintptr_t!

Item was changed:
  ----- Method: CogIA32Compiler>>detectFeatures (in category 'feature detection') -----
  detectFeatures
  	"Do a throw-away compilation to get at the cpuid info and initialize cpuidWord0 and cpuidWord1.
  	 N.B. All of MSVC, gcc & clang have intrinsics for this, so if you have the energy by all means
  	 reimplement as an #if _MSC_VER...#elif __GNUC__ #else ... saga."
  	| startAddress cpuid |
+ 	<var: 'cpuid' declareC: 'usqIntptr_t (*cpuid)(usqIntptr_t arg)'>
- 	<var: 'cpuid' declareC: 'uintptr_t (*cpuid)(uintptr_t arg)'>
  	startAddress := cogit methodZoneBase.
  	cogit allocateOpcodes: 10 bytecodes: 0.
+ 	cpuid := cogit cCoerceSimple: cogit methodZoneBase to: #'usqIntptr_t (*)(usqIntptr_t)'.
- 	cpuid := cogit cCoerceSimple: cogit methodZoneBase to: #'uintptr_t (*)(uintptr_t)'.
  	cogit
  		PushR: EDX;
  		PushR: ECX;
  		PushR: EBX;
  		MoveMw: 16 "3 saved registers plus return pc" r: ESP R: EAX;
  		gen: CPUID;
  		MoveR: EDX R: EAX;
  		PopR: EBX;
  		PopR: ECX;
  		PopR: EDX;
  		RetN: 0.
  	cogit outputInstructionsForGeneratedRuntimeAt: startAddress.
  	cogit resetMethodZoneBase: startAddress.
  	self setCpuidWord0: (self cCode: 'cpuid(1)' inSmalltalk: [self cpuid: 1]).
  	cogit zeroOpcodeIndexForNewOpcodes.
  	cogit
  		PushR: EDX;
  		PushR: ECX;
  		PushR: EBX;
  		MoveMw: 16 "3 saved registers plus return pc" r: ESP R: EAX;
  		gen: CPUID;
  		MoveR: ECX R: EAX;
  		PopR: EBX;
  		PopR: ECX;
  		PopR: EDX;
  		RetN: 0.
  	cogit outputInstructionsForGeneratedRuntimeAt: startAddress.
  	cogit resetMethodZoneBase: startAddress.
  	self setCpuidWord1: (self cCode: 'cpuid(0x80000001)' inSmalltalk: [self cpuid: 16r80000001])!

Item was changed:
  ----- Method: CogX64Compiler class>>declareCVarsIn: (in category 'translation') -----
  declareCVarsIn: aCCodeGenerator
  	aCCodeGenerator
+ 		declareVar: 'cpuidWord1' type: #usqIntptr_t!
- 		declareVar: 'cpuidWord1' type: #uintptr_t!

Item was changed:
  ----- Method: CogX64Compiler>>detectFeatures (in category 'feature detection') -----
  detectFeatures
  	"Do a throw-away compilation to get at the cpuid info and initialize cpuidWord1
  	 N.B. All of MSVC, gcc & clang have intrinsics for this, so if you have the energy
  	 by all means reimplement as an #if _MSC_VER...#elif __GNUC__ #else ... saga."
  	| startAddress cpuid |
+ 	<var: 'cpuid' declareC: 'usqIntptr_t (*cpuid)(void)'>
- 	<var: 'cpuid' declareC: 'uintptr_t (*cpuid)(void)'>
  	startAddress := cogit methodZoneBase.
  	cogit allocateOpcodes: 10 bytecodes: 0.
+ 	cpuid := cogit cCoerceSimple: startAddress to: #'usqIntptr_t (*)(void)'.
- 	cpuid := cogit cCoerceSimple: startAddress to: #'uintptr_t (*)(void)'.
  	cogit
  		PushR: RDX;
  		PushR: RCX;
  		PushR: RBX;
  		MoveCq: 16r80000001 R: RAX;
  		gen: CPUID;
  		MoveR: RCX R: RAX;
  		PopR: RBX;
  		PopR: RCX;
  		PopR: RDX;
  		RetN: 0.
  	cogit outputInstructionsForGeneratedRuntimeAt: startAddress.
  	cogit resetMethodZoneBase: startAddress.
  	self setCpuidWord1: (self cCode: 'cpuid()' inSmalltalk: [cogit simulateLeafCallOf: startAddress])!

Item was changed:
  ----- Method: Cogit>>generateVMOwnerLockFunctions (in category 'initialization') -----
  generateVMOwnerLockFunctions
  	<inline: true>
  	self cppIf: COGMTVM ifTrue:
  		[| startAddress |
  		self allocateOpcodes: backEnd numLowLevelLockOpcodes bytecodes: 0.
  		self zeroOpcodeIndex.
  		startAddress := methodZoneBase.
  		backEnd generateLowLevelTryLock: coInterpreter vmOwnerAddress.
  		self outputInstructionsForGeneratedRuntimeAt: startAddress.
  		self recordGeneratedRunTime: 'ceTryLockVMOwner' address: startAddress.
+ 		ceTryLockVMOwner := self cCoerceSimple: startAddress to: #'usqIntptr_t (*)(usqIntptr_t)']!
- 		ceTryLockVMOwner := self cCoerceSimple: startAddress to: #'uintptr_t (*)(uintptr_t)']!

Item was changed:
  ----- Method: StackInterpreter>>lowcodePrimitiveInt32ToPointer (in category 'inline primitive generated code') -----
  lowcodePrimitiveInt32ToPointer
  	<option: #LowcodeVM>	"Lowcode instruction generator"
  	| value result |
  	<var: #value type: #'sqInt' >
  	<var: #result type: #'char*' >
  	value := self internalPopStackInt32.
  
+ 	result := self cCoerce: (self cCoerce: value to: 'usqIntptr_t') to: 'char*'.
- 	result := self cCoerce: (self cCoerce: value to: 'uintptr_t') to: 'char*'.
  
  	self internalPushPointer: result.
  
  !

Item was changed:
  ----- Method: StackInterpreter>>lowcodePrimitivePointerToInt32 (in category 'inline primitive generated code') -----
  lowcodePrimitivePointerToInt32
  	<option: #LowcodeVM>	"Lowcode instruction generator"
  	| pointer result |
  	<var: #pointer type: #'char*' >
  	<var: #result type: #'sqInt' >
  	pointer := self internalPopStackPointer.
  
+ 	result := self cCoerce: pointer to: 'usqIntptr_t'.
- 	result := self cCoerce: pointer to: 'uintptr_t'.
  
  	self internalPushInt32: result.
  
  !

Item was changed:
  ----- Method: StackInterpreter>>lowcodePrimitivePointerToInt64 (in category 'inline primitive generated code') -----
  lowcodePrimitivePointerToInt64
  	<option: #LowcodeVM>	"Lowcode instruction generator"
  	| pointer result |
  	<var: #pointer type: #'char*' >
  	<var: #result type: #'sqLong' >
  	pointer := self internalPopStackPointer.
  
+ 	result := self cCoerce: pointer to: 'usqIntptr_t'.
- 	result := self cCoerce: pointer to: 'uintptr_t'.
  
  	self internalPushInt64: result.
  
  !



More information about the Vm-dev mailing list