diff options
Diffstat (limited to 'contrib/libf2c/libF77/lbitbits.c')
-rw-r--r-- | contrib/libf2c/libF77/lbitbits.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/contrib/libf2c/libF77/lbitbits.c b/contrib/libf2c/libF77/lbitbits.c new file mode 100644 index 0000000..3b28ae9 --- /dev/null +++ b/contrib/libf2c/libF77/lbitbits.c @@ -0,0 +1,58 @@ +#include "f2c.h" + +#ifndef LONGBITS +#define LONGBITS 32 +#endif + +integer +lbit_bits (integer a, integer b, integer len) +{ + /* Assume 2's complement arithmetic */ + + unsigned long x, y; + + x = (unsigned long) a; + y = (unsigned long) -1L; + x >>= b; + y <<= len; + return (integer) (x & ~y); +} + +integer +lbit_cshift (integer a, integer b, integer len) +{ + unsigned long x, y, z; + + x = (unsigned long) a; + if (len <= 0) + { + if (len == 0) + return 0; + goto full_len; + } + if (len >= LONGBITS) + { + full_len: + if (b >= 0) + { + b %= LONGBITS; + return (integer) (x << b | x >> (LONGBITS - b)); + } + b = -b; + b %= LONGBITS; + return (integer) (x << (LONGBITS - b) | x >> b); + } + y = z = (unsigned long) -1; + y <<= len; + z &= ~y; + y &= x; + x &= z; + if (b >= 0) + { + b %= len; + return (integer) (y | (z & (x << b | x >> (len - b)))); + } + b = -b; + b %= len; + return (integer) (y | (z & (x >> b | x << (len - b)))); +} |