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

commits at source.squeak.org commits at source.squeak.org
Wed Oct 30 22:10:08 UTC 2019


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

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

Name: VMMaker.oscog-nice.2575
Author: nice
Time: 30 October 2019, 11:09:02.913836 pm
UUID: 7833e19b-d77a-4ead-af27-7744aa426280
Ancestors: VMMaker.oscog-nice.2574

Fix yet another BitBlt source access past end

https://github.com/OpenSmalltalk/opensmalltalk-vm/issues/441

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

Item was changed:
  ----- Method: BitBltSimulation>>copyLoop (in category 'inner loop') -----
  copyLoop
  	| prevWord thisWord skewWord halftoneWord mergeWord hInc y unskew skewMask notSkewMask mergeFnwith destWord |
  	"This version of the inner loop assumes noSource = false."
  	<inline: false>
  	<var: #prevWord type: #'unsigned int'>
  	<var: #thisWord type: #'unsigned int'>
  	<var: #skewWord type: #'unsigned int'>
  	<var: #halftoneWord type: #'unsigned int'>
  	<var: #mergeWord type: #'unsigned int'>
  	<var: #destWord type: #'unsigned int'>
  	<var: #skewMask type: #'unsigned int'>
  	<var: #notSkewMask type: #'unsigned int'>
  	<var: #unskew type: #int> "unskew is a bitShift and MUST remain signed, while skewMask is unsigned."
  	<var: #mergeFnwith declareC: 'unsigned int (*mergeFnwith)(unsigned int, unsigned int)'>
  	mergeFnwith := self cCoerce: (opTable at: combinationRule+1) to: 'unsigned int (*)(unsigned int, unsigned int)'.
  	mergeFnwith.  "null ref for compiler"
  
  	self deny: (preload and: [skew = 0]).
  	self assert: (skew between: -31 and: 31).
  
  	hInc := hDir * 4.  "Byte delta"
  	skew < 0
  		ifTrue: [unskew := skew + 32. skewMask := AllOnes << (0 - skew).
  				self cCode: [] inSmalltalk: [skewMask := skewMask bitAnd: 16rFFFFFFFF]]
  		ifFalse:
  			[skew = 0
  				ifTrue: [unskew := 0. skewMask := AllOnes]
  				ifFalse: [unskew := skew - 32. skewMask := AllOnes >> skew]].
  
  	notSkewMask := skewMask bitInvert32.
  	noHalftone
  		ifTrue: [halftoneWord := AllOnes.  halftoneHeight := 0]
  		ifFalse: [halftoneWord := self halftoneAt: 0].
  
  	y := dy.
  	"Here is the vertical loop, in two versions, one for the combinationRule = 3 copy mode, one for the general case."
  	combinationRule = 3
  		ifTrue:
  			[1 to: bbH do: "here is the vertical loop for combinationRule = 3 copy mode; no need to call merge"
  				[ :i |
  				halftoneHeight > 1 ifTrue:  "Otherwise, its always the same"
  					[halftoneWord := self halftoneAt: y.
  					y := y + vDir].
  				preload
  					ifTrue: "load the 64-bit shifter"
  						[prevWord := self srcLongAt: sourceIndex.
  						self incSrcIndex: hInc]
  					ifFalse:
  						[prevWord := 0].
  
  				"Note: the horizontal loop has been expanded into three parts for speed:"
  
  				"This first section requires masking of the destination store..."
  				destMask := mask1.
  				thisWord := self srcLongAt: sourceIndex.  "pick up next word"
  				self incSrcIndex: hInc.
  				skewWord := ((prevWord bitAnd: notSkewMask) bitShift: unskew)
  								bitOr:  "32-bit rotate"
  									((thisWord bitAnd: skewMask) bitShift: skew).
  				prevWord := thisWord.
  				destWord := self dstLongAt: destIndex.
  				destWord := (destMask bitAnd: (skewWord bitAnd: halftoneWord))
  								bitOr: (destWord bitAnd: destMask bitInvert32).
  				self dstLongAt: destIndex put: destWord.
  				self incDestIndex: hInc.
  
  				"This central horizontal loop requires no store masking"
  				destMask := AllOnes.
  				(skew = 0 and: [halftoneWord = AllOnes])
  					ifTrue: "Very special inner loop for STORE mode with no skew -- just move words"
  						[(preload and: [hDir = 1])
  							ifTrue:
  								[2 to: nWords-1 do: 
  									[ :word |  "Note loop starts with prevWord loaded (due to preload)"
  									self dstLongAt: destIndex put: prevWord.
  									self incDestIndex: hInc.
  									prevWord := self srcLongAt: sourceIndex.
  									self incSrcIndex: hInc]]
  							ifFalse:
  								[2 to: nWords-1 do: 
  									[ :word |
  									thisWord := self srcLongAt: sourceIndex.
  									self incSrcIndex: hInc.
  									self dstLongAt: destIndex put: thisWord.
  									self incDestIndex: hInc].
  								 prevWord := thisWord]]
  						ifFalse:
  							[2 to: nWords-1 do: 
  								[ :word |
  								thisWord := self srcLongAt: sourceIndex.
  								self incSrcIndex: hInc.
  								skewWord := ((prevWord bitAnd: notSkewMask) bitShift: unskew)
  												bitOr:  "32-bit rotate"
  											((thisWord bitAnd: skewMask) bitShift: skew).
  								prevWord := thisWord.
  								self dstLongAt: destIndex put: (skewWord bitAnd: halftoneWord).
  								self incDestIndex: hInc]].
  
  				"This last section, if used, requires masking of the destination store..."
  				nWords > 1 ifTrue:
  					[destMask := mask2.
+ 					thisWord :=((skewMask bitShift: skew) bitAnd: mask2) = 0
+ 						ifTrue: [0 "we don't need more bits, they will all come from prevWord"]
+ 						ifFalse: [self srcLongAt: sourceIndex.  "pick up last bits from next word".].
+ 					self incSrcIndex: hInc. "Note: this will be undone by inncSrcIndex: sourceDelta below if undue"
- 					thisWord := self srcLongAt: sourceIndex.  "pick up next word"
- 					self incSrcIndex: hInc.
  					skewWord := ((prevWord bitAnd: notSkewMask) bitShift: unskew)
  									bitOr:  "32-bit rotate"
  										((thisWord bitAnd: skewMask) bitShift: skew).
  					destWord := self dstLongAt: destIndex.
  					destWord := (destMask bitAnd: (skewWord bitAnd: halftoneWord))
  									bitOr: (destWord bitAnd: destMask bitInvert32).
  					self dstLongAt: destIndex put: destWord.
  					self incDestIndex: hInc].
  
  				self incSrcIndex: sourceDelta.
  				self incDestIndex: destDelta]]
  		ifFalse:
  			[1 to: bbH do: "here is the vertical loop for the general case (combinationRule ~= 3)"
  				[ :i |
  				halftoneHeight > 1 ifTrue:  "Otherwise, its always the same"
  					[halftoneWord := self halftoneAt: y.
  					y := y + vDir].
  				preload
  					ifTrue: "load the 64-bit shifter"
  						[prevWord := self srcLongAt: sourceIndex.
  						self incSrcIndex: hInc]
  					ifFalse:
  						[prevWord := 0].
  
  				"Note: the horizontal loop has been expanded into three parts for speed:"
  
  				"This first section requires masking of the destination store..."
  				destMask := mask1.
  				thisWord := self srcLongAt: sourceIndex.  "pick up next word"
  				self incSrcIndex: hInc.
  				skewWord := ((prevWord bitAnd: notSkewMask) bitShift: unskew)
  								bitOr:  "32-bit rotate"
  							((thisWord bitAnd: skewMask) bitShift: skew).
  				prevWord := thisWord.
  				destWord := self dstLongAt: destIndex.
  				mergeWord := self mergeFn: (skewWord bitAnd: halftoneWord) with: destWord.
  				destWord := (destMask bitAnd: mergeWord)
  								bitOr: (destWord bitAnd: destMask bitInvert32).
  				self dstLongAt: destIndex put: destWord.
  				self incDestIndex: hInc.
  
  				"This central horizontal loop requires no store masking"
  				destMask := AllOnes.
  				2 to: nWords-1 do: "Normal inner loop does merge:"
  					[ :word |
  					thisWord := self srcLongAt: sourceIndex.  "pick up next word"
  					self incSrcIndex: hInc.
  					skewWord := ((prevWord bitAnd: notSkewMask) bitShift: unskew)
  									bitOr:  "32-bit rotate"
  								((thisWord bitAnd: skewMask) bitShift: skew).
  					prevWord := thisWord.
  					mergeWord := self mergeFn: (skewWord bitAnd: halftoneWord)
  									with: (self dstLongAt: destIndex).
  					self dstLongAt: destIndex put: mergeWord.
  					self incDestIndex: hInc].
  
  				"This last section, if used, requires masking of the destination store..."
  				nWords > 1 ifTrue:
  					[destMask := mask2.
+ 					thisWord :=((skewMask bitShift: skew) bitAnd: mask2) = 0
+ 						ifTrue: [0 "we don't need more bits, they will all come from prevWord"]
+ 						ifFalse: [self srcLongAt: sourceIndex.  "pick up last bits from next word".].
+ 					self incSrcIndex: hInc. "Note: this will be undone by incSrcIndex: sourceDelta below if undue"
- 					thisWord := self srcLongAt: sourceIndex.  "pick up next word"
- 					self incSrcIndex: hInc.
  					skewWord := ((prevWord bitAnd: notSkewMask) bitShift: unskew)
  									bitOr:  "32-bit rotate"
  								((thisWord bitAnd: skewMask) bitShift: skew).
  					destWord := self dstLongAt: destIndex.
  					mergeWord := self mergeFn: (skewWord bitAnd: halftoneWord) with: destWord.
  					destWord := (destMask bitAnd: mergeWord)
  									bitOr: (destWord bitAnd: destMask bitInvert32).
  					self dstLongAt: destIndex put: destWord.
  					self incDestIndex: hInc].
  
  				self incSrcIndex: sourceDelta.
  				self incDestIndex: destDelta]]!



More information about the Vm-dev mailing list