[Vm-dev] VM Maker: VMMaker.oscog-nice.2575.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Wed Oct 30 22:23:54 UTC 2019
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, <commits at source.squeak.org> a écrit :
>
> 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]]!
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20191030/e6bf3566/attachment-0001.html>
More information about the Vm-dev
mailing list