A 15 character 64 to 32-bit generator I devised which passes dieharder:
(x+=x*x+9)>>32; (x+=x*x+9)>>32; x+=x*x+9;
Are you sure you don't mean x+=((x*x+9)>>32);
(and does that need the outer parentheses?) I doubt the first passes dieharder, as (if my C isn't too rusty) it alternates between odd and even numbers.e.g:
uint64_t x = 0;
...
uint32_t y = (x+=x*x+9)>>32;