Index: runtime/vm/intermediate_language.h |
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h |
index 54fd78e9dac9d618abcf7a1b76613043120ee45a..b4e68788245ac9dc9b745b679f8e20bd7863367a 100644 |
--- a/runtime/vm/intermediate_language.h |
+++ b/runtime/vm/intermediate_language.h |
@@ -95,6 +95,7 @@ class Range; |
V(Float32x4, Float32x4.fromUint32x4Bits, Float32x4FromUint32x4Bits, \ |
770033146) \ |
V(_Float32x4, shuffle, Float32x4Shuffle, 1178727105) \ |
+ V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 927956119) \ |
V(_Float32x4, get:x, Float32x4ShuffleX, 1351717838) \ |
V(_Float32x4, get:y, Float32x4ShuffleY, 217386410) \ |
V(_Float32x4, get:z, Float32x4ShuffleZ, 2144923721) \ |
@@ -119,11 +120,6 @@ class Range; |
V(_Float32x4, withY, Float32x4WithY, 1806065938) \ |
V(_Float32x4, withZ, Float32x4WithZ, 320659034) \ |
V(_Float32x4, withW, Float32x4WithW, 1108437255) \ |
- V(_Float32x4, withZWInXY, Float32x4WithZWInXY, 1198101679) \ |
- V(_Float32x4, interleaveXY, Float32x4InterleaveXY, 2001324072) \ |
- V(_Float32x4, interleaveZW, Float32x4InterleaveZW, 928280031) \ |
- V(_Float32x4, interleaveXYPairs, Float32x4InterleaveXYPairs, 1046078993) \ |
- V(_Float32x4, interleaveZWPairs, Float32x4InterleaveZWPairs, 1001751955) \ |
V(Uint32x4, Uint32x4.bool, Uint32x4BoolConstructor, 517444095) \ |
V(Uint32x4, Uint32x4.fromFloat32x4Bits, Uint32x4FromFloat32x4Bits, \ |
1080034855) \ |
@@ -132,6 +128,8 @@ class Range; |
V(_Uint32x4, get:flagZ, Uint32x4GetFlagZ, 944733935) \ |
V(_Uint32x4, get:flagW, Uint32x4GetFlagW, 22746169) \ |
V(_Uint32x4, get:signMask, Uint32x4GetSignMask, 1858144083) \ |
+ V(_Uint32x4, shuffle, Uint32x4Shuffle, 146209630) \ |
+ V(_Uint32x4, shuffleMix, Uint32x4ShuffleMix, 1251494596) \ |
V(_Uint32x4, select, Uint32x4Select, 72244182) \ |
V(_Uint32x4, withFlagX, Uint32x4WithFlagX, 1475542073) \ |
V(_Uint32x4, withFlagY, Uint32x4WithFlagY, 830610988) \ |
@@ -677,7 +675,8 @@ class EmbeddedArray<T, 0> { |
M(GuardField) \ |
M(IfThenElse) \ |
M(BinaryFloat32x4Op) \ |
- M(Float32x4Shuffle) \ |
+ M(Simd32x4Shuffle) \ |
+ M(Simd32x4ShuffleMix) \ |
M(Simd32x4GetSignMask) \ |
M(Float32x4Constructor) \ |
M(Float32x4Zero) \ |
@@ -690,7 +689,6 @@ class EmbeddedArray<T, 0> { |
M(Float32x4Clamp) \ |
M(Float32x4With) \ |
M(Float32x4ToUint32x4) \ |
- M(Float32x4TwoArgShuffle) \ |
M(MaterializeObject) \ |
M(Uint32x4BoolConstructor) \ |
M(Uint32x4GetFlag) \ |
@@ -967,7 +965,8 @@ FOR_EACH_INSTRUCTION(INSTRUCTION_TYPE_CHECK) |
friend class BinaryFloat32x4OpInstr; |
friend class Float32x4ZeroInstr; |
friend class Float32x4SplatInstr; |
- friend class Float32x4ShuffleInstr; |
+ friend class Simd32x4ShuffleInstr; |
+ friend class Simd32x4ShuffleMixInstr; |
friend class Simd32x4GetSignMaskInstr; |
friend class Float32x4ConstructorInstr; |
friend class Float32x4ComparisonInstr; |
@@ -978,7 +977,6 @@ FOR_EACH_INSTRUCTION(INSTRUCTION_TYPE_CHECK) |
friend class Float32x4ClampInstr; |
friend class Float32x4WithInstr; |
friend class Float32x4ToUint32x4Instr; |
- friend class Float32x4TwoArgShuffleInstr; |
friend class Uint32x4BoolConstructorInstr; |
friend class Uint32x4GetFlagInstr; |
friend class Uint32x4SetFlagInstr; |
@@ -4996,11 +4994,11 @@ class BinaryFloat32x4OpInstr : public TemplateDefinition<2> { |
}; |
-class Float32x4ShuffleInstr : public TemplateDefinition<1> { |
+class Simd32x4ShuffleInstr : public TemplateDefinition<1> { |
public: |
- Float32x4ShuffleInstr(MethodRecognizer::Kind op_kind, Value* value, |
- intptr_t mask, |
- intptr_t deopt_id) |
+ Simd32x4ShuffleInstr(MethodRecognizer::Kind op_kind, Value* value, |
+ intptr_t mask, |
+ intptr_t deopt_id) |
: op_kind_(op_kind), mask_(mask) { |
SetInputAt(0, value); |
deopt_id_ = deopt_id; |
@@ -5023,11 +5021,88 @@ class Float32x4ShuffleInstr : public TemplateDefinition<1> { |
(op_kind_ == MethodRecognizer::kFloat32x4ShuffleW)) { |
return kUnboxedDouble; |
} |
+ if ((op_kind_ == MethodRecognizer::kUint32x4Shuffle)) { |
+ return kUnboxedUint32x4; |
+ } |
+ ASSERT((op_kind_ == MethodRecognizer::kFloat32x4Shuffle)); |
return kUnboxedFloat32x4; |
} |
virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
ASSERT(idx == 0); |
+ if ((op_kind_ == MethodRecognizer::kFloat32x4ShuffleX) || |
+ (op_kind_ == MethodRecognizer::kFloat32x4ShuffleY) || |
+ (op_kind_ == MethodRecognizer::kFloat32x4ShuffleZ) || |
+ (op_kind_ == MethodRecognizer::kFloat32x4ShuffleW) || |
+ (op_kind_ == MethodRecognizer::kFloat32x4Shuffle)) { |
+ return kUnboxedFloat32x4; |
+ } |
+ ASSERT((op_kind_ == MethodRecognizer::kUint32x4Shuffle)); |
+ return kUnboxedUint32x4; |
+ } |
+ |
+ virtual intptr_t DeoptimizationTarget() const { |
+ // Direct access since this instruction cannot deoptimize, and the deopt-id |
+ // was inherited from another instruction that could deoptimize. |
+ return deopt_id_; |
+ } |
+ |
+ DECLARE_INSTRUCTION(Simd32x4Shuffle) |
+ virtual CompileType ComputeType() const; |
+ |
+ virtual bool AllowsCSE() const { return true; } |
+ virtual EffectSet Effects() const { return EffectSet::None(); } |
+ virtual EffectSet Dependencies() const { return EffectSet::None(); } |
+ virtual bool AttributesEqual(Instruction* other) const { |
+ return (op_kind() == other->AsSimd32x4Shuffle()->op_kind()) && |
+ (mask() == other->AsSimd32x4Shuffle()->mask()); |
+ } |
+ |
+ virtual bool MayThrow() const { return false; } |
+ |
+ private: |
+ const MethodRecognizer::Kind op_kind_; |
+ const intptr_t mask_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Simd32x4ShuffleInstr); |
+}; |
+ |
+ |
+class Simd32x4ShuffleMixInstr : public TemplateDefinition<2> { |
+ public: |
+ Simd32x4ShuffleMixInstr(MethodRecognizer::Kind op_kind, Value* xy, |
+ Value* zw, intptr_t mask, intptr_t deopt_id) |
+ : op_kind_(op_kind), mask_(mask) { |
+ SetInputAt(0, xy); |
+ SetInputAt(1, zw); |
+ deopt_id_ = deopt_id; |
+ } |
+ |
+ Value* xy() const { return inputs_[0]; } |
+ Value* zw() const { return inputs_[1]; } |
+ |
+ MethodRecognizer::Kind op_kind() const { return op_kind_; } |
+ |
+ intptr_t mask() const { return mask_; } |
+ |
+ virtual void PrintOperandsTo(BufferFormatter* f) const; |
+ |
+ virtual bool CanDeoptimize() const { return false; } |
+ |
+ virtual Representation representation() const { |
+ if (op_kind() == MethodRecognizer::kUint32x4ShuffleMix) { |
+ return kUnboxedUint32x4; |
+ } |
+ ASSERT(op_kind() == MethodRecognizer::kFloat32x4ShuffleMix); |
+ return kUnboxedFloat32x4; |
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
+ ASSERT((idx == 0) || (idx == 1)); |
+ if (op_kind() == MethodRecognizer::kUint32x4ShuffleMix) { |
+ return kUnboxedUint32x4; |
+ } |
+ ASSERT(op_kind() == MethodRecognizer::kFloat32x4ShuffleMix); |
return kUnboxedFloat32x4; |
} |
@@ -5037,15 +5112,15 @@ class Float32x4ShuffleInstr : public TemplateDefinition<1> { |
return deopt_id_; |
} |
- DECLARE_INSTRUCTION(Float32x4Shuffle) |
+ DECLARE_INSTRUCTION(Simd32x4ShuffleMix) |
virtual CompileType ComputeType() const; |
virtual bool AllowsCSE() const { return true; } |
virtual EffectSet Effects() const { return EffectSet::None(); } |
virtual EffectSet Dependencies() const { return EffectSet::None(); } |
virtual bool AttributesEqual(Instruction* other) const { |
- return op_kind() == other->AsFloat32x4Shuffle()->op_kind() && |
- mask() == other->AsFloat32x4Shuffle()->mask(); |
+ return (op_kind() == other->AsSimd32x4ShuffleMix()->op_kind()) && |
+ (mask() == other->AsSimd32x4ShuffleMix()->mask()); |
} |
virtual bool MayThrow() const { return false; } |
@@ -5054,7 +5129,7 @@ class Float32x4ShuffleInstr : public TemplateDefinition<1> { |
const MethodRecognizer::Kind op_kind_; |
const intptr_t mask_; |
- DISALLOW_COPY_AND_ASSIGN(Float32x4ShuffleInstr); |
+ DISALLOW_COPY_AND_ASSIGN(Simd32x4ShuffleMixInstr); |
}; |
@@ -5757,59 +5832,6 @@ class Simd32x4GetSignMaskInstr : public TemplateDefinition<1> { |
}; |
-class Float32x4TwoArgShuffleInstr : public TemplateDefinition<2> { |
- public: |
- Float32x4TwoArgShuffleInstr(MethodRecognizer::Kind op_kind, Value* left, |
- Value* right, intptr_t deopt_id) |
- : op_kind_(op_kind) { |
- SetInputAt(0, left); |
- SetInputAt(1, right); |
- deopt_id_ = deopt_id; |
- } |
- |
- Value* left() const { return inputs_[0]; } |
- Value* right() const { return inputs_[1]; } |
- |
- MethodRecognizer::Kind op_kind() const { return op_kind_; } |
- |
- virtual void PrintOperandsTo(BufferFormatter* f) const; |
- |
- virtual bool CanDeoptimize() const { return false; } |
- |
- virtual Representation representation() const { |
- return kUnboxedFloat32x4; |
- } |
- |
- virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
- ASSERT((idx == 0) || (idx == 1)); |
- return kUnboxedFloat32x4; |
- } |
- |
- virtual intptr_t DeoptimizationTarget() const { |
- // Direct access since this instruction cannot deoptimize, and the deopt-id |
- // was inherited from another instruction that could deoptimize. |
- return deopt_id_; |
- } |
- |
- DECLARE_INSTRUCTION(Float32x4TwoArgShuffle) |
- virtual CompileType ComputeType() const; |
- |
- virtual bool AllowsCSE() const { return true; } |
- virtual EffectSet Effects() const { return EffectSet::None(); } |
- virtual EffectSet Dependencies() const { return EffectSet::None(); } |
- virtual bool AttributesEqual(Instruction* other) const { |
- return op_kind() == other->AsFloat32x4TwoArgShuffle()->op_kind(); |
- } |
- |
- virtual bool MayThrow() const { return false; } |
- |
- private: |
- const MethodRecognizer::Kind op_kind_; |
- |
- DISALLOW_COPY_AND_ASSIGN(Float32x4TwoArgShuffleInstr); |
-}; |
- |
- |
class Uint32x4SelectInstr : public TemplateDefinition<3> { |
public: |
Uint32x4SelectInstr(Value* mask, Value* trueValue, Value* falseValue, |