[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