[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