5c shouldn't discard the cast, which implies a mask, but you should also rewrite the code as you suggest.
(it's not just 5c, since it's the same for several other RISCy ones.)


On Thu, Jul 25, 2019 at 12:20 PM Steve Simon <steve@quintile.net> wrote:
Hi,

I traced a long standing cifs issue to 5c the compiler.

The code in lib9p to validate wstat calls
uses a neat bit of casting which fails when using 5c.

/sys/src/lib9p/srv.c:658-669

These following lines missfire reporting type or qid change
when trying to rename files over cifs.

        if((ushort)~r->d.type){
        ...
        if((uchar)~r->d.qid.type || .. ){

but rewriting them like this makes the code work as expected:

        if(r->d.type != (ushort)~0){
        ...
        if(r->d.qid.type != (uchar)~0 || ... )

Personally I am happy to hack lib9p but the worry is that
this bug might be affecting other things.

I have no knowledge of the internals of the compilers so
I am afraid I have made no attempt to dig deeper.

-Steve