machine-type.h revision c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7a
1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_MACHINE_TYPE_H_ 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_MACHINE_TYPE_H_ 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <iosfwd> 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/bits.h" 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/globals.h" 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/signature.h" 13f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone.h" 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class MachineRepresentation : uint8_t { 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNone, 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kBit, 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kWord8, 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kWord16, 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kWord32, 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kWord64, 25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kTaggedSigned, 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kTaggedPointer, 27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kTagged, 28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // FP representations must be last, and in order of increasing size. 29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kFloat32, 30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kFloat64, 31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kSimd128, 32c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kFirstFPRepresentation = kFloat32, 33c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kLastRepresentation = kSimd128 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 36c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstatic_assert(static_cast<int>(MachineRepresentation::kLastRepresentation) < 37c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kIntSize * kBitsPerByte, 38c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "Bit masks of MachineRepresentation should fit in an int"); 39c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst char* MachineReprToString(MachineRepresentation); 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class MachineSemantic : uint8_t { 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNone, 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kBool, 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kInt32, 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kUint32, 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kInt64, 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kUint64, 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNumber, 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kAny 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass MachineType { 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType() 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : representation_(MachineRepresentation::kNone), 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch semantic_(MachineSemantic::kNone) {} 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType(MachineRepresentation representation, MachineSemantic semantic) 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : representation_(representation), semantic_(semantic) {} 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool operator==(MachineType other) const { 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return representation() == other.representation() && 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch semantic() == other.semantic(); 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool operator!=(MachineType other) const { return !(*this == other); } 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation representation() const { return representation_; } 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic semantic() const { return semantic_; } 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 72f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool IsNone() { return representation() == MachineRepresentation::kNone; } 73f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsSigned() { 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return semantic() == MachineSemantic::kInt32 || 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch semantic() == MachineSemantic::kInt64; 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsUnsigned() { 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return semantic() == MachineSemantic::kUint32 || 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch semantic() == MachineSemantic::kUint64; 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineRepresentation PointerRepresentation() { 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (kPointerSize == 4) ? MachineRepresentation::kWord32 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : MachineRepresentation::kWord64; 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Pointer() { 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(PointerRepresentation(), MachineSemantic::kNone); 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType IntPtr() { 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (kPointerSize == 4) ? Int32() : Int64(); 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Float32() { 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kFloat32, 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic::kNumber); 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Float64() { 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kFloat64, 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic::kNumber); 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 101109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static MachineType Simd128() { 102109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return MachineType(MachineRepresentation::kSimd128, MachineSemantic::kNone); 103109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Int8() { 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord8, MachineSemantic::kInt32); 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Uint8() { 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord8, MachineSemantic::kUint32); 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Int16() { 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord16, MachineSemantic::kInt32); 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Uint16() { 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord16, 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic::kUint32); 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Int32() { 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord32, MachineSemantic::kInt32); 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Uint32() { 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord32, 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic::kUint32); 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Int64() { 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord64, MachineSemantic::kInt64); 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Uint64() { 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord64, 129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic::kUint64); 130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 131f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MachineType TaggedPointer() { 132f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return MachineType(MachineRepresentation::kTaggedPointer, 133f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MachineSemantic::kAny); 134f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 135f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MachineType TaggedSigned() { 136f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return MachineType(MachineRepresentation::kTaggedSigned, 137f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MachineSemantic::kInt32); 138f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType AnyTagged() { 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kTagged, MachineSemantic::kAny); 141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Bool() { 143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kBit, MachineSemantic::kBool); 144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType TaggedBool() { 146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kTagged, MachineSemantic::kBool); 147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType None() { 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kNone, MachineSemantic::kNone); 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // These naked representations should eventually go away. 153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepWord8() { 154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord8, MachineSemantic::kNone); 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepWord16() { 157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord16, MachineSemantic::kNone); 158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepWord32() { 160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord32, MachineSemantic::kNone); 161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepWord64() { 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord64, MachineSemantic::kNone); 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepFloat32() { 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kFloat32, MachineSemantic::kNone); 167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepFloat64() { 169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kFloat64, MachineSemantic::kNone); 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 171109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static MachineType RepSimd128() { 172109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return MachineType(MachineRepresentation::kSimd128, MachineSemantic::kNone); 173109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepTagged() { 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kTagged, MachineSemantic::kNone); 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepBit() { 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kBit, MachineSemantic::kNone); 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 181f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MachineType TypeForRepresentation(const MachineRepresentation& rep, 182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool isSigned = true) { 183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch switch (rep) { 184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kNone: 185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::None(); 186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kBit: 187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::Bool(); 188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kWord8: 189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return isSigned ? MachineType::Int8() : MachineType::Uint8(); 190f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kWord16: 191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return isSigned ? MachineType::Int16() : MachineType::Uint16(); 192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kWord32: 193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return isSigned ? MachineType::Int32() : MachineType::Uint32(); 194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kWord64: 195f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return isSigned ? MachineType::Int64() : MachineType::Uint64(); 196f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kFloat32: 197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::Float32(); 198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kFloat64: 199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::Float64(); 200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kSimd128: 201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::Simd128(); 202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kTagged: 203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::AnyTagged(); 204f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch case MachineRepresentation::kTaggedSigned: 205f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return MachineType::TaggedSigned(); 206f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch case MachineRepresentation::kTaggedPointer: 207f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return MachineType::TaggedPointer(); 208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch default: 209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNREACHABLE(); 210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::None(); 211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation representation_; 216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic semantic_; 217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE size_t hash_value(MachineRepresentation rep) { 220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<size_t>(rep); 221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE size_t hash_value(MachineType type) { 224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<size_t>(type.representation()) + 225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static_cast<size_t>(type.semantic()) * 16; 226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 228f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, 229f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MachineRepresentation rep); 230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, MachineSemantic type); 231c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, MachineType type); 232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline bool IsFloatingPoint(MachineRepresentation rep) { 234f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return rep >= MachineRepresentation::kFirstFPRepresentation; 235f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 236f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 237f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochinline bool CanBeTaggedPointer(MachineRepresentation rep) { 238f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return rep == MachineRepresentation::kTagged || 239f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch rep == MachineRepresentation::kTaggedPointer; 240f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 241f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 242c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochinline bool CanBeTaggedSigned(MachineRepresentation rep) { 243c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return rep == MachineRepresentation::kTagged || 244c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch rep == MachineRepresentation::kTaggedSigned; 245c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 246c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 247f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochinline bool IsAnyTagged(MachineRepresentation rep) { 248f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return CanBeTaggedPointer(rep) || rep == MachineRepresentation::kTaggedSigned; 249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Gets the log2 of the element size in bytes of the machine type. 252c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE inline int ElementSizeLog2Of(MachineRepresentation rep) { 253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (rep) { 254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kBit: 255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord8: 256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 0; 257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord16: 258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 1; 259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord32: 260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kFloat32: 261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 2; 262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord64: 263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kFloat64: 264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 3; 265109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case MachineRepresentation::kSimd128: 266109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return 4; 267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kTaggedSigned: 268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kTaggedPointer: 269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kTagged: 270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return kPointerSizeLog2; 271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return -1; 276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtypedef Signature<MachineType> MachineSignature; 279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_MACHINE_TYPE_H_ 284