[Vm-dev] VM Maker: VMMaker.oscog-eem.790.mcz
David T. Lewis
lewis at mail.msen.com
Tue Jul 1 22:28:51 UTC 2014
On Tue, Jul 01, 2014 at 09:21:00PM +0200, Nicolas Cellier wrote:
>
> 2014-07-01 4:22 GMT+02:00 <commits at source.squeak.org>:
>
> >
> > Item was changed:
> > ----- Method: LargeIntegersPlugin>>cDigitSub:len:with:len:into: (in
> > category 'C core') -----
> > + cDigitSub: pByteSmall len: smallLen with: pByteLarge len: largeLen into:
> > pByteRes
> > + | z |
> > - cDigitSub: pByteSmall
> > - len: smallLen
> > - with: pByteLarge
> > - len: largeLen
> > - into: pByteRes
> > - | z limit |
> > <var: #pByteSmall type: 'unsigned char * '>
> > <var: #pByteLarge type: 'unsigned char * '>
> > <var: #pByteRes type: 'unsigned char * '>
> >
> > + z := 0. "Loop invariant is -1<=z<=1"
> > + 0 to: smallLen - 1 do:
> > - z := 0.
> > - "Loop invariant is -1<=z<=1"
> > - limit := smallLen - 1.
> > - 0 to: limit do:
> > [:i |
> > z := z + (pByteLarge at: i) - (pByteSmall at: i).
> > + pByteRes at: i put: z - (z // 256 * 256). "sign-tolerant
> > form of (z bitAnd: 255)"
> >
>
> Frankly, having z declared unsigned int and just doing pByteRes at: i put:
> (z bitAnd: 16rFF) as I suggested would be way way simpler and will ALWAYS
> work.
> Why the hell invoke the complications of signed arithmetic when the content
> pByteRes is unsigned???
Nicolas,
This sounds right to me.
Do you have a final version of #cDigitSub:len:with:len:into: that you can
recommend? The version in VMMaker-nice.342 produces failures in the
KernelTests-Numbers tests when compiled in 64-bit mode, but I think that
you have since suggested some other improvements in this email thread.
Dave
More information about the Vm-dev
mailing list