Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(412)

Side by Side Diff: vm/bitmap.cc

Issue 9701010: First step towards implementing stack map descriptions for the optimizing compiler. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 #include "vm/bitmap.h"
6
7 #include "platform/assert.h"
8 #include "vm/object.h"
9
10 namespace dart {
11
12 bool BitmapBuilder::Get(int32_t bit_offset) const {
13 if (!InRange(bit_offset)) {
14 return false;
15 }
16 return GetBit(bit_offset);
17 }
18
19
20 void BitmapBuilder::Set(int32_t bit_offset, bool value) {
21 while (!InRange(bit_offset)) {
22 int32_t new_size = size_ + kIncrementSize;
23 ASSERT(new_size > size_);
24 uint8_t* new_bit_list = reinterpret_cast<uint8_t*>(
25 Isolate::Current()->current_zone()->Allocate(new_size));
26 ASSERT(new_bit_list != NULL);
27 uint8_t* old_bit_list =
28 (size_ == kInitialSize) ? bit_list_ : bit_list_dynamic_;
srdjan 2012/03/14 17:31:32 You could instead have bit_list_dynamic_ point to
siva 2012/03/14 22:54:20 Good point. Done. On 2012/03/14 17:31:32, srdjan
29 memmove(new_bit_list, old_bit_list, size_);
30 memset((new_bit_list + size_), 0, kIncrementSize);
31 size_ = new_size;
32 bit_list_dynamic_ = new_bit_list;
33 }
34 SetBit(bit_offset, value);
35 }
36
37
38 // Return the bit offset of the highest bit set.
39 int32_t BitmapBuilder::Maximum() const {
40 int32_t bound = BitSize();
41 for (int32_t i = bound; i >= 0; i--) {
srdjan 2012/03/14 17:31:32 intptr_t
siva 2012/03/14 22:54:20 Done.
42 if (Get(i)) return i;
43 }
44 return Bitmap::kNoMaximum;
45 }
46
47
48 // Return the bit offset of the lowest bit set.
49 int32_t BitmapBuilder::Minimum() const {
50 int32_t bound = BitSize();
51 for (int32_t i = 0; i < bound; i++) {
52 if (Get(i)) return i;
53 }
54 return Bitmap::kNoMinimum;
55 }
56
57
58 void BitmapBuilder::SetRange(int32_t min, int32_t max, bool value) {
59 for (int32_t i = min; i <= max; i++) {
60 Set(i, value);
61 }
62 }
63
64
65 void BitmapBuilder::SetBits(const Bitmap& bitmap) {
66 int32_t min = bitmap.Minimum();
67 int32_t max = bitmap.Maximum();
68 if (min == Bitmap::kNoMinimum || max == Bitmap::kNoMaximum) {
69 return;
70 }
71 for (int32_t i = min; i <= max; i++) {
72 Set(i, bitmap.Get(i));
73 }
srdjan 2012/03/14 17:31:32 Don't you need to clear the bits outside Minimum..
siva 2012/03/14 22:54:20 Done.
74 }
75
76
77 RawBitmap* BitmapBuilder::GetBitmap() const {
78 const Bitmap& bmap = Bitmap::Handle(Bitmap::New(size_));
79 int32_t bound = BitSize();
80 for (int32_t i = 0; i < bound; i++) {
81 bmap.SetBit(i, Get(i));
82 }
83 return bmap.raw();
84 }
85
86
87 bool BitmapBuilder::GetBit(int32_t bit_offset) const {
88 ASSERT(InRange(bit_offset));
89 int byte_offset = bit_offset >> kBitsPerByteLog2;
90 int bit_remainder = bit_offset & (kBitsPerByte - 1);
91 uint8_t mask = 1U << bit_remainder;
92 if (size_ == kInitialSize) {
93 return ((bit_list_[byte_offset] & mask) != 0);
94 } else {
95 ASSERT(bit_list_dynamic_ != NULL);
96 return ((bit_list_dynamic_[byte_offset] & mask) != 0);
97 }
98 }
99
100
101 void BitmapBuilder::SetBit(int32_t bit_offset, bool value) {
102 ASSERT(InRange(bit_offset));
103 int byte_offset = bit_offset >> kBitsPerByteLog2;
104 int bit_remainder = bit_offset & (kBitsPerByte - 1);
105 uint8_t mask = 1U << bit_remainder;
106 uint8_t* byte_addr;
107 if (size_ == kInitialSize) {
108 byte_addr = &(bit_list_[byte_offset]);
109 } else {
110 ASSERT(bit_list_dynamic_ != NULL);
111 byte_addr = &(bit_list_dynamic_[byte_offset]);
112 }
113 if (value) {
114 *byte_addr |= mask;
115 } else {
116 *byte_addr &= ~mask;
117 }
118 }
119
120 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698