Files
sdk/runtime/vm/bitfield.h
T
vegorov@google.com 2b42069b43 Fix LoadOptimizer's handling of load/stores with constant indices for TypedData.
LoadOptimizer computes KILL sets in assumption that place X[C] can alias place X[K] if and only if K == C. This however does not hold for TypedData where X[0] can alias X[1] if we are reading 32bit value at X[0] and 8bit value at X[1]. The only thing that TypedData guarantees is that all accesses are done with byte offsets aligned by the size of the data type.

This change incorporates TypeData elements aliasing rules into LoadOptimizer:

- Place hierarchy was extended with constant index places for TypedData X[C|S]:
  - C is a byte offset to the element being read instead of an unscaled index that was used before;
  - S size of the element being read.

- KILL set computation ensures the following aliasing rule:

      X[C|S] aliases X[RoundDown(C, S')|S'] for all sizes S' > S

R=fschneider@google.com
BUG=http://dartbug.com/22120

Review URL: https://codereview.chromium.org//868283002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@43137 260f80e4-7a28-3924-810f-c04153c831b5
2015-01-26 15:14:35 +00:00

70 lines
1.9 KiB
C++

// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef VM_BITFIELD_H_
#define VM_BITFIELD_H_
namespace dart {
static const uword kUwordOne = 1U;
// BitField is a template for encoding and decoding a bit field inside
// an unsigned machine word.
template<typename T, int position, int size>
class BitField {
public:
static const intptr_t kNextBit = position + size;
// Tells whether the provided value fits into the bit field.
static bool is_valid(T value) {
return (static_cast<uword>(value) & ~((kUwordOne << size) - 1)) == 0;
}
// Returns a uword mask of the bit field.
static uword mask() {
return (kUwordOne << size) - 1;
}
// Returns a uword mask of the bit field which can be applied directly to
// to the raw unshifted bits.
static uword mask_in_place() {
return ((kUwordOne << size) - 1) << position;
}
// Returns the shift count needed to right-shift the bit field to
// the least-significant bits.
static int shift() {
return position;
}
// Returns the size of the bit field.
static int bitsize() {
return size;
}
// Returns a uword with the bit field value encoded.
static uword encode(T value) {
ASSERT(is_valid(value));
return static_cast<uword>(value) << position;
}
// Extracts the bit field from the value.
static T decode(uword value) {
return static_cast<T>((value >> position) & ((kUwordOne << size) - 1));
}
// Returns a uword with the bit field value encoded based on the
// original value. Only the bits corresponding to this bit field
// will be changed.
static uword update(T value, uword original) {
ASSERT(is_valid(value));
return (static_cast<uword>(value) << position) |
(~mask_in_place() & original);
}
};
} // namespace dart
#endif // VM_BITFIELD_H_