// Copyright 2013 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_COMPILER_OPCODES_H_
|
#define V8_COMPILER_OPCODES_H_
|
|
#include <iosfwd>
|
|
#include "src/globals.h"
|
|
// Opcodes for control operators.
|
#define CONTROL_OP_LIST(V) \
|
V(Start) \
|
V(Loop) \
|
V(Branch) \
|
V(Switch) \
|
V(IfTrue) \
|
V(IfFalse) \
|
V(IfSuccess) \
|
V(IfException) \
|
V(IfValue) \
|
V(IfDefault) \
|
V(Merge) \
|
V(Deoptimize) \
|
V(DeoptimizeIf) \
|
V(DeoptimizeUnless) \
|
V(TrapIf) \
|
V(TrapUnless) \
|
V(Return) \
|
V(TailCall) \
|
V(Terminate) \
|
V(OsrNormalEntry) \
|
V(OsrLoopEntry) \
|
V(Throw) \
|
V(End)
|
|
// Opcodes for constant operators.
|
#define CONSTANT_OP_LIST(V) \
|
V(Int32Constant) \
|
V(Int64Constant) \
|
V(Float32Constant) \
|
V(Float64Constant) \
|
V(ExternalConstant) \
|
V(NumberConstant) \
|
V(PointerConstant) \
|
V(HeapConstant) \
|
V(RelocatableInt32Constant) \
|
V(RelocatableInt64Constant)
|
|
#define INNER_OP_LIST(V) \
|
V(Select) \
|
V(Phi) \
|
V(EffectPhi) \
|
V(InductionVariablePhi) \
|
V(Checkpoint) \
|
V(BeginRegion) \
|
V(FinishRegion) \
|
V(FrameState) \
|
V(StateValues) \
|
V(TypedStateValues) \
|
V(ArgumentsElementsState) \
|
V(ArgumentsLengthState) \
|
V(ObjectState) \
|
V(ObjectId) \
|
V(TypedObjectState) \
|
V(Call) \
|
V(CallWithCallerSavedRegisters) \
|
V(Parameter) \
|
V(OsrValue) \
|
V(LoopExit) \
|
V(LoopExitValue) \
|
V(LoopExitEffect) \
|
V(Projection) \
|
V(Retain) \
|
V(MapGuard) \
|
V(TypeGuard)
|
|
#define COMMON_OP_LIST(V) \
|
CONSTANT_OP_LIST(V) \
|
INNER_OP_LIST(V) \
|
V(Unreachable) \
|
V(DeadValue) \
|
V(Dead)
|
|
// Opcodes for JavaScript operators.
|
#define JS_COMPARE_BINOP_LIST(V) \
|
V(JSEqual) \
|
V(JSStrictEqual) \
|
V(JSLessThan) \
|
V(JSGreaterThan) \
|
V(JSLessThanOrEqual) \
|
V(JSGreaterThanOrEqual)
|
|
#define JS_BITWISE_BINOP_LIST(V) \
|
V(JSBitwiseOr) \
|
V(JSBitwiseXor) \
|
V(JSBitwiseAnd) \
|
V(JSShiftLeft) \
|
V(JSShiftRight) \
|
V(JSShiftRightLogical)
|
|
#define JS_ARITH_BINOP_LIST(V) \
|
V(JSAdd) \
|
V(JSSubtract) \
|
V(JSMultiply) \
|
V(JSDivide) \
|
V(JSModulus) \
|
V(JSExponentiate)
|
|
#define JS_SIMPLE_BINOP_LIST(V) \
|
JS_COMPARE_BINOP_LIST(V) \
|
JS_BITWISE_BINOP_LIST(V) \
|
JS_ARITH_BINOP_LIST(V) \
|
V(JSHasInPrototypeChain) \
|
V(JSInstanceOf) \
|
V(JSOrdinaryHasInstance)
|
|
#define JS_CONVERSION_UNOP_LIST(V) \
|
V(JSToInteger) \
|
V(JSToLength) \
|
V(JSToName) \
|
V(JSToNumber) \
|
V(JSToNumberConvertBigInt) \
|
V(JSToNumeric) \
|
V(JSToObject) \
|
V(JSToString) \
|
V(JSParseInt)
|
|
#define JS_SIMPLE_UNOP_LIST(V) \
|
JS_CONVERSION_UNOP_LIST(V) \
|
V(JSBitwiseNot) \
|
V(JSDecrement) \
|
V(JSIncrement) \
|
V(JSNegate)
|
|
#define JS_CREATE_OP_LIST(V) \
|
V(JSCreate) \
|
V(JSCreateArguments) \
|
V(JSCreateArray) \
|
V(JSCreateArrayIterator) \
|
V(JSCreateBoundFunction) \
|
V(JSCreateClosure) \
|
V(JSCreateCollectionIterator) \
|
V(JSCreateGeneratorObject) \
|
V(JSCreateIterResultObject) \
|
V(JSCreateStringIterator) \
|
V(JSCreateKeyValueArray) \
|
V(JSCreateObject) \
|
V(JSCreatePromise) \
|
V(JSCreateTypedArray) \
|
V(JSCreateLiteralArray) \
|
V(JSCreateEmptyLiteralArray) \
|
V(JSCreateLiteralObject) \
|
V(JSCreateEmptyLiteralObject) \
|
V(JSCloneObject) \
|
V(JSCreateLiteralRegExp)
|
|
#define JS_OBJECT_OP_LIST(V) \
|
JS_CREATE_OP_LIST(V) \
|
V(JSLoadProperty) \
|
V(JSLoadNamed) \
|
V(JSLoadGlobal) \
|
V(JSStoreProperty) \
|
V(JSStoreNamed) \
|
V(JSStoreNamedOwn) \
|
V(JSStoreGlobal) \
|
V(JSStoreDataPropertyInLiteral) \
|
V(JSStoreInArrayLiteral) \
|
V(JSDeleteProperty) \
|
V(JSHasProperty) \
|
V(JSGetSuperConstructor)
|
|
#define JS_CONTEXT_OP_LIST(V) \
|
V(JSLoadContext) \
|
V(JSStoreContext) \
|
V(JSCreateFunctionContext) \
|
V(JSCreateCatchContext) \
|
V(JSCreateWithContext) \
|
V(JSCreateBlockContext)
|
|
#define JS_CONSTRUCT_OP_LIST(V) \
|
V(JSConstructForwardVarargs) \
|
V(JSConstruct) \
|
V(JSConstructWithArrayLike) \
|
V(JSConstructWithSpread)
|
|
#define JS_OTHER_OP_LIST(V) \
|
JS_CONSTRUCT_OP_LIST(V) \
|
V(JSCallForwardVarargs) \
|
V(JSCall) \
|
V(JSCallWithArrayLike) \
|
V(JSCallWithSpread) \
|
V(JSCallRuntime) \
|
V(JSForInEnumerate) \
|
V(JSForInNext) \
|
V(JSForInPrepare) \
|
V(JSLoadMessage) \
|
V(JSStoreMessage) \
|
V(JSLoadModule) \
|
V(JSStoreModule) \
|
V(JSGeneratorStore) \
|
V(JSGeneratorRestoreContinuation) \
|
V(JSGeneratorRestoreContext) \
|
V(JSGeneratorRestoreRegister) \
|
V(JSGeneratorRestoreInputOrDebugPos) \
|
V(JSFulfillPromise) \
|
V(JSPerformPromiseThen) \
|
V(JSPromiseResolve) \
|
V(JSRejectPromise) \
|
V(JSResolvePromise) \
|
V(JSStackCheck) \
|
V(JSObjectIsArray) \
|
V(JSRegExpTest) \
|
V(JSDebugger)
|
|
#define JS_OP_LIST(V) \
|
JS_SIMPLE_BINOP_LIST(V) \
|
JS_SIMPLE_UNOP_LIST(V) \
|
JS_OBJECT_OP_LIST(V) \
|
JS_CONTEXT_OP_LIST(V) \
|
JS_OTHER_OP_LIST(V)
|
|
// Opcodes for VirtuaMachine-level operators.
|
#define SIMPLIFIED_CHANGE_OP_LIST(V) \
|
V(ChangeTaggedSignedToInt32) \
|
V(ChangeTaggedToInt32) \
|
V(ChangeTaggedToUint32) \
|
V(ChangeTaggedToFloat64) \
|
V(ChangeTaggedToTaggedSigned) \
|
V(ChangeInt31ToTaggedSigned) \
|
V(ChangeInt32ToTagged) \
|
V(ChangeUint32ToTagged) \
|
V(ChangeFloat64ToTagged) \
|
V(ChangeFloat64ToTaggedPointer) \
|
V(ChangeTaggedToBit) \
|
V(ChangeBitToTagged) \
|
V(TruncateTaggedToWord32) \
|
V(TruncateTaggedToFloat64) \
|
V(TruncateTaggedToBit) \
|
V(TruncateTaggedPointerToBit)
|
|
#define SIMPLIFIED_CHECKED_OP_LIST(V) \
|
V(CheckedInt32Add) \
|
V(CheckedInt32Sub) \
|
V(CheckedInt32Div) \
|
V(CheckedInt32Mod) \
|
V(CheckedUint32Div) \
|
V(CheckedUint32Mod) \
|
V(CheckedInt32Mul) \
|
V(CheckedInt32ToTaggedSigned) \
|
V(CheckedUint32ToInt32) \
|
V(CheckedUint32ToTaggedSigned) \
|
V(CheckedFloat64ToInt32) \
|
V(CheckedTaggedSignedToInt32) \
|
V(CheckedTaggedToInt32) \
|
V(CheckedTruncateTaggedToWord32) \
|
V(CheckedTaggedToFloat64) \
|
V(CheckedTaggedToTaggedSigned) \
|
V(CheckedTaggedToTaggedPointer)
|
|
#define SIMPLIFIED_COMPARE_BINOP_LIST(V) \
|
V(NumberEqual) \
|
V(NumberLessThan) \
|
V(NumberLessThanOrEqual) \
|
V(SpeculativeNumberEqual) \
|
V(SpeculativeNumberLessThan) \
|
V(SpeculativeNumberLessThanOrEqual) \
|
V(ReferenceEqual) \
|
V(SameValue) \
|
V(StringEqual) \
|
V(StringLessThan) \
|
V(StringLessThanOrEqual)
|
|
#define SIMPLIFIED_NUMBER_BINOP_LIST(V) \
|
V(NumberAdd) \
|
V(NumberSubtract) \
|
V(NumberMultiply) \
|
V(NumberDivide) \
|
V(NumberModulus) \
|
V(NumberBitwiseOr) \
|
V(NumberBitwiseXor) \
|
V(NumberBitwiseAnd) \
|
V(NumberShiftLeft) \
|
V(NumberShiftRight) \
|
V(NumberShiftRightLogical) \
|
V(NumberAtan2) \
|
V(NumberImul) \
|
V(NumberMax) \
|
V(NumberMin) \
|
V(NumberPow)
|
|
#define SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \
|
V(SpeculativeNumberAdd) \
|
V(SpeculativeNumberSubtract) \
|
V(SpeculativeNumberMultiply) \
|
V(SpeculativeNumberDivide) \
|
V(SpeculativeNumberModulus) \
|
V(SpeculativeNumberBitwiseAnd) \
|
V(SpeculativeNumberBitwiseOr) \
|
V(SpeculativeNumberBitwiseXor) \
|
V(SpeculativeNumberShiftLeft) \
|
V(SpeculativeNumberShiftRight) \
|
V(SpeculativeNumberShiftRightLogical) \
|
V(SpeculativeSafeIntegerAdd) \
|
V(SpeculativeSafeIntegerSubtract)
|
|
#define SIMPLIFIED_NUMBER_UNOP_LIST(V) \
|
V(NumberAbs) \
|
V(NumberAcos) \
|
V(NumberAcosh) \
|
V(NumberAsin) \
|
V(NumberAsinh) \
|
V(NumberAtan) \
|
V(NumberAtanh) \
|
V(NumberCbrt) \
|
V(NumberCeil) \
|
V(NumberClz32) \
|
V(NumberCos) \
|
V(NumberCosh) \
|
V(NumberExp) \
|
V(NumberExpm1) \
|
V(NumberFloor) \
|
V(NumberFround) \
|
V(NumberLog) \
|
V(NumberLog1p) \
|
V(NumberLog2) \
|
V(NumberLog10) \
|
V(NumberRound) \
|
V(NumberSign) \
|
V(NumberSin) \
|
V(NumberSinh) \
|
V(NumberSqrt) \
|
V(NumberTan) \
|
V(NumberTanh) \
|
V(NumberTrunc) \
|
V(NumberToBoolean) \
|
V(NumberToInt32) \
|
V(NumberToString) \
|
V(NumberToUint32) \
|
V(NumberToUint8Clamped) \
|
V(NumberSilenceNaN)
|
|
#define SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(V) V(SpeculativeToNumber)
|
|
#define SIMPLIFIED_OTHER_OP_LIST(V) \
|
V(PlainPrimitiveToNumber) \
|
V(PlainPrimitiveToWord32) \
|
V(PlainPrimitiveToFloat64) \
|
V(BooleanNot) \
|
V(StringToNumber) \
|
V(StringCharCodeAt) \
|
V(StringCodePointAt) \
|
V(StringFromSingleCharCode) \
|
V(StringFromSingleCodePoint) \
|
V(StringIndexOf) \
|
V(StringLength) \
|
V(StringToLowerCaseIntl) \
|
V(StringToUpperCaseIntl) \
|
V(StringSubstring) \
|
V(CheckBounds) \
|
V(CheckIf) \
|
V(CheckMaps) \
|
V(CheckNumber) \
|
V(CheckInternalizedString) \
|
V(CheckReceiver) \
|
V(CheckString) \
|
V(CheckSymbol) \
|
V(CheckSmi) \
|
V(CheckHeapObject) \
|
V(CheckFloat64Hole) \
|
V(CheckNotTaggedHole) \
|
V(CheckEqualsInternalizedString) \
|
V(CheckEqualsSymbol) \
|
V(CompareMaps) \
|
V(ConvertReceiver) \
|
V(ConvertTaggedHoleToUndefined) \
|
V(TypeOf) \
|
V(Allocate) \
|
V(AllocateRaw) \
|
V(LoadFieldByIndex) \
|
V(LoadField) \
|
V(LoadElement) \
|
V(LoadTypedElement) \
|
V(LoadDataViewElement) \
|
V(StoreField) \
|
V(StoreElement) \
|
V(StoreTypedElement) \
|
V(StoreDataViewElement) \
|
V(StoreSignedSmallElement) \
|
V(TransitionAndStoreElement) \
|
V(TransitionAndStoreNumberElement) \
|
V(TransitionAndStoreNonNumberElement) \
|
V(ToBoolean) \
|
V(NumberIsFloat64Hole) \
|
V(NumberIsFinite) \
|
V(ObjectIsFiniteNumber) \
|
V(NumberIsInteger) \
|
V(ObjectIsSafeInteger) \
|
V(NumberIsSafeInteger) \
|
V(ObjectIsInteger) \
|
V(ObjectIsArrayBufferView) \
|
V(ObjectIsBigInt) \
|
V(ObjectIsCallable) \
|
V(ObjectIsConstructor) \
|
V(ObjectIsDetectableCallable) \
|
V(ObjectIsMinusZero) \
|
V(ObjectIsNaN) \
|
V(NumberIsNaN) \
|
V(ObjectIsNonCallable) \
|
V(ObjectIsNumber) \
|
V(ObjectIsReceiver) \
|
V(ObjectIsSmi) \
|
V(ObjectIsString) \
|
V(ObjectIsSymbol) \
|
V(ObjectIsUndetectable) \
|
V(ArgumentsFrame) \
|
V(ArgumentsLength) \
|
V(NewDoubleElements) \
|
V(NewSmiOrObjectElements) \
|
V(NewArgumentsElements) \
|
V(NewConsString) \
|
V(ArrayBufferWasNeutered) \
|
V(EnsureWritableFastElements) \
|
V(MaybeGrowFastElements) \
|
V(TransitionElementsKind) \
|
V(FindOrderedHashMapEntry) \
|
V(FindOrderedHashMapEntryForInt32Key) \
|
V(PoisonIndex) \
|
V(RuntimeAbort) \
|
V(DateNow)
|
|
#define SIMPLIFIED_OP_LIST(V) \
|
SIMPLIFIED_CHANGE_OP_LIST(V) \
|
SIMPLIFIED_CHECKED_OP_LIST(V) \
|
SIMPLIFIED_COMPARE_BINOP_LIST(V) \
|
SIMPLIFIED_NUMBER_BINOP_LIST(V) \
|
SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \
|
SIMPLIFIED_NUMBER_UNOP_LIST(V) \
|
SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(V) \
|
SIMPLIFIED_OTHER_OP_LIST(V)
|
|
// Opcodes for Machine-level operators.
|
#define MACHINE_COMPARE_BINOP_LIST(V) \
|
V(Word32Equal) \
|
V(Word64Equal) \
|
V(Int32LessThan) \
|
V(Int32LessThanOrEqual) \
|
V(Uint32LessThan) \
|
V(Uint32LessThanOrEqual) \
|
V(Int64LessThan) \
|
V(Int64LessThanOrEqual) \
|
V(Uint64LessThan) \
|
V(Uint64LessThanOrEqual) \
|
V(Float32Equal) \
|
V(Float32LessThan) \
|
V(Float32LessThanOrEqual) \
|
V(Float64Equal) \
|
V(Float64LessThan) \
|
V(Float64LessThanOrEqual)
|
|
#define MACHINE_UNOP_32_LIST(V) \
|
V(Word32Clz) \
|
V(Word32Ctz) \
|
V(Int32AbsWithOverflow) \
|
V(Word32ReverseBits) \
|
V(Word32ReverseBytes)
|
|
#define MACHINE_BINOP_32_LIST(V) \
|
V(Word32And) \
|
V(Word32Or) \
|
V(Word32Xor) \
|
V(Word32Shl) \
|
V(Word32Shr) \
|
V(Word32Sar) \
|
V(Word32Ror) \
|
V(Int32Add) \
|
V(Int32AddWithOverflow) \
|
V(Int32Sub) \
|
V(Int32SubWithOverflow) \
|
V(Int32Mul) \
|
V(Int32MulWithOverflow) \
|
V(Int32MulHigh) \
|
V(Int32Div) \
|
V(Int32Mod) \
|
V(Uint32Div) \
|
V(Uint32Mod) \
|
V(Uint32MulHigh)
|
|
#define MACHINE_BINOP_64_LIST(V) \
|
V(Word64And) \
|
V(Word64Or) \
|
V(Word64Xor) \
|
V(Word64Shl) \
|
V(Word64Shr) \
|
V(Word64Sar) \
|
V(Word64Ror) \
|
V(Int64Add) \
|
V(Int64AddWithOverflow) \
|
V(Int64Sub) \
|
V(Int64SubWithOverflow) \
|
V(Int64Mul) \
|
V(Int64Div) \
|
V(Int64Mod) \
|
V(Uint64Div) \
|
V(Uint64Mod)
|
|
#define MACHINE_FLOAT32_UNOP_LIST(V) \
|
V(Float32Abs) \
|
V(Float32Neg) \
|
V(Float32RoundDown) \
|
V(Float32RoundTiesEven) \
|
V(Float32RoundTruncate) \
|
V(Float32RoundUp) \
|
V(Float32Sqrt)
|
|
#define MACHINE_FLOAT32_BINOP_LIST(V) \
|
V(Float32Add) \
|
V(Float32Sub) \
|
V(Float32Mul) \
|
V(Float32Div) \
|
V(Float32Max) \
|
V(Float32Min)
|
|
#define MACHINE_FLOAT64_UNOP_LIST(V) \
|
V(Float64Abs) \
|
V(Float64Acos) \
|
V(Float64Acosh) \
|
V(Float64Asin) \
|
V(Float64Asinh) \
|
V(Float64Atan) \
|
V(Float64Atanh) \
|
V(Float64Cbrt) \
|
V(Float64Cos) \
|
V(Float64Cosh) \
|
V(Float64Exp) \
|
V(Float64Expm1) \
|
V(Float64Log) \
|
V(Float64Log1p) \
|
V(Float64Log10) \
|
V(Float64Log2) \
|
V(Float64Neg) \
|
V(Float64RoundDown) \
|
V(Float64RoundTiesAway) \
|
V(Float64RoundTiesEven) \
|
V(Float64RoundTruncate) \
|
V(Float64RoundUp) \
|
V(Float64Sin) \
|
V(Float64Sinh) \
|
V(Float64Sqrt) \
|
V(Float64Tan) \
|
V(Float64Tanh)
|
|
#define MACHINE_FLOAT64_BINOP_LIST(V) \
|
V(Float64Atan2) \
|
V(Float64Max) \
|
V(Float64Min) \
|
V(Float64Add) \
|
V(Float64Sub) \
|
V(Float64Mul) \
|
V(Float64Div) \
|
V(Float64Mod) \
|
V(Float64Pow)
|
|
#define MACHINE_WORD64_ATOMIC_OP_LIST(V) \
|
V(Word64AtomicLoad) \
|
V(Word64AtomicStore) \
|
V(Word64AtomicAdd) \
|
V(Word64AtomicSub) \
|
V(Word64AtomicAnd) \
|
V(Word64AtomicOr) \
|
V(Word64AtomicXor) \
|
V(Word64AtomicExchange) \
|
V(Word64AtomicCompareExchange) \
|
V(Word64AtomicNarrowAdd) \
|
V(Word64AtomicNarrowSub) \
|
V(Word64AtomicNarrowAnd) \
|
V(Word64AtomicNarrowOr) \
|
V(Word64AtomicNarrowXor) \
|
V(Word64AtomicNarrowExchange) \
|
V(Word64AtomicNarrowCompareExchange)
|
|
#define MACHINE_OP_LIST(V) \
|
MACHINE_UNOP_32_LIST(V) \
|
MACHINE_BINOP_32_LIST(V) \
|
MACHINE_BINOP_64_LIST(V) \
|
MACHINE_COMPARE_BINOP_LIST(V) \
|
MACHINE_FLOAT32_BINOP_LIST(V) \
|
MACHINE_FLOAT32_UNOP_LIST(V) \
|
MACHINE_FLOAT64_BINOP_LIST(V) \
|
MACHINE_FLOAT64_UNOP_LIST(V) \
|
MACHINE_WORD64_ATOMIC_OP_LIST(V) \
|
V(DebugAbort) \
|
V(DebugBreak) \
|
V(Comment) \
|
V(Load) \
|
V(PoisonedLoad) \
|
V(Store) \
|
V(StackSlot) \
|
V(Word32Popcnt) \
|
V(Word64Popcnt) \
|
V(Word64Clz) \
|
V(Word64Ctz) \
|
V(Word64ReverseBits) \
|
V(Word64ReverseBytes) \
|
V(Int64AbsWithOverflow) \
|
V(BitcastTaggedToWord) \
|
V(BitcastWordToTagged) \
|
V(BitcastWordToTaggedSigned) \
|
V(TruncateFloat64ToWord32) \
|
V(ChangeFloat32ToFloat64) \
|
V(ChangeFloat64ToInt32) \
|
V(ChangeFloat64ToUint32) \
|
V(ChangeFloat64ToUint64) \
|
V(Float64SilenceNaN) \
|
V(TruncateFloat64ToUint32) \
|
V(TruncateFloat32ToInt32) \
|
V(TruncateFloat32ToUint32) \
|
V(TryTruncateFloat32ToInt64) \
|
V(TryTruncateFloat64ToInt64) \
|
V(TryTruncateFloat32ToUint64) \
|
V(TryTruncateFloat64ToUint64) \
|
V(ChangeInt32ToFloat64) \
|
V(ChangeInt32ToInt64) \
|
V(ChangeUint32ToFloat64) \
|
V(ChangeUint32ToUint64) \
|
V(TruncateFloat64ToFloat32) \
|
V(TruncateInt64ToInt32) \
|
V(RoundFloat64ToInt32) \
|
V(RoundInt32ToFloat32) \
|
V(RoundInt64ToFloat32) \
|
V(RoundInt64ToFloat64) \
|
V(RoundUint32ToFloat32) \
|
V(RoundUint64ToFloat32) \
|
V(RoundUint64ToFloat64) \
|
V(BitcastFloat32ToInt32) \
|
V(BitcastFloat64ToInt64) \
|
V(BitcastInt32ToFloat32) \
|
V(BitcastInt64ToFloat64) \
|
V(Float64ExtractLowWord32) \
|
V(Float64ExtractHighWord32) \
|
V(Float64InsertLowWord32) \
|
V(Float64InsertHighWord32) \
|
V(TaggedPoisonOnSpeculation) \
|
V(Word32PoisonOnSpeculation) \
|
V(Word64PoisonOnSpeculation) \
|
V(LoadStackPointer) \
|
V(LoadFramePointer) \
|
V(LoadParentFramePointer) \
|
V(UnalignedLoad) \
|
V(UnalignedStore) \
|
V(Int32PairAdd) \
|
V(Int32PairSub) \
|
V(Int32PairMul) \
|
V(Word32PairShl) \
|
V(Word32PairShr) \
|
V(Word32PairSar) \
|
V(ProtectedLoad) \
|
V(ProtectedStore) \
|
V(Word32AtomicLoad) \
|
V(Word32AtomicStore) \
|
V(Word32AtomicExchange) \
|
V(Word32AtomicCompareExchange) \
|
V(Word32AtomicAdd) \
|
V(Word32AtomicSub) \
|
V(Word32AtomicAnd) \
|
V(Word32AtomicOr) \
|
V(Word32AtomicXor) \
|
V(Word32AtomicPairLoad) \
|
V(Word32AtomicPairStore) \
|
V(Word32AtomicPairAdd) \
|
V(Word32AtomicPairSub) \
|
V(Word32AtomicPairAnd) \
|
V(Word32AtomicPairOr) \
|
V(Word32AtomicPairXor) \
|
V(Word32AtomicPairExchange) \
|
V(Word32AtomicPairCompareExchange) \
|
V(SpeculationFence) \
|
V(SignExtendWord8ToInt32) \
|
V(SignExtendWord16ToInt32) \
|
V(SignExtendWord8ToInt64) \
|
V(SignExtendWord16ToInt64) \
|
V(SignExtendWord32ToInt64) \
|
V(UnsafePointerAdd)
|
|
#define MACHINE_SIMD_OP_LIST(V) \
|
V(F32x4Splat) \
|
V(F32x4ExtractLane) \
|
V(F32x4ReplaceLane) \
|
V(F32x4SConvertI32x4) \
|
V(F32x4UConvertI32x4) \
|
V(F32x4Abs) \
|
V(F32x4Neg) \
|
V(F32x4RecipApprox) \
|
V(F32x4RecipSqrtApprox) \
|
V(F32x4Add) \
|
V(F32x4AddHoriz) \
|
V(F32x4Sub) \
|
V(F32x4Mul) \
|
V(F32x4Min) \
|
V(F32x4Max) \
|
V(F32x4Eq) \
|
V(F32x4Ne) \
|
V(F32x4Lt) \
|
V(F32x4Le) \
|
V(F32x4Gt) \
|
V(F32x4Ge) \
|
V(I32x4Splat) \
|
V(I32x4ExtractLane) \
|
V(I32x4ReplaceLane) \
|
V(I32x4SConvertF32x4) \
|
V(I32x4SConvertI16x8Low) \
|
V(I32x4SConvertI16x8High) \
|
V(I32x4Neg) \
|
V(I32x4Shl) \
|
V(I32x4ShrS) \
|
V(I32x4Add) \
|
V(I32x4AddHoriz) \
|
V(I32x4Sub) \
|
V(I32x4Mul) \
|
V(I32x4MinS) \
|
V(I32x4MaxS) \
|
V(I32x4Eq) \
|
V(I32x4Ne) \
|
V(I32x4LtS) \
|
V(I32x4LeS) \
|
V(I32x4GtS) \
|
V(I32x4GeS) \
|
V(I32x4UConvertF32x4) \
|
V(I32x4UConvertI16x8Low) \
|
V(I32x4UConvertI16x8High) \
|
V(I32x4ShrU) \
|
V(I32x4MinU) \
|
V(I32x4MaxU) \
|
V(I32x4LtU) \
|
V(I32x4LeU) \
|
V(I32x4GtU) \
|
V(I32x4GeU) \
|
V(I16x8Splat) \
|
V(I16x8ExtractLane) \
|
V(I16x8ReplaceLane) \
|
V(I16x8SConvertI8x16Low) \
|
V(I16x8SConvertI8x16High) \
|
V(I16x8Neg) \
|
V(I16x8Shl) \
|
V(I16x8ShrS) \
|
V(I16x8SConvertI32x4) \
|
V(I16x8Add) \
|
V(I16x8AddSaturateS) \
|
V(I16x8AddHoriz) \
|
V(I16x8Sub) \
|
V(I16x8SubSaturateS) \
|
V(I16x8Mul) \
|
V(I16x8MinS) \
|
V(I16x8MaxS) \
|
V(I16x8Eq) \
|
V(I16x8Ne) \
|
V(I16x8LtS) \
|
V(I16x8LeS) \
|
V(I16x8GtS) \
|
V(I16x8GeS) \
|
V(I16x8UConvertI8x16Low) \
|
V(I16x8UConvertI8x16High) \
|
V(I16x8ShrU) \
|
V(I16x8UConvertI32x4) \
|
V(I16x8AddSaturateU) \
|
V(I16x8SubSaturateU) \
|
V(I16x8MinU) \
|
V(I16x8MaxU) \
|
V(I16x8LtU) \
|
V(I16x8LeU) \
|
V(I16x8GtU) \
|
V(I16x8GeU) \
|
V(I8x16Splat) \
|
V(I8x16ExtractLane) \
|
V(I8x16ReplaceLane) \
|
V(I8x16SConvertI16x8) \
|
V(I8x16Neg) \
|
V(I8x16Shl) \
|
V(I8x16ShrS) \
|
V(I8x16Add) \
|
V(I8x16AddSaturateS) \
|
V(I8x16Sub) \
|
V(I8x16SubSaturateS) \
|
V(I8x16Mul) \
|
V(I8x16MinS) \
|
V(I8x16MaxS) \
|
V(I8x16Eq) \
|
V(I8x16Ne) \
|
V(I8x16LtS) \
|
V(I8x16LeS) \
|
V(I8x16GtS) \
|
V(I8x16GeS) \
|
V(I8x16UConvertI16x8) \
|
V(I8x16AddSaturateU) \
|
V(I8x16SubSaturateU) \
|
V(I8x16ShrU) \
|
V(I8x16MinU) \
|
V(I8x16MaxU) \
|
V(I8x16LtU) \
|
V(I8x16LeU) \
|
V(I8x16GtU) \
|
V(I8x16GeU) \
|
V(S128Load) \
|
V(S128Store) \
|
V(S128Zero) \
|
V(S128Not) \
|
V(S128And) \
|
V(S128Or) \
|
V(S128Xor) \
|
V(S128Select) \
|
V(S8x16Shuffle) \
|
V(S1x4AnyTrue) \
|
V(S1x4AllTrue) \
|
V(S1x8AnyTrue) \
|
V(S1x8AllTrue) \
|
V(S1x16AnyTrue) \
|
V(S1x16AllTrue)
|
|
#define VALUE_OP_LIST(V) \
|
COMMON_OP_LIST(V) \
|
SIMPLIFIED_OP_LIST(V) \
|
MACHINE_OP_LIST(V) \
|
MACHINE_SIMD_OP_LIST(V) \
|
JS_OP_LIST(V)
|
|
// The combination of all operators at all levels and the common operators.
|
#define ALL_OP_LIST(V) \
|
CONTROL_OP_LIST(V) \
|
VALUE_OP_LIST(V)
|
|
namespace v8 {
|
namespace internal {
|
namespace compiler {
|
|
// Declare an enumeration with all the opcodes at all levels so that they
|
// can be globally, uniquely numbered.
|
class V8_EXPORT_PRIVATE IrOpcode {
|
public:
|
enum Value {
|
#define DECLARE_OPCODE(x) k##x,
|
ALL_OP_LIST(DECLARE_OPCODE)
|
#undef DECLARE_OPCODE
|
kLast = -1
|
#define COUNT_OPCODE(x) +1
|
ALL_OP_LIST(COUNT_OPCODE)
|
#undef COUNT_OPCODE
|
};
|
|
// Returns the mnemonic name of an opcode.
|
static char const* Mnemonic(Value value);
|
|
// Returns true if opcode for common operator.
|
static bool IsCommonOpcode(Value value) {
|
return kStart <= value && value <= kDead;
|
}
|
|
// Returns true if opcode for control operator.
|
static bool IsControlOpcode(Value value) {
|
return kStart <= value && value <= kEnd;
|
}
|
|
// Returns true if opcode for JavaScript operator.
|
static bool IsJsOpcode(Value value) {
|
return kJSEqual <= value && value <= kJSDebugger;
|
}
|
|
// Returns true if opcode for constant operator.
|
static bool IsConstantOpcode(Value value) {
|
return kInt32Constant <= value && value <= kRelocatableInt64Constant;
|
}
|
|
static bool IsPhiOpcode(Value value) {
|
return value == kPhi || value == kEffectPhi;
|
}
|
|
static bool IsMergeOpcode(Value value) {
|
return value == kMerge || value == kLoop;
|
}
|
|
static bool IsIfProjectionOpcode(Value value) {
|
return kIfTrue <= value && value <= kIfDefault;
|
}
|
|
// Returns true if opcode terminates control flow in a graph (i.e. respective
|
// nodes are expected to have control uses by the graphs {End} node only).
|
static bool IsGraphTerminator(Value value) {
|
return value == kDeoptimize || value == kReturn || value == kTailCall ||
|
value == kTerminate || value == kThrow;
|
}
|
|
// Returns true if opcode can be inlined.
|
static bool IsInlineeOpcode(Value value) {
|
return value == kJSConstruct || value == kJSCall;
|
}
|
|
// Returns true if opcode for comparison operator.
|
static bool IsComparisonOpcode(Value value) {
|
return (kJSEqual <= value && value <= kJSGreaterThanOrEqual) ||
|
(kNumberEqual <= value && value <= kStringLessThanOrEqual) ||
|
(kWord32Equal <= value && value <= kFloat64LessThanOrEqual);
|
}
|
|
static bool IsContextChainExtendingOpcode(Value value) {
|
return kJSCreateFunctionContext <= value && value <= kJSCreateBlockContext;
|
}
|
};
|
|
V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, IrOpcode::Value);
|
|
} // namespace compiler
|
} // namespace internal
|
} // namespace v8
|
|
#endif // V8_COMPILER_OPCODES_H_
|