[Vm-dev] VM Maker: VMMaker.oscog-nice.2713.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Feb 18 07:51:41 UTC 2020


Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-nice.2713.mcz

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

Name: VMMaker.oscog-nice.2713
Author: nice
Time: 18 February 2020, 8:50:42.039483 am
UUID: 140e2584-0181-4190-af0f-6d808961d58f
Ancestors: VMMaker.oscog-nice.2712

Fix bug in LargeInteger division: instantiation of quotient (quo) may fail and thus require a proper guard.

It may happen: I did report some crash when testing huge integer division at http://smallissimo.blogspot.com/2019/05/tuning-large-arithmetic-thresholds.html

Fix a copy/paste glitch JumpCarry/JumpNoCarry in #setsConditionCodesFor:
We only ever use JumpZero so far, so it's benign.

=============== Diff against VMMaker.oscog-nice.2712 ===============

Item was changed:
  ----- Method: CogIA32Compiler>>setsConditionCodesFor: (in category 'testing') -----
  setsConditionCodesFor: aConditionalJumpOpcode
  	<inline: false> "to save Slang from having to be a real compiler (it can't inline switches that return)"
  	"Answer if the receiver's opcode sets the condition codes correctly for the given conditional jump opcode."
  	^opcode caseOf:
  		{	[ArithmeticShiftRightCqR]	->	[self shiftSetsConditionCodesFor: aConditionalJumpOpcode].
  			[ArithmeticShiftRightRR]	->	[self shiftSetsConditionCodesFor: aConditionalJumpOpcode].
  			[LogicalShiftLeftCqR]		->	[self shiftSetsConditionCodesFor: aConditionalJumpOpcode].
  			[LogicalShiftLeftRR]			->	[self shiftSetsConditionCodesFor: aConditionalJumpOpcode].
  			[XorRR]						->	[true].
+ 			[ClzRR]						->	[aConditionalJumpOpcode = JumpZero or: [aConditionalJumpOpcode = JumpNonZero or: [aConditionalJumpOpcode = JumpCarry or: [aConditionalJumpOpcode = JumpNoCarry "carry flag is set if input is zero"]]]]
- 			[ClzRR]						->	[aConditionalJumpOpcode = JumpZero or: [aConditionalJumpOpcode = JumpNonZero or: [aConditionalJumpOpcode = JumpNoCarry or: [aConditionalJumpOpcode = JumpNoCarry "carry flag is set if input is zero"]]]]
  		}
  		otherwise: [self halt: 'unhandled opcode in setsConditionCodesFor:'. false]!

Item was changed:
  ----- Method: CogX64Compiler>>setsConditionCodesFor: (in category 'testing') -----
  setsConditionCodesFor: aConditionalJumpOpcode
  	<inline: false> "to save Slang from having to be a real compiler (it can't inline switches that return)"
  	"Answer if the receiver's opcode sets the condition codes correctly for the given conditional jump opcode."
  	^opcode caseOf:
  		{	[ArithmeticShiftRightCqR]	->	[self shiftSetsConditionCodesFor: aConditionalJumpOpcode].
  			[ArithmeticShiftRightRR]	->	[self shiftSetsConditionCodesFor: aConditionalJumpOpcode].
  			[LogicalShiftLeftCqR]		->	[self shiftSetsConditionCodesFor: aConditionalJumpOpcode].
  			[LogicalShiftLeftRR]			->	[self shiftSetsConditionCodesFor: aConditionalJumpOpcode].
  			[LogicalShiftRightCqR]		->	[false].
  			[XorRR]						->	[true].
+ 			[ClzRR]						->	[aConditionalJumpOpcode = JumpZero or: [aConditionalJumpOpcode = JumpNonZero or: [aConditionalJumpOpcode = JumpCarry or: [aConditionalJumpOpcode = JumpNoCarry "carry flag is set if input is zero"]]]]
- 			[ClzRR]						->	[aConditionalJumpOpcode = JumpZero or: [aConditionalJumpOpcode = JumpNonZero or: [aConditionalJumpOpcode = JumpNoCarry or: [aConditionalJumpOpcode = JumpNoCarry "carry flag is set if input is zero"]]]]
  		}
  		otherwise: [self halt: 'unhandled opcode in setsConditionCodesFor:'. false]!

Item was changed:
  ----- Method: LargeIntegersPlugin>>digitDivLarge:with:negative: (in category 'oop functions') -----
  digitDivLarge: firstInteger with: secondInteger negative: neg 
  	"Does not normalize."
  	"Division by zero has to be checked in caller."
  	| firstDigitLen secondDigitLen quoDigitLen d div rem quo result |
  	firstDigitLen := self digitSizeOfLargeInt: firstInteger.
  	secondDigitLen := self digitSizeOfLargeInt: secondInteger.
  	quoDigitLen := firstDigitLen - secondDigitLen + 1.
  	quoDigitLen <= 0
  		ifTrue: 
  			[self remapOop: firstInteger in: [result := interpreterProxy instantiateClass: interpreterProxy classArray indexableSize: 2].
  			 result ifNotNil:
  				[interpreterProxy stObject: result at: 1 put: (0 asOop: SmallInteger).
  				 interpreterProxy stObject: result at: 2 put: firstInteger].
  			^ result].
  	"set rem and div to copies of firstInteger and secondInteger, respectively. 
  	 However,  to facilitate use of Knuth's algorithm, multiply rem and div by 2
  	 (that is, shift) until the high word of div is >=16r80000000"
  	d := 32 - (self cHighBit32: (self unsafeDigitOfLargeInt: secondInteger at: secondDigitLen)).
  	self remapOop: firstInteger
  		in:	[div := self digit: secondInteger Lshift: d.
  			 div ifNotNil:
  				[div := self largeInt: div growTo: (self digitSizeOfLargeInt: div) + 1 * 4].
  			 div ifNil: [^div]].
  	self remapOop: div
  		in:	[rem := self digit: firstInteger Lshift: d.
  			 rem ifNotNil:
  				[(self digitSizeOfLargeInt: rem) = firstDigitLen ifTrue:
  					[rem := self largeInt: rem growTo: firstDigitLen + 1 * 4]].
  			 rem ifNil: [^rem]].
  	self remapOop: #(div rem)
+ 		in: [quo := self createLargeIntegerNeg: neg digitLength: quoDigitLen.
+ 			quo ifNil:
+ 				[interpreterProxy primitiveFailFor: PrimErrNoMemory. ^quo]].
- 		in: [quo := self createLargeIntegerNeg: neg digitLength: quoDigitLen].
  	self
  		cDigitDiv: (self pointerToFirstDigitOfLargeInt: div)
  		len: (self digitSizeOfLargeInt: div)
  		rem: (self pointerToFirstDigitOfLargeInt: rem)
  		len: (self digitSizeOfLargeInt: rem)
  		quo: (self pointerToFirstDigitOfLargeInt: quo)
  		len: (self digitSizeOfLargeInt: quo).
  	self remapOop: quo
  		in: [rem := self digit: rem Rshift: d lookfirst: (self digitSizeOfLargeInt: div) - 1].
  	"^ Array with: quo with: rem"
  	self remapOop: #(quo rem)
  		in: [result := interpreterProxy instantiateClass: interpreterProxy classArray indexableSize: 2].
  	result ifNotNil:
  		[interpreterProxy stObject: result at: 1 put: quo.
  		 interpreterProxy stObject: result at: 2 put: rem].
  	^result!



More information about the Vm-dev mailing list