[sldev] [VWR] OpenJPEG backtraces (Robin Cornelius)
Lawson English
lenglish5 at cox.net
Sat Sep 22 08:24:51 PDT 2007
Argent Stonecutter wrote:
>> h.mem = v.mem = (int*)( (unsigned)m + 16 - ( (unsigned)m % 16 ) ) ;
>
> Ick.
>
> Try this:
>
> h.mem = v.mem = (int*)( (char *)m + 16 - ( (char *)m % 16 ) ) ;
>
> There's possibly a derived type that is more "ANSI", but this is valid
> portable C.
>
> In addition, I'm not sure that this code is doing the right thing. It
> seems to be an attempt to round a pointer up to the next 16 byte
> boundary, but where the pointer is already pointing to a 16 byte
> boundary is it really supposed to increment it to the next boundary?
> If this is just making sure there's room for some specifically aligned
> objects below the pointer it will introduce unnecessary 16 byte gaps
> in the result.
>
> May I suggest (int *)( ((char *) m + 0x10) & ~0x0F ) to round up to
> the next 16-byte boundary even if you're on a 16-byte boundary, or
> (int *)( ((char *) m + 0x0F) & ~0x0F ) to just round up to the next
> 16-byte boundary.
>
> Finally, the original code is amusing because the "unsigned" type was
> introduced to C because people were having to cast ints to pointers to
> get unsigned arithmetic. Since this is arithmetic on pointers to begin
> with... :)
> _______________________________________________
/me suddenly recalls why he despises intel. No other architecture has to
worry about this crap.
More information about the SLDev
mailing list