[Vm-dev] VM Maker: VMMaker.oscog-eem.790.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Wed Jul 2 05:35:39 UTC 2014
2014-07-02 2:36 GMT+02:00 Eliot Miranda <eliot.miranda at gmail.com>:
>
>
>
>
> On Tue, Jul 1, 2014 at 12:21 PM, Nicolas Cellier <
> nicolas.cellier.aka.nice at gmail.com> 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???
>>
>
> I'm not maintaining the plugin. But I broke it in fixing the unsigned
> division anomaly. I just wanted it to work again as quickly as possibly
> without expending effort. I made the minimum changes I could to keep it
> working. I'm much happier to have you maintain the plugin. You have the
> expertise and experience.
>
> Nicolas, my priority is to have Spur working. I don't want to have to
> expend lots of energy changing plugins to get Spur working. My submitting
> this fix is not an endorsement of any kind. It's merely expediency.
>
>
Yes, I understand, the smallest modification that could possibly work.
But this sign-tolerant form of (z bitAnd: 255) just make me sick ;)
I'll try and fix it once I understand the 64 bits VM problem.
cheers
> Even if z is declared signed, (z bitAnd: 255) would work on a vast
>> majority of compiler/processor because most compiler/processor would use a
>> 2-complement representation.
>> But it's technically implementation-defined.
>>
>> + z := z signedBitShift: -8].
>>>
>>
>> i think this one is OK too on a vast majority of machines, but this is as
>> well technically implementation defined.
>> Some weird compiler/processor pair may as well fill left bits with
>> zeroes, or not even use 2-complement...
>>
>> z here is a carry and should contain either 0, or -1 (that is UINT_MAX)
>> after this operation.
>>
>>
>>
>>> + smallLen to: largeLen - 1 do:
>>> - pByteRes at: i put: z - (z // 256 * 256).
>>> - "sign-tolerant form of (z bitAnd: 255)"
>>> - z := z // 256].
>>> - limit := largeLen - 1.
>>> - smallLen to: limit do:
>>> [:i |
>>> z := z + (pByteLarge at: i) .
>>> + pByteRes at: i put: z - (z // 256 * 256). "sign-tolerant
>>> form of (z bitAnd: 255)"
>>> + z := z signedBitShift: -8].
>>> - pByteRes at: i put: z - (z // 256 * 256).
>>> - "sign-tolerant form of (z bitAnd: 255)"
>>> - z := z // 256].
>>> !
>>>
>>
>> Isn't there another funny signed shift in Large Integer division?
>> This would deserve a review too, because division is inlining its own
>> sort of subtraction...
>>
>>
>
>
> --
> best,
> Eliot
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20140702/770bf0f5/attachment.htm
More information about the Vm-dev
mailing list