remAddr# primop inconsistency
Ben Gamari
ben at well-typed.com
Sat Feb 6 16:04:28 UTC 2021
Csaba Hruska <csaba.hruska at gmail.com> writes:
> Hello,
>
> I've discovered that the remAddr# primop documentation is inconsistent with
> the implementation.
> According to the docs (primops.txt.pp) the remAddr# should be the same as
> remInt#.
>
>> primop AddrRemOp "remAddr#" GenPrimOp Addr# -> Int# -> Int# {Return the remainder when the {\tt Addr\#} arg, treated like an {\tt Int\#}, is divided by the {\tt Int\#} arg.}
>>
>> But it is implemented with the mo_wordURem instruction, just like the
> WordRemOp primop.
>
>> GHC/StgToCmm/Prim.hs:
>>
> AddrRemOp -> \args -> opTranslate args (mo_wordURem platform)
>>
> WordRemOp -> \args -> opTranslate args (mo_wordURem platform)
>>
> IntRemOp -> \args -> opTranslate args (mo_wordSRem platform)
>>
>
> Which one is correct, the docs or the implementation?
That is a good question. The only user (in the GHC tree) is
GHC.Ptr.alignPtr which appears to want the Word semantics (that is, it
would break given a negative remainder). Moreover, my mental model of
pointers is that for the purposes of arithmetic they are non-negative.
Therefore, I belive that the documentation here is wrong.
I have opened #19332 to track this.
Cheers,
- Ben
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 487 bytes
Desc: not available
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20210206/9016bcae/attachment.sig>
More information about the ghc-devs
mailing list