1 /* Implement POWERSET runtime actions for CHILL.
2 Copyright (C) 1992,1993 Free Software Foundation, Inc.
3 Author: Wilfried Moser, et al
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
28 * function __powerset_copy
29 * This is more general than __psslice, since it
30 * can be told where in the destination powerset (DOFFSET
31 * parameter) to start storing the slice.
35 * dbl destination bit length
36 * doffset offset bit number (zero origin)
38 * sbl source powerset length in bits
39 * start starting bit number
40 * end ending bit number
46 * Extract into a powerset a slice of another powerset.
50 __pscpy (dps, dbl, doffset, sps, sbl, start, length)
53 unsigned long doffset;
59 unsigned long end = start + length - 1;
60 unsigned long src, dst;
62 /* assert end >= start;
63 assert end - start + 1 <= dbl;
64 assert "the sets don't overlap in memory" */
66 /* assert doffset >= 0 and < dbl */
68 for (src = start, dst = doffset; src <= end; src++, dst++)
72 if (sbl <= SET_CHAR_SIZE) /* fetch a bit */
73 tmp = GET_BIT_IN_CHAR (*((SET_CHAR *)sps), src);
74 else if (sbl <= SET_SHORT_SIZE)
75 tmp = GET_BIT_IN_SHORT (*((SET_SHORT *)sps), src);
77 tmp = GET_BIT_IN_WORD (sps[src / SET_WORD_SIZE], src % SET_WORD_SIZE);
81 if (dbl <= SET_CHAR_SIZE) /* store a 1-bit */
82 SET_BIT_IN_CHAR (*((SET_CHAR *)dps), dst);
83 else if (dbl <= SET_SHORT_SIZE)
84 SET_BIT_IN_SHORT (*((SET_SHORT *)dps), dst);
86 SET_BIT_IN_WORD (dps[dst / SET_WORD_SIZE], dst % SET_WORD_SIZE);
90 if (dbl <= SET_CHAR_SIZE) /* store a 0-bit */
91 CLEAR_BIT_IN_CHAR (*((SET_CHAR *)dps), dst);
92 else if (dbl <= SET_SHORT_SIZE)
93 CLEAR_BIT_IN_SHORT (*((SET_SHORT *)dps), dst);
95 CLEAR_BIT_IN_WORD (dps[dst / SET_WORD_SIZE], dst % SET_WORD_SIZE);
98 if (dbl <= SET_CHAR_SIZE) /* clear unused bits in output bitstring */
100 MASK_UNUSED_CHAR_BITS ((SET_CHAR *)dps, dbl);
102 else if (dbl <= SET_SHORT_SIZE)
104 MASK_UNUSED_SHORT_BITS ((SET_SHORT *)dps, dbl);
108 MASK_UNUSED_WORD_BITS ((SET_WORD *)(dps + (dbl/SET_WORD_SIZE)),
109 dbl % SET_WORD_SIZE);