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 1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochenum class MachineRepresentation { 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, 3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kSimd1x4, // SIMD boolean vector types. 3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kSimd1x8, 3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kSimd1x16, 35c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kFirstFPRepresentation = kFloat32, 3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kLastRepresentation = kSimd1x16 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 39c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstatic_assert(static_cast<int>(MachineRepresentation::kLastRepresentation) < 40c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kIntSize * kBitsPerByte, 41c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "Bit masks of MachineRepresentation should fit in an int"); 42c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst char* MachineReprToString(MachineRepresentation); 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochenum class MachineSemantic { 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNone, 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kBool, 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kInt32, 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kUint32, 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kInt64, 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kUint64, 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNumber, 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kAny 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass MachineType { 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType() 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : representation_(MachineRepresentation::kNone), 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch semantic_(MachineSemantic::kNone) {} 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineType(MachineRepresentation representation, MachineSemantic semantic) 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : representation_(representation), semantic_(semantic) {} 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool operator==(MachineType other) const { 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return representation() == other.representation() && 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch semantic() == other.semantic(); 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool operator!=(MachineType other) const { return !(*this == other); } 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation representation() const { return representation_; } 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic semantic() const { return semantic_; } 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 75f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool IsNone() { return representation() == MachineRepresentation::kNone; } 76f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsSigned() { 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return semantic() == MachineSemantic::kInt32 || 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch semantic() == MachineSemantic::kInt64; 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsUnsigned() { 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return semantic() == MachineSemantic::kUint32 || 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch semantic() == MachineSemantic::kUint64; 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineRepresentation PointerRepresentation() { 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (kPointerSize == 4) ? MachineRepresentation::kWord32 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : MachineRepresentation::kWord64; 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 8962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType UintPtr() { 9062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return (kPointerSize == 4) ? Uint32() : Uint64(); 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType IntPtr() { 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (kPointerSize == 4) ? Int32() : Int64(); 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Int8() { 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord8, MachineSemantic::kInt32); 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Uint8() { 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord8, MachineSemantic::kUint32); 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Int16() { 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord16, MachineSemantic::kInt32); 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Uint16() { 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord16, 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic::kUint32); 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Int32() { 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord32, MachineSemantic::kInt32); 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Uint32() { 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord32, 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic::kUint32); 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Int64() { 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord64, MachineSemantic::kInt64); 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Uint64() { 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord64, 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic::kUint64); 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 12262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType Float32() { 12362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType(MachineRepresentation::kFloat32, 12462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MachineSemantic::kNumber); 12562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 12662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType Float64() { 12762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType(MachineRepresentation::kFloat64, 12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MachineSemantic::kNumber); 12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType Simd128() { 13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType(MachineRepresentation::kSimd128, MachineSemantic::kNone); 13262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 13362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType Simd1x4() { 13462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType(MachineRepresentation::kSimd1x4, MachineSemantic::kNone); 13562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 13662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType Simd1x8() { 13762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType(MachineRepresentation::kSimd1x8, MachineSemantic::kNone); 13862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 13962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType Simd1x16() { 14062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType(MachineRepresentation::kSimd1x16, 14162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MachineSemantic::kNone); 14262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 14362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType Pointer() { 14462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType(PointerRepresentation(), MachineSemantic::kNone); 14562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 146f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MachineType TaggedPointer() { 147f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return MachineType(MachineRepresentation::kTaggedPointer, 148f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MachineSemantic::kAny); 149f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 150f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MachineType TaggedSigned() { 151f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return MachineType(MachineRepresentation::kTaggedSigned, 152f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MachineSemantic::kInt32); 153f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType AnyTagged() { 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kTagged, MachineSemantic::kAny); 156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType Bool() { 158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kBit, MachineSemantic::kBool); 159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType TaggedBool() { 161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kTagged, MachineSemantic::kBool); 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType None() { 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kNone, MachineSemantic::kNone); 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // These naked representations should eventually go away. 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepWord8() { 169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord8, MachineSemantic::kNone); 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepWord16() { 172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord16, MachineSemantic::kNone); 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepWord32() { 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord32, MachineSemantic::kNone); 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepWord64() { 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kWord64, MachineSemantic::kNone); 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepFloat32() { 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kFloat32, MachineSemantic::kNone); 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepFloat64() { 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kFloat64, MachineSemantic::kNone); 185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 186109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static MachineType RepSimd128() { 187109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return MachineType(MachineRepresentation::kSimd128, MachineSemantic::kNone); 188109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 18962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType RepSimd1x4() { 19062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType(MachineRepresentation::kSimd1x4, MachineSemantic::kNone); 19162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 19262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType RepSimd1x8() { 19362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType(MachineRepresentation::kSimd1x8, MachineSemantic::kNone); 19462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 19562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static MachineType RepSimd1x16() { 19662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType(MachineRepresentation::kSimd1x16, 19762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MachineSemantic::kNone); 19862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepTagged() { 200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kTagged, MachineSemantic::kNone); 201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MachineType RepBit() { 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MachineType(MachineRepresentation::kBit, MachineSemantic::kNone); 204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 206f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MachineType TypeForRepresentation(const MachineRepresentation& rep, 207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool isSigned = true) { 208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch switch (rep) { 209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kNone: 210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::None(); 211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kBit: 212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::Bool(); 213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kWord8: 214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return isSigned ? MachineType::Int8() : MachineType::Uint8(); 215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kWord16: 216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return isSigned ? MachineType::Int16() : MachineType::Uint16(); 217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kWord32: 218f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return isSigned ? MachineType::Int32() : MachineType::Uint32(); 219f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kWord64: 220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return isSigned ? MachineType::Int64() : MachineType::Uint64(); 221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kFloat32: 222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::Float32(); 223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kFloat64: 224f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::Float64(); 225f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kSimd128: 226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::Simd128(); 22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case MachineRepresentation::kSimd1x4: 22862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType::Simd1x4(); 22962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case MachineRepresentation::kSimd1x8: 23062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType::Simd1x8(); 23162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case MachineRepresentation::kSimd1x16: 23262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return MachineType::Simd1x16(); 233f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kTagged: 234f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::AnyTagged(); 235f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch case MachineRepresentation::kTaggedSigned: 236f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return MachineType::TaggedSigned(); 237f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch case MachineRepresentation::kTaggedPointer: 238f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return MachineType::TaggedPointer(); 239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch default: 240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNREACHABLE(); 241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return MachineType::None(); 242f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 243f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 244f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation representation_; 247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineSemantic semantic_; 248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE size_t hash_value(MachineRepresentation rep) { 251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<size_t>(rep); 252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE size_t hash_value(MachineType type) { 255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return static_cast<size_t>(type.representation()) + 256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static_cast<size_t>(type.semantic()) * 16; 257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 259f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, 260f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MachineRepresentation rep); 261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, MachineSemantic type); 262c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, MachineType type); 263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline bool IsFloatingPoint(MachineRepresentation rep) { 265f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return rep >= MachineRepresentation::kFirstFPRepresentation; 266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 267f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 268f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochinline bool CanBeTaggedPointer(MachineRepresentation rep) { 269f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return rep == MachineRepresentation::kTagged || 270f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch rep == MachineRepresentation::kTaggedPointer; 271f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 272f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 273c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochinline bool CanBeTaggedSigned(MachineRepresentation rep) { 274c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return rep == MachineRepresentation::kTagged || 275c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch rep == MachineRepresentation::kTaggedSigned; 276c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 277c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 278f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochinline bool IsAnyTagged(MachineRepresentation rep) { 279f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return CanBeTaggedPointer(rep) || rep == MachineRepresentation::kTaggedSigned; 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Gets the log2 of the element size in bytes of the machine type. 283c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE inline int ElementSizeLog2Of(MachineRepresentation rep) { 284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (rep) { 285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kBit: 286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord8: 287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 0; 288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord16: 289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 1; 290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord32: 291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kFloat32: 292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 2; 293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord64: 294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kFloat64: 295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 3; 296109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch case MachineRepresentation::kSimd128: 297109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return 4; 298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kTaggedSigned: 299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case MachineRepresentation::kTaggedPointer: 300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kTagged: 301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return kPointerSizeLog2; 302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return -1; 307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtypedef Signature<MachineType> MachineSignature; 310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_MACHINE_TYPE_H_ 315