diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-09-05 01:11:54 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-09-05 01:11:54 +0000 |
commit | ffcbbbab99149ea7d8e800326458b70b54438076 (patch) | |
tree | e2a997b294961a00f5d259edefbef93b8501c089 /libchill/copyps.c | |
parent | ff8e09bdcb33f98c7094eec337fb5e93da360a0d (diff) | |
download | gcc-ffcbbbab99149ea7d8e800326458b70b54438076.tar.gz |
* Chill runtime moved into toplevel libchill.
* Makefile.in Revamped due to move. Add multilib support.
* configure.in: Similarly. Use autoconf.
* powerset.h: Do not depend on BITS_PER_UNIT.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@22238 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libchill/copyps.c')
-rw-r--r-- | libchill/copyps.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/libchill/copyps.c b/libchill/copyps.c new file mode 100644 index 00000000000..226f429356b --- /dev/null +++ b/libchill/copyps.c @@ -0,0 +1,111 @@ +/* Implement POWERSET runtime actions for CHILL. + Copyright (C) 1992,1993 Free Software Foundation, Inc. + Author: Wilfried Moser, et al + +This file is part of GNU CC. + +GNU CC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU CC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#define __CHILL_LIB__ + +#include "config.h" +#include <stdio.h> +#include "powerset.h" + +/* + * function __powerset_copy + * This is more general than __psslice, since it + * can be told where in the destination powerset (DOFFSET + * parameter) to start storing the slice. + * + * parameters: + * dps dest powerset + * dbl destination bit length + * doffset offset bit number (zero origin) + * sps sourcepowerset + * sbl source powerset length in bits + * start starting bit number + * end ending bit number + * + * exceptions: + * none + * + * abstract: + * Extract into a powerset a slice of another powerset. + * + */ +void +__pscpy (dps, dbl, doffset, sps, sbl, start, length) + SET_WORD *dps; + unsigned long dbl; + unsigned long doffset; + const SET_WORD*sps; + unsigned long sbl; + unsigned long start; + unsigned long length; +{ + unsigned long end = start + length - 1; + unsigned long src, dst; + + /* assert end >= start; + assert end - start + 1 <= dbl; + assert "the sets don't overlap in memory" */ + + /* assert doffset >= 0 and < dbl */ + + for (src = start, dst = doffset; src <= end; src++, dst++) + { + char tmp; + + if (sbl <= SET_CHAR_SIZE) /* fetch a bit */ + tmp = GET_BIT_IN_CHAR (*((SET_CHAR *)sps), src); + else if (sbl <= SET_SHORT_SIZE) + tmp = GET_BIT_IN_SHORT (*((SET_SHORT *)sps), src); + else + tmp = GET_BIT_IN_WORD (sps[src / SET_WORD_SIZE], src % SET_WORD_SIZE); + + if (tmp & 1) + { + if (dbl <= SET_CHAR_SIZE) /* store a 1-bit */ + SET_BIT_IN_CHAR (*((SET_CHAR *)dps), dst); + else if (dbl <= SET_SHORT_SIZE) + SET_BIT_IN_SHORT (*((SET_SHORT *)dps), dst); + else + SET_BIT_IN_WORD (dps[dst / SET_WORD_SIZE], dst % SET_WORD_SIZE); + } + else + { + if (dbl <= SET_CHAR_SIZE) /* store a 0-bit */ + CLEAR_BIT_IN_CHAR (*((SET_CHAR *)dps), dst); + else if (dbl <= SET_SHORT_SIZE) + CLEAR_BIT_IN_SHORT (*((SET_SHORT *)dps), dst); + else + CLEAR_BIT_IN_WORD (dps[dst / SET_WORD_SIZE], dst % SET_WORD_SIZE); + } + } + if (dbl <= SET_CHAR_SIZE) /* clear unused bits in output bitstring */ + { + MASK_UNUSED_CHAR_BITS ((SET_CHAR *)dps, dbl); + } + else if (dbl <= SET_SHORT_SIZE) + { + MASK_UNUSED_SHORT_BITS ((SET_SHORT *)dps, dbl); + } + else + { + MASK_UNUSED_WORD_BITS ((SET_WORD *)(dps + (dbl/SET_WORD_SIZE)), + dbl % SET_WORD_SIZE); + } +} |