Imported Upstream version 1.0.0
[platform/upstream/js.git] / js / src / nanojit / Containers.cpp
1 /* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4 -*- */
2 /* vi: set ts=4 sw=4 expandtab: (add to ~/.vimrc: set modeline modelines=5) */
3 /* ***** BEGIN LICENSE BLOCK *****
4  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5  *
6  * The contents of this file are subject to the Mozilla Public License Version
7  * 1.1 (the "License"); you may not use this file except in compliance with
8  * the License. You may obtain a copy of the License at
9  * http://www.mozilla.org/MPL/
10  *
11  * Software distributed under the License is distributed on an "AS IS" basis,
12  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13  * for the specific language governing rights and limitations under the
14  * License.
15  *
16  * The Original Code is [Open Source Virtual Machine].
17  *
18  * The Initial Developer of the Original Code is
19  * Adobe System Incorporated.
20  * Portions created by the Initial Developer are Copyright (C) 2004-2007
21  * the Initial Developer. All Rights Reserved.
22  *
23  * Contributor(s):
24  *   Adobe AS3 Team
25  *
26  * Alternatively, the contents of this file may be used under the terms of
27  * either the GNU General Public License Version 2 or later (the "GPL"), or
28  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29  * in which case the provisions of the GPL or the LGPL are applicable instead
30  * of those above. If you wish to allow use of your version of this file only
31  * under the terms of either the GPL or the LGPL, and not to allow others to
32  * use your version of this file under the terms of the MPL, indicate your
33  * decision by deleting the provisions above and replace them with the notice
34  * and other provisions required by the GPL or the LGPL. If you do not delete
35  * the provisions above, a recipient may use your version of this file under
36  * the terms of any one of the MPL, the GPL or the LGPL.
37  *
38  * ***** END LICENSE BLOCK ***** */
39
40 #include "nanojit.h"
41
42 #ifdef FEATURE_NANOJIT
43
44 namespace nanojit
45 {
46     BitSet::BitSet(Allocator& allocator, int nbits)
47         : allocator(allocator)
48         , cap((nbits+63)>>6)
49         , bits((int64_t*)allocator.alloc(cap * sizeof(int64_t)))
50     {
51         reset();
52     }
53
54     void BitSet::reset()
55     {
56         for (int i=0, n=cap; i < n; i++)
57             bits[i] = 0;
58     }
59
60     bool BitSet::setFrom(BitSet& other)
61     {
62         int c = other.cap;
63         if (c > cap)
64             grow(c);
65         int64_t *bits = this->bits;
66         int64_t *otherbits = other.bits;
67         int64_t newbits = 0;
68         for (int i=0; i < c; i++) {
69             int64_t b = bits[i];
70             int64_t b2 = otherbits[i];
71             newbits |= b2 & ~b; // bits in b2 that are not in b
72             bits[i] = b|b2;
73         }
74         return newbits != 0;
75     }
76
77     /** keep doubling the bitset length until w fits */
78     void BitSet::grow(int w)
79     {
80         int cap2 = cap;
81         do {
82             cap2 <<= 1;
83         } while (w > cap2);
84         int64_t *bits2 = (int64_t*) allocator.alloc(cap2 * sizeof(int64_t));
85         int j=0;
86         for (; j < cap; j++)
87             bits2[j] = bits[j];
88         for (; j < cap2; j++)
89             bits2[j] = 0;
90         cap = cap2;
91         bits = bits2;
92     }
93 }
94
95 #endif // FEATURE_NANOJIT