[Vm-dev] VM Maker: VMMaker.oscog-nice.2562.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Fri Sep 13 18:43:14 UTC 2019
We should throw away this one, I'll retry, see below:
Le ven. 13 sept. 2019 à 20:00, <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.2562.mcz
>
> ==================== Summary ====================
>
> Name: VMMaker.oscog-nice.2562
> Author: nice
> Time: 13 September 2019, 7:58:12.809297 pm
> UUID: 86118d22-2779-3e4a-8c91-733adca6fbd1
> Ancestors: VMMaker.oscog-eem.2561
>
> Attempt to avoid fetching BitBlt source past end boundary.
>
> This happens when we preload next source word.
> We preload next source word when we think that first source word does not
> contain enough pixels to fill first dest word.
>
> But this cannot happen if first source word contains more pixels than the
> whole BitBlt width (bbW).
>
> Note that the temp variable startBits is 1 based, thus we can use bbW <=
> startBits rather than bbW < startBits to check if the whole BitBlt width
> fit on 1st word (both for dest nWord = 1 and src when testing the need for
> preload).
>
> =============== Diff against VMMaker.oscog-eem.2561 ===============
>
> Item was changed:
> ----- Method: BitBltSimulation>>destMaskAndPointerInit (in category
> 'setup') -----
> destMaskAndPointerInit
> "Compute masks for left and right destination words"
> | startBits pixPerM1 endBits |
> <inline: true>
> pixPerM1 := destPPW - 1. "A mask, assuming power of two"
> "how many pixels in first word"
> startBits := destPPW - (dx bitAnd: pixPerM1).
> "how many pixels in last word"
> endBits := (dx + bbW - 1 bitAnd: pixPerM1) + 1.
> destMSB
> ifTrue:
> [mask1 := AllOnes >> (32 - (startBits *
> destDepth)).
> mask2 := AllOnes << (32 - (endBits * destDepth))]
> ifFalse:
> [mask1 := AllOnes << (32 - (startBits *
> destDepth)).
> mask2 := AllOnes >> (32 - (endBits * destDepth))].
> self cCode: [] inSmalltalk:
> [mask1 := mask1 bitAnd: 16rFFFFFFFF.
> mask2 := mask2 bitAnd: 16rFFFFFFFF].
>
> "determine number of words stored per line; merge masks if only 1"
> + bbW <= startBits
> - bbW < startBits
> ifTrue: [mask1 := mask1 bitAnd: mask2.
> mask2 := 0.
> nWords := 1]
> ifFalse: [nWords := bbW - startBits + pixPerM1 // destPPW
> + 1].
> hDir := vDir := 1. "defaults for no overlap with source"
>
> "calculate byte addr and delta, based on first word of data"
> "Note pitch is bytes and nWords is longs, not bytes"
> destIndex := destBits + (dy * destPitch) + ((dx // destPPW) * 4).
> destDelta := destPitch * vDir - (4 * (nWords * hDir)) "byte addr
> delta"!
>
> Item was changed:
> ----- Method: BitBltSimulation>>sourceSkewAndPointerInit (in category
> 'setup') -----
> sourceSkewAndPointerInit
> "This is only used when source and dest are same depth,
> ie, when the barrel-shift copy loop is used."
> | sxLowBits dxLowBits pixPerM1 startBits m1 |
> <inline: true>
> <var: 'm1' type: #'unsigned int'>
> self assert: (destPPW = sourcePPW and: [destMSB = sourceMSB and:
> [destDepth = sourceDepth]]).
> pixPerM1 := destPPW - 1. "A mask, assuming power of two"
> sxLowBits := sx bitAnd: pixPerM1.
> dxLowBits := dx bitAnd: pixPerM1.
> "how many pixels in first word"
> startBits := hDir > 0
> ifTrue: [sourcePPW - (sx bitAnd:
> pixPerM1)]
> ifFalse: [(sx + bbW - 1 bitAnd:
> pixPerM1) + 1].
> m1 := destMSB
> ifTrue: [AllOnes >> (32 - (startBits *
> destDepth))]
> ifFalse: [AllOnes << (32 - (startBits *
> destDepth))].
> + preload := bbW <= startBits and: [(m1 bitAnd: mask1) ~= mask1].
> "i.e. there are some missing bits"
> - preload := (m1 bitAnd: mask1) ~= mask1. "i.e. there are some
> missing bits"
>
Ah stupid! We must preload if it does not fit, that is bbW > startBits!!!
Let me retry...
>
> "calculate right-shift skew from source to dest"
> skew := destDepth * (sourceMSB ifTrue: [sxLowBits - dxLowBits]
> ifFalse: [dxLowBits - sxLowBits]). " -32..32 "
> preload ifTrue:
> [skew := skew < 0 ifTrue: [skew + 32] ifFalse: [skew -
> 32]].
>
> "Calc byte addr and delta from longWord info"
> sourceIndex := sourceBits + (sy * sourcePitch) + ((sx // (32 //
> sourceDepth)) * 4).
> "calculate increments from end of 1 line to start of next"
> sourceDelta := (sourcePitch * vDir) - (4 * (nWords * hDir)).
>
> preload ifTrue: "Compensate for extra source word fetched"
> [sourceDelta := sourceDelta - (4 * hDir)].
>
> self deny: (preload and: [skew = 0]).
> self assert: (skew between: -31 and: 31)!
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20190913/b031c547/attachment.html>
More information about the Vm-dev
mailing list