27433918f5
R=bmeurer@chromium.org,jarin@chromium.org BUG= Review URL: https://codereview.chromium.org/1498833002 Cr-Commit-Position: refs/heads/master@{#32564}
129 lines
3.6 KiB
C++
129 lines
3.6 KiB
C++
// Copyright 2014 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef V8_MACHINE_TYPE_H_
|
|
#define V8_MACHINE_TYPE_H_
|
|
|
|
#include <iosfwd>
|
|
|
|
#include "src/base/bits.h"
|
|
#include "src/globals.h"
|
|
#include "src/signature.h"
|
|
#include "src/zone.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
|
|
// Machine-level types and representations.
|
|
// TODO(titzer): Use the real type system instead of MachineType.
|
|
enum MachineType : uint16_t {
|
|
// Representations.
|
|
kRepBit = 1u << 0,
|
|
kRepWord8 = 1u << 1,
|
|
kRepWord16 = 1u << 2,
|
|
kRepWord32 = 1u << 3,
|
|
kRepWord64 = 1u << 4,
|
|
kRepFloat32 = 1u << 5,
|
|
kRepFloat64 = 1u << 6,
|
|
kRepTagged = 1u << 7,
|
|
|
|
// Types.
|
|
kTypeBool = 1u << 8,
|
|
kTypeInt32 = 1u << 9,
|
|
kTypeUint32 = 1u << 10,
|
|
kTypeInt64 = 1u << 11,
|
|
kTypeUint64 = 1u << 12,
|
|
kTypeNumber = 1u << 13,
|
|
kTypeAny = 1u << 14,
|
|
|
|
// Machine types.
|
|
kMachNone = 0u,
|
|
kMachBool = kRepBit | kTypeBool,
|
|
kMachFloat32 = kRepFloat32 | kTypeNumber,
|
|
kMachFloat64 = kRepFloat64 | kTypeNumber,
|
|
kMachInt8 = kRepWord8 | kTypeInt32,
|
|
kMachUint8 = kRepWord8 | kTypeUint32,
|
|
kMachInt16 = kRepWord16 | kTypeInt32,
|
|
kMachUint16 = kRepWord16 | kTypeUint32,
|
|
kMachInt32 = kRepWord32 | kTypeInt32,
|
|
kMachUint32 = kRepWord32 | kTypeUint32,
|
|
kMachInt64 = kRepWord64 | kTypeInt64,
|
|
kMachUint64 = kRepWord64 | kTypeUint64,
|
|
kMachIntPtr = (kPointerSize == 4) ? kMachInt32 : kMachInt64,
|
|
kMachUintPtr = (kPointerSize == 4) ? kMachUint32 : kMachUint64,
|
|
kMachPtr = (kPointerSize == 4) ? kRepWord32 : kRepWord64,
|
|
kMachAnyTagged = kRepTagged | kTypeAny
|
|
};
|
|
|
|
V8_INLINE size_t hash_value(MachineType type) {
|
|
return static_cast<size_t>(type);
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const MachineType& type);
|
|
|
|
typedef uint16_t MachineTypeUnion;
|
|
|
|
// Globally useful machine types and constants.
|
|
const MachineTypeUnion kRepMask = kRepBit | kRepWord8 | kRepWord16 |
|
|
kRepWord32 | kRepWord64 | kRepFloat32 |
|
|
kRepFloat64 | kRepTagged;
|
|
const MachineTypeUnion kTypeMask = kTypeBool | kTypeInt32 | kTypeUint32 |
|
|
kTypeInt64 | kTypeUint64 | kTypeNumber |
|
|
kTypeAny;
|
|
|
|
// Gets only the type of the given type.
|
|
inline MachineType TypeOf(MachineType machine_type) {
|
|
int result = machine_type & kTypeMask;
|
|
return static_cast<MachineType>(result);
|
|
}
|
|
|
|
// Gets only the representation of the given type.
|
|
inline MachineType RepresentationOf(MachineType machine_type) {
|
|
int result = machine_type & kRepMask;
|
|
CHECK(base::bits::IsPowerOfTwo32(result));
|
|
return static_cast<MachineType>(result);
|
|
}
|
|
|
|
// Gets the log2 of the element size in bytes of the machine type.
|
|
inline int ElementSizeLog2Of(MachineType machine_type) {
|
|
switch (RepresentationOf(machine_type)) {
|
|
case kRepBit:
|
|
case kRepWord8:
|
|
return 0;
|
|
case kRepWord16:
|
|
return 1;
|
|
case kRepWord32:
|
|
case kRepFloat32:
|
|
return 2;
|
|
case kRepWord64:
|
|
case kRepFloat64:
|
|
return 3;
|
|
case kRepTagged:
|
|
return kPointerSizeLog2;
|
|
default:
|
|
break;
|
|
}
|
|
UNREACHABLE();
|
|
return -1;
|
|
}
|
|
|
|
// Gets the element size in bytes of the machine type.
|
|
inline int ElementSizeOf(MachineType machine_type) {
|
|
const int shift = ElementSizeLog2Of(machine_type);
|
|
DCHECK_NE(-1, shift);
|
|
return 1 << shift;
|
|
}
|
|
|
|
inline bool IsFloatingPoint(MachineType type) {
|
|
MachineType rep = RepresentationOf(type);
|
|
return rep == kRepFloat32 || rep == kRepFloat64;
|
|
}
|
|
|
|
typedef Signature<MachineType> MachineSignature;
|
|
|
|
} // namespace internal
|
|
} // namespace v8
|
|
|
|
#endif // V8_MACHINE_TYPE_H_
|