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]]! |
Bah, being nominated for the Charles Steinmetz Chalk Mark Medal was a great honor. But I never saw the $9,999, what the hell Henry Ford is doing with the money? I have to retry with an easier chalk mark, we've fortunately got complex enough machinery ;) Le mer. 30 oct. 2019 à 23:10, <[hidden email]> a écrit :
|
Free forum by Nabble | Edit this page |