Merge V8 5.2.361.47 DO NOT MERGE
https://chromium.googlesource.com/v8/v8/+/5.2.361.47
FPIIM-449
Change-Id: Ibec421b85a9b88cb3a432ada642e469fe7e78346
(cherry picked from commit bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8)
diff --git a/src/compiler/machine-operator.h b/src/compiler/machine-operator.h
index 68e393a..814f6c9 100644
--- a/src/compiler/machine-operator.h
+++ b/src/compiler/machine-operator.h
@@ -33,32 +33,6 @@
};
-// Supported float64 to int32 truncation modes.
-enum class TruncationMode : uint8_t {
- kJavaScript, // ES6 section 7.1.5
- kRoundToZero // Round towards zero. Implementation defined for NaN and ovf.
-};
-
-V8_INLINE size_t hash_value(TruncationMode mode) {
- return static_cast<uint8_t>(mode);
-}
-
-std::ostream& operator<<(std::ostream&, TruncationMode);
-
-TruncationMode TruncationModeOf(Operator const*);
-
-
-// Supported write barrier modes.
-enum WriteBarrierKind {
- kNoWriteBarrier,
- kMapWriteBarrier,
- kPointerWriteBarrier,
- kFullWriteBarrier
-};
-
-std::ostream& operator<<(std::ostream& os, WriteBarrierKind);
-
-
// A Load needs a MachineType.
typedef MachineType LoadRepresentation;
@@ -104,6 +78,8 @@
MachineRepresentation StackSlotRepresentationOf(Operator const* op);
+MachineRepresentation AtomicStoreRepresentationOf(Operator const* op);
+
// Interface for building machine-level operators. These operators are
// machine-level but machine-independent and thus define a language suitable
// for generating code to run on architectures such as ia32, x64, arm, etc.
@@ -220,6 +196,12 @@
const Operator* Uint64LessThanOrEqual();
const Operator* Uint64Mod();
+ // This operator reinterprets the bits of a word as tagged pointer.
+ const Operator* BitcastWordToTagged();
+
+ // JavaScript float64 to int32/uint32 truncation.
+ const Operator* TruncateFloat64ToWord32();
+
// These operators change the representation of numbers while preserving the
// value of the number. Narrowing operators assume the input is representable
// in the target type and are *not* defined for other inputs.
@@ -243,8 +225,8 @@
// These operators truncate or round numbers, both changing the representation
// of the number and mapping multiple input values onto the same output value.
const Operator* TruncateFloat64ToFloat32();
- const Operator* TruncateFloat64ToInt32(TruncationMode);
const Operator* TruncateInt64ToInt32();
+ const Operator* RoundFloat64ToInt32();
const Operator* RoundInt32ToFloat32();
const Operator* RoundInt64ToFloat32();
const Operator* RoundInt64ToFloat64();
@@ -263,6 +245,7 @@
// (single-precision).
const Operator* Float32Add();
const Operator* Float32Sub();
+ const Operator* Float32SubPreserveNan();
const Operator* Float32Mul();
const Operator* Float32Div();
const Operator* Float32Sqrt();
@@ -271,6 +254,7 @@
// (double-precision).
const Operator* Float64Add();
const Operator* Float64Sub();
+ const Operator* Float64SubPreserveNan();
const Operator* Float64Mul();
const Operator* Float64Div();
const Operator* Float64Mod();
@@ -317,6 +301,190 @@
const Operator* Float64InsertLowWord32();
const Operator* Float64InsertHighWord32();
+ // SIMD operators.
+ const Operator* CreateFloat32x4();
+ const Operator* Float32x4ExtractLane();
+ const Operator* Float32x4ReplaceLane();
+ const Operator* Float32x4Abs();
+ const Operator* Float32x4Neg();
+ const Operator* Float32x4Sqrt();
+ const Operator* Float32x4RecipApprox();
+ const Operator* Float32x4RecipSqrtApprox();
+ const Operator* Float32x4Add();
+ const Operator* Float32x4Sub();
+ const Operator* Float32x4Mul();
+ const Operator* Float32x4Div();
+ const Operator* Float32x4Min();
+ const Operator* Float32x4Max();
+ const Operator* Float32x4MinNum();
+ const Operator* Float32x4MaxNum();
+ const Operator* Float32x4Equal();
+ const Operator* Float32x4NotEqual();
+ const Operator* Float32x4LessThan();
+ const Operator* Float32x4LessThanOrEqual();
+ const Operator* Float32x4GreaterThan();
+ const Operator* Float32x4GreaterThanOrEqual();
+ const Operator* Float32x4Select();
+ const Operator* Float32x4Swizzle();
+ const Operator* Float32x4Shuffle();
+ const Operator* Float32x4FromInt32x4();
+ const Operator* Float32x4FromUint32x4();
+
+ const Operator* CreateInt32x4();
+ const Operator* Int32x4ExtractLane();
+ const Operator* Int32x4ReplaceLane();
+ const Operator* Int32x4Neg();
+ const Operator* Int32x4Add();
+ const Operator* Int32x4Sub();
+ const Operator* Int32x4Mul();
+ const Operator* Int32x4Min();
+ const Operator* Int32x4Max();
+ const Operator* Int32x4ShiftLeftByScalar();
+ const Operator* Int32x4ShiftRightByScalar();
+ const Operator* Int32x4Equal();
+ const Operator* Int32x4NotEqual();
+ const Operator* Int32x4LessThan();
+ const Operator* Int32x4LessThanOrEqual();
+ const Operator* Int32x4GreaterThan();
+ const Operator* Int32x4GreaterThanOrEqual();
+ const Operator* Int32x4Select();
+ const Operator* Int32x4Swizzle();
+ const Operator* Int32x4Shuffle();
+ const Operator* Int32x4FromFloat32x4();
+
+ const Operator* Uint32x4Min();
+ const Operator* Uint32x4Max();
+ const Operator* Uint32x4ShiftLeftByScalar();
+ const Operator* Uint32x4ShiftRightByScalar();
+ const Operator* Uint32x4LessThan();
+ const Operator* Uint32x4LessThanOrEqual();
+ const Operator* Uint32x4GreaterThan();
+ const Operator* Uint32x4GreaterThanOrEqual();
+ const Operator* Uint32x4FromFloat32x4();
+
+ const Operator* CreateBool32x4();
+ const Operator* Bool32x4ExtractLane();
+ const Operator* Bool32x4ReplaceLane();
+ const Operator* Bool32x4And();
+ const Operator* Bool32x4Or();
+ const Operator* Bool32x4Xor();
+ const Operator* Bool32x4Not();
+ const Operator* Bool32x4AnyTrue();
+ const Operator* Bool32x4AllTrue();
+ const Operator* Bool32x4Swizzle();
+ const Operator* Bool32x4Shuffle();
+ const Operator* Bool32x4Equal();
+ const Operator* Bool32x4NotEqual();
+
+ const Operator* CreateInt16x8();
+ const Operator* Int16x8ExtractLane();
+ const Operator* Int16x8ReplaceLane();
+ const Operator* Int16x8Neg();
+ const Operator* Int16x8Add();
+ const Operator* Int16x8AddSaturate();
+ const Operator* Int16x8Sub();
+ const Operator* Int16x8SubSaturate();
+ const Operator* Int16x8Mul();
+ const Operator* Int16x8Min();
+ const Operator* Int16x8Max();
+ const Operator* Int16x8ShiftLeftByScalar();
+ const Operator* Int16x8ShiftRightByScalar();
+ const Operator* Int16x8Equal();
+ const Operator* Int16x8NotEqual();
+ const Operator* Int16x8LessThan();
+ const Operator* Int16x8LessThanOrEqual();
+ const Operator* Int16x8GreaterThan();
+ const Operator* Int16x8GreaterThanOrEqual();
+ const Operator* Int16x8Select();
+ const Operator* Int16x8Swizzle();
+ const Operator* Int16x8Shuffle();
+
+ const Operator* Uint16x8AddSaturate();
+ const Operator* Uint16x8SubSaturate();
+ const Operator* Uint16x8Min();
+ const Operator* Uint16x8Max();
+ const Operator* Uint16x8ShiftLeftByScalar();
+ const Operator* Uint16x8ShiftRightByScalar();
+ const Operator* Uint16x8LessThan();
+ const Operator* Uint16x8LessThanOrEqual();
+ const Operator* Uint16x8GreaterThan();
+ const Operator* Uint16x8GreaterThanOrEqual();
+
+ const Operator* CreateBool16x8();
+ const Operator* Bool16x8ExtractLane();
+ const Operator* Bool16x8ReplaceLane();
+ const Operator* Bool16x8And();
+ const Operator* Bool16x8Or();
+ const Operator* Bool16x8Xor();
+ const Operator* Bool16x8Not();
+ const Operator* Bool16x8AnyTrue();
+ const Operator* Bool16x8AllTrue();
+ const Operator* Bool16x8Swizzle();
+ const Operator* Bool16x8Shuffle();
+ const Operator* Bool16x8Equal();
+ const Operator* Bool16x8NotEqual();
+
+ const Operator* CreateInt8x16();
+ const Operator* Int8x16ExtractLane();
+ const Operator* Int8x16ReplaceLane();
+ const Operator* Int8x16Neg();
+ const Operator* Int8x16Add();
+ const Operator* Int8x16AddSaturate();
+ const Operator* Int8x16Sub();
+ const Operator* Int8x16SubSaturate();
+ const Operator* Int8x16Mul();
+ const Operator* Int8x16Min();
+ const Operator* Int8x16Max();
+ const Operator* Int8x16ShiftLeftByScalar();
+ const Operator* Int8x16ShiftRightByScalar();
+ const Operator* Int8x16Equal();
+ const Operator* Int8x16NotEqual();
+ const Operator* Int8x16LessThan();
+ const Operator* Int8x16LessThanOrEqual();
+ const Operator* Int8x16GreaterThan();
+ const Operator* Int8x16GreaterThanOrEqual();
+ const Operator* Int8x16Select();
+ const Operator* Int8x16Swizzle();
+ const Operator* Int8x16Shuffle();
+
+ const Operator* Uint8x16AddSaturate();
+ const Operator* Uint8x16SubSaturate();
+ const Operator* Uint8x16Min();
+ const Operator* Uint8x16Max();
+ const Operator* Uint8x16ShiftLeftByScalar();
+ const Operator* Uint8x16ShiftRightByScalar();
+ const Operator* Uint8x16LessThan();
+ const Operator* Uint8x16LessThanOrEqual();
+ const Operator* Uint8x16GreaterThan();
+ const Operator* Uint8x16GreaterThanOrEqual();
+
+ const Operator* CreateBool8x16();
+ const Operator* Bool8x16ExtractLane();
+ const Operator* Bool8x16ReplaceLane();
+ const Operator* Bool8x16And();
+ const Operator* Bool8x16Or();
+ const Operator* Bool8x16Xor();
+ const Operator* Bool8x16Not();
+ const Operator* Bool8x16AnyTrue();
+ const Operator* Bool8x16AllTrue();
+ const Operator* Bool8x16Swizzle();
+ const Operator* Bool8x16Shuffle();
+ const Operator* Bool8x16Equal();
+ const Operator* Bool8x16NotEqual();
+
+ const Operator* Simd128Load();
+ const Operator* Simd128Load1();
+ const Operator* Simd128Load2();
+ const Operator* Simd128Load3();
+ const Operator* Simd128Store();
+ const Operator* Simd128Store1();
+ const Operator* Simd128Store2();
+ const Operator* Simd128Store3();
+ const Operator* Simd128And();
+ const Operator* Simd128Or();
+ const Operator* Simd128Xor();
+ const Operator* Simd128Not();
+
// load [base + index]
const Operator* Load(LoadRepresentation rep);
@@ -335,6 +503,11 @@
// checked-store heap, index, length, value
const Operator* CheckedStore(CheckedStoreRepresentation);
+ // atomic-load [base + index]
+ const Operator* AtomicLoad(LoadRepresentation rep);
+ // atomic-store [base + index], value
+ const Operator* AtomicStore(MachineRepresentation rep);
+
// Target machine word-size assumed by this builder.
bool Is32() const { return word() == MachineRepresentation::kWord32; }
bool Is64() const { return word() == MachineRepresentation::kWord64; }