in reply to Re^4: 64-bit *nix/gcc expertise required
in thread 64-bit *nix/gcc expertise required (THIS IS NOT OFF TOPIC!)

I can do it with a pointer, but in that case, the pointer should be a pointer to a char, and not to an unsigned int.

#include <stdio.h> #define ALIGN_BITS (sizeof (void *) >> 1LL) #define BIT_BITS 3LL #define BYTE_BITS 14LL #define SLOT_BITS (sizeof (void *) * 8) - (ALIGN_BITS + BIT_BITS + + BYTE_BITS) #define BYTES_PER_SLOT 1LL << BYTE_BITS #define TRACKING_SLOTS 8192 typedef unsigned long long ull_t; typedef unsigned char *ull_p; int check_new (ull_p p) { ull_t slot = ((ull_t)p >> (BYTE_BITS + BIT_BITS + ALIGN_BITS)); ull_t byte = ((ull_t)p >> (ALIGN_BITS + BIT_BITS)) & 0x00003fffLL; ull_t bit = ((ull_t)p >> ALIGN_BITS) & 0x00000007LL; ull_t nop = (ull_t)p & 0x3LL; printf ("address: %012p slot: %012p byte: %4llx bit: %4llx nop: %l +lx\n", p, (ull_p)slot, byte, bit, nop); return (1); } /* check_new */ int main (int argc, char *argv[]) { ull_p p; for (p = (ull_p)123456ULL; p < (ull_p)(1ULL << 34); p += (1ULL << +29)) check_new (p); } /* main */

Will yield

address: 000000000001e240 slot: 0000000000000000 byte: 3c4 bit: 4 +nop: 0 address: 000000002001e240 slot: 0000000000000100 byte: 3c4 bit: 4 +nop: 0 address: 000000004001e240 slot: 0000000000000200 byte: 3c4 bit: 4 +nop: 0 address: 000000006001e240 slot: 0000000000000300 byte: 3c4 bit: 4 +nop: 0 address: 000000008001e240 slot: 0000000000000400 byte: 3c4 bit: 4 +nop: 0 address: 00000000a001e240 slot: 0000000000000500 byte: 3c4 bit: 4 +nop: 0 address: 00000000c001e240 slot: 0000000000000600 byte: 3c4 bit: 4 +nop: 0 address: 00000000e001e240 slot: 0000000000000700 byte: 3c4 bit: 4 +nop: 0 address: 000000010001e240 slot: 0000000000000800 byte: 3c4 bit: 4 +nop: 0 address: 000000012001e240 slot: 0000000000000900 byte: 3c4 bit: 4 +nop: 0 address: 000000014001e240 slot: 0000000000000a00 byte: 3c4 bit: 4 +nop: 0 address: 000000016001e240 slot: 0000000000000b00 byte: 3c4 bit: 4 +nop: 0 address: 000000018001e240 slot: 0000000000000c00 byte: 3c4 bit: 4 +nop: 0 address: 00000001a001e240 slot: 0000000000000d00 byte: 3c4 bit: 4 +nop: 0 address: 00000001c001e240 slot: 0000000000000e00 byte: 3c4 bit: 4 +nop: 0 address: 00000001e001e240 slot: 0000000000000f00 byte: 3c4 bit: 4 +nop: 0 address: 000000020001e240 slot: 0000000000001000 byte: 3c4 bit: 4 +nop: 0 address: 000000022001e240 slot: 0000000000001100 byte: 3c4 bit: 4 +nop: 0 address: 000000024001e240 slot: 0000000000001200 byte: 3c4 bit: 4 +nop: 0 address: 000000026001e240 slot: 0000000000001300 byte: 3c4 bit: 4 +nop: 0 address: 000000028001e240 slot: 0000000000001400 byte: 3c4 bit: 4 +nop: 0 address: 00000002a001e240 slot: 0000000000001500 byte: 3c4 bit: 4 +nop: 0 address: 00000002c001e240 slot: 0000000000001600 byte: 3c4 bit: 4 +nop: 0 address: 00000002e001e240 slot: 0000000000001700 byte: 3c4 bit: 4 +nop: 0 address: 000000030001e240 slot: 0000000000001800 byte: 3c4 bit: 4 +nop: 0 address: 000000032001e240 slot: 0000000000001900 byte: 3c4 bit: 4 +nop: 0 address: 000000034001e240 slot: 0000000000001a00 byte: 3c4 bit: 4 +nop: 0 address: 000000036001e240 slot: 0000000000001b00 byte: 3c4 bit: 4 +nop: 0 address: 000000038001e240 slot: 0000000000001c00 byte: 3c4 bit: 4 +nop: 0 address: 00000003a001e240 slot: 0000000000001d00 byte: 3c4 bit: 4 +nop: 0 address: 00000003c001e240 slot: 0000000000001e00 byte: 3c4 bit: 4 +nop: 0 address: 00000003e001e240 slot: 0000000000001f00 byte: 3c4 bit: 4 +nop: 0

And for short *:

address: 000000000001e240 slot: 0000000000000000 byte: 3c4 bit: 4 +nop: 0 address: 000000004001e240 slot: 0000000000000200 byte: 3c4 bit: 4 +nop: 0 address: 000000008001e240 slot: 0000000000000400 byte: 3c4 bit: 4 +nop: 0 address: 00000000c001e240 slot: 0000000000000600 byte: 3c4 bit: 4 +nop: 0 address: 000000010001e240 slot: 0000000000000800 byte: 3c4 bit: 4 +nop: 0 address: 000000014001e240 slot: 0000000000000a00 byte: 3c4 bit: 4 +nop: 0 address: 000000018001e240 slot: 0000000000000c00 byte: 3c4 bit: 4 +nop: 0 address: 00000001c001e240 slot: 0000000000000e00 byte: 3c4 bit: 4 +nop: 0 address: 000000020001e240 slot: 0000000000001000 byte: 3c4 bit: 4 +nop: 0 address: 000000024001e240 slot: 0000000000001200 byte: 3c4 bit: 4 +nop: 0 address: 000000028001e240 slot: 0000000000001400 byte: 3c4 bit: 4 +nop: 0 address: 00000002c001e240 slot: 0000000000001600 byte: 3c4 bit: 4 +nop: 0 address: 000000030001e240 slot: 0000000000001800 byte: 3c4 bit: 4 +nop: 0 address: 000000034001e240 slot: 0000000000001a00 byte: 3c4 bit: 4 +nop: 0 address: 000000038001e240 slot: 0000000000001c00 byte: 3c4 bit: 4 +nop: 0

And for int *:

address: 000000000001e240 slot: 0000000000000000 byte: 3c4 bit: 4 +nop: 0 address: 000000008001e240 slot: 0000000000000400 byte: 3c4 bit: 4 +nop: 0 address: 000000010001e240 slot: 0000000000000800 byte: 3c4 bit: 4 +nop: 0 address: 000000018001e240 slot: 0000000000000c00 byte: 3c4 bit: 4 +nop: 0 address: 000000020001e240 slot: 0000000000001000 byte: 3c4 bit: 4 +nop: 0 address: 000000028001e240 slot: 0000000000001400 byte: 3c4 bit: 4 +nop: 0 address: 000000030001e240 slot: 0000000000001800 byte: 3c4 bit: 4 +nop: 0 address: 000000038001e240 slot: 0000000000001c00 byte: 3c4 bit: 4 +nop: 0

And for long long *:

address: 000000000001e240 slot: 0000000000000000 byte: 3c4 bit: 4 +nop: 0 address: 000000010001e240 slot: 0000000000000800 byte: 3c4 bit: 4 +nop: 0 address: 000000020001e240 slot: 0000000000001000 byte: 3c4 bit: 4 +nop: 0 address: 000000030001e240 slot: 0000000000001800 byte: 3c4 bit: 4 +nop: 0

Enjoy, Have FUN! H.Merijn

Replies are listed 'Best First'.
Re^6: 64-bit *nix/gcc expertise required
by BrowserUk (Patriarch) on Dec 24, 2010 at 17:15 UTC

    That looks a lot closer, but what happens if compile that for 32-bit? (The for loop will never terminate, but that's inconsequential to the real use>)


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      That - as expected - gives us warnings:

      "test.c", line 21: warning #2171-D: invalid type conversion p, (ull_p)slot, byte, bit, nop); ^ "test.c", line 29: warning #2171-D: invalid type conversion for (p = (ull_p)123456ULL; p < (ull_p)(1ULL << 34); p += (1ULL < +< 29)) ^ "test.c", line 29: warning #2171-D: invalid type conversion for (p = (ull_p)123456ULL; p < (ull_p)(1ULL << 34); p += (1ULL < +< 29)) ^ "test.c", line 29: remark #4274-D: comparison of pointer with integer +zero for (p = (ull_p)123456ULL; p < (ull_p)(1ULL << 34); p += (1ULL < +< 29)) ^

      And when running ...

      ELF-32 executable object file - IA64 No output at all

      Enjoy, Have FUN! H.Merijn

        Tux Many thanks for your assistance. Up for a bit more?

        In theory, based on my reading the gcc headers, this should compile clean under 32/64-bit. It probably won't, but once you recover from your seasonal revelries, I'd appreciated seeing the warnings/errors produced on your various platforms.

        #include <stdio.h> #define __STDC_LIMIT_MACROS #include <stdint.h> #include <stddef.h> #define ALIGN_BITS ( sizeof(void*) >> __UINT64_C( 1 ) ) #define BIT_BITS __UINT64_C( 3 ) #define BYTE_BITS __UINT64_C( 14 ) #define SLOT_BITS ( sizeof( void*) * 8 ) - ( ALIGN_BITS + BIT_BITS + + BYTE_BITS ) #define BYTES_PER_SLOT __UINT64_C( 1 ) << BYTE_BITS #define TRACKING_SLOTS 8192 // max. 8192 for 4GB/32-bit machine int check_new( uintptr_t p ) { ptrdiff_t slot = ( p >> (BYTE_BITS + BIT_BITS + ALIGN_BITS) ); ptrdiff_t byte = ( p >> (ALIGN_BITS + BIT_BITS)) & __UINT64_C( 0x0 +0003fff ) ptrdiff_t bit = ( p >> ALIGN_BITS) & __UINT64_C( 0x0 +0000007 ); ptrdiff_t nop = p & __UINT64_C( 0x3 + ); printf( "address: %p slot: %p byte: %4x bit: %4x nop:%x\n", p, slot, byte, bit, nop ); return 1; } void main( void ) { uintptr_t p; for( p = __UINT64_C( 123456 ); p < ( __UINT64_C( 1 ) << 34 ); p += + ( __UINT64_C( 1 ) << 29 ) ) { check_new( p ); } }

        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.
        Change 34 to 31 to get some output.