[PPL-devel] Re: Integers as bit arrays

Brian Hurt bhurt@spnz.org
Wed, 30 Jul 2003 17:37:00 -0500 (CDT)


On Wed, 30 Jul 2003, Roberto Bagnara wrote:

> Good.  For the names, I think the choice belongs to senior GMP
> developer; for the good implementations, what I contributed is
> a possible starting point that Brian can refine at will (I will
> release it under a different license if that helps).

An update on my stuff, for those who care: I'm working on the bitblit
routine.  This is the core function- where most of the work happens.  It's 
prototype is:

void bitblit (
    mp_limb_t * dst,
    unsigned dst_off,
    mp_limb_t * src, 
    unsigned src_off,
    unsigned num_bits) 

Unfortunately, I've set rather high goals for myself: such a routine
should be a) in portable C (I've allowed myself to assume that limbs are a
set of bits- i.e. BCD systems won't work, but nothing else), b) reasonably
efficient, c) handles all corner cases correctly, d) is maintainable
and understandable (i.e. can be used by the assembly language programmers
as a template for needed functionality), and e) special-cases as little as 
possible.

The corner cases and special cases are the problem.  Consider for a moment 
what the value of 1 << GMP_NUMB_BITS is.  On some systems, the result 
would be 0- the 1 would be "shifted off the left" of the word.  Other 
systems, however, mod the shift amount by GMP_NUMB_BITS before starting 
the shifting.  So the above expression would be equal to 
1 << (GMP_NUMB_BITS % GMP_NUMB_BITS) == 1 << 0 == 1.  Opps.  But now every 
time I want to just do x << (GMP_NUMB_BITS - y), I need to make sure that 
y > 0!.  Likewise, x << -1 is a bad idea as well- which means any time I 
want to do x << (y - 1) I also need y > 0.  

This is where I'm getting the explosion of special cases to handle these
corner cases.  But I don't want to have too many special cases- each
special case is another branch, and that starts hurting performance.  Nor 
do I want to do things exceptionally tricky (or exceptionally verbose), as 
this hurts maintainability.  Etc.

I'm getting there- it's just taking a little longer than expected.  Please 
stand by.

Brian