VM Maker: VMMaker.oscog-nice.2575.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-nice.2575.mcz

commits-2
 
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]]!

Reply | Threaded
Open this post in threaded view
|

Re: VM Maker: VMMaker.oscog-nice.2575.mcz

Nicolas Cellier
 
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 :
 
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]]!