OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 V(StringCompareAndBranch) \ | 179 V(StringCompareAndBranch) \ |
180 V(Sub) \ | 180 V(Sub) \ |
181 V(ThisFunction) \ | 181 V(ThisFunction) \ |
182 V(Throw) \ | 182 V(Throw) \ |
183 V(ToFastProperties) \ | 183 V(ToFastProperties) \ |
184 V(TransitionElementsKind) \ | 184 V(TransitionElementsKind) \ |
185 V(TrapAllocationMemento) \ | 185 V(TrapAllocationMemento) \ |
186 V(Typeof) \ | 186 V(Typeof) \ |
187 V(TypeofIsAndBranch) \ | 187 V(TypeofIsAndBranch) \ |
188 V(UnaryMathOperation) \ | 188 V(UnaryMathOperation) \ |
| 189 V(NullarySIMDOperation) \ |
| 190 V(UnarySIMDOperation) \ |
| 191 V(BinarySIMDOperation) \ |
| 192 V(TernarySIMDOperation) \ |
| 193 V(QuarternarySIMDOperation) \ |
189 V(UnknownOSRValue) \ | 194 V(UnknownOSRValue) \ |
190 V(UseConst) \ | 195 V(UseConst) \ |
191 V(ValueOf) \ | 196 V(ValueOf) \ |
192 V(WrapReceiver) | 197 V(WrapReceiver) |
193 | 198 |
194 #define GVN_TRACKED_FLAG_LIST(V) \ | 199 #define GVN_TRACKED_FLAG_LIST(V) \ |
195 V(Maps) \ | 200 V(Maps) \ |
196 V(NewSpacePromotion) | 201 V(NewSpacePromotion) |
197 | 202 |
198 #define GVN_UNTRACKED_FLAG_LIST(V) \ | 203 #define GVN_UNTRACKED_FLAG_LIST(V) \ |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 | 314 |
310 | 315 |
311 class HType V8_FINAL { | 316 class HType V8_FINAL { |
312 public: | 317 public: |
313 static HType None() { return HType(kNone); } | 318 static HType None() { return HType(kNone); } |
314 static HType Tagged() { return HType(kTagged); } | 319 static HType Tagged() { return HType(kTagged); } |
315 static HType TaggedPrimitive() { return HType(kTaggedPrimitive); } | 320 static HType TaggedPrimitive() { return HType(kTaggedPrimitive); } |
316 static HType TaggedNumber() { return HType(kTaggedNumber); } | 321 static HType TaggedNumber() { return HType(kTaggedNumber); } |
317 static HType Smi() { return HType(kSmi); } | 322 static HType Smi() { return HType(kSmi); } |
318 static HType HeapNumber() { return HType(kHeapNumber); } | 323 static HType HeapNumber() { return HType(kHeapNumber); } |
| 324 static HType Float32x4() { return HType(kFloat32x4); } |
| 325 static HType Int32x4() { return HType(kInt32x4); } |
319 static HType String() { return HType(kString); } | 326 static HType String() { return HType(kString); } |
320 static HType Boolean() { return HType(kBoolean); } | 327 static HType Boolean() { return HType(kBoolean); } |
321 static HType NonPrimitive() { return HType(kNonPrimitive); } | 328 static HType NonPrimitive() { return HType(kNonPrimitive); } |
322 static HType JSArray() { return HType(kJSArray); } | 329 static HType JSArray() { return HType(kJSArray); } |
323 static HType JSObject() { return HType(kJSObject); } | 330 static HType JSObject() { return HType(kJSObject); } |
324 | 331 |
325 // Return the weakest (least precise) common type. | 332 // Return the weakest (least precise) common type. |
326 HType Combine(HType other) { | 333 HType Combine(HType other) { |
327 return HType(static_cast<Type>(type_ & other.type_)); | 334 return HType(static_cast<Type>(type_ & other.type_)); |
328 } | 335 } |
(...skipping 15 matching lines...) Expand all Loading... |
344 } | 351 } |
345 | 352 |
346 bool IsSmi() const { | 353 bool IsSmi() const { |
347 return ((type_ & kSmi) == kSmi); | 354 return ((type_ & kSmi) == kSmi); |
348 } | 355 } |
349 | 356 |
350 bool IsHeapNumber() const { | 357 bool IsHeapNumber() const { |
351 return ((type_ & kHeapNumber) == kHeapNumber); | 358 return ((type_ & kHeapNumber) == kHeapNumber); |
352 } | 359 } |
353 | 360 |
| 361 bool IsFloat32x4() const { |
| 362 return ((type_ & kFloat32x4) == kFloat32x4); |
| 363 } |
| 364 |
| 365 bool IsInt32x4() const { |
| 366 return ((type_ & kInt32x4) == kInt32x4); |
| 367 } |
| 368 |
354 bool IsString() const { | 369 bool IsString() const { |
355 return ((type_ & kString) == kString); | 370 return ((type_ & kString) == kString); |
356 } | 371 } |
357 | 372 |
358 bool IsNonString() const { | 373 bool IsNonString() const { |
359 return IsTaggedPrimitive() || IsSmi() || IsHeapNumber() || | 374 return IsTaggedPrimitive() || IsSmi() || IsHeapNumber() || |
360 IsBoolean() || IsJSArray(); | 375 IsFloat32x4() || IsInt32x4() || IsBoolean() || IsJSArray(); |
361 } | 376 } |
362 | 377 |
363 bool IsBoolean() const { | 378 bool IsBoolean() const { |
364 return ((type_ & kBoolean) == kBoolean); | 379 return ((type_ & kBoolean) == kBoolean); |
365 } | 380 } |
366 | 381 |
367 bool IsNonPrimitive() const { | 382 bool IsNonPrimitive() const { |
368 return ((type_ & kNonPrimitive) == kNonPrimitive); | 383 return ((type_ & kNonPrimitive) == kNonPrimitive); |
369 } | 384 } |
370 | 385 |
371 bool IsJSArray() const { | 386 bool IsJSArray() const { |
372 return ((type_ & kJSArray) == kJSArray); | 387 return ((type_ & kJSArray) == kJSArray); |
373 } | 388 } |
374 | 389 |
375 bool IsJSObject() const { | 390 bool IsJSObject() const { |
376 return ((type_ & kJSObject) == kJSObject); | 391 return ((type_ & kJSObject) == kJSObject); |
377 } | 392 } |
378 | 393 |
379 bool IsHeapObject() const { | 394 bool IsHeapObject() const { |
380 return IsHeapNumber() || IsString() || IsBoolean() || IsNonPrimitive(); | 395 return IsHeapNumber() || IsFloat32x4() || IsInt32x4() || IsString() || |
| 396 IsBoolean() || IsNonPrimitive(); |
381 } | 397 } |
382 | 398 |
383 bool ToStringOrToNumberCanBeObserved(Representation representation) { | 399 bool ToStringOrToNumberCanBeObserved(Representation representation) { |
384 switch (type_) { | 400 switch (type_) { |
385 case kTaggedPrimitive: // fallthru | 401 case kTaggedPrimitive: // fallthru |
386 case kTaggedNumber: // fallthru | 402 case kTaggedNumber: // fallthru |
387 case kSmi: // fallthru | 403 case kSmi: // fallthru |
388 case kHeapNumber: // fallthru | 404 case kHeapNumber: // fallthru |
| 405 case kFloat32x4: // fallthru |
| 406 case kInt32x4: // fallthru |
389 case kString: // fallthru | 407 case kString: // fallthru |
390 case kBoolean: | 408 case kBoolean: |
391 return false; | 409 return false; |
392 case kJSArray: // fallthru | 410 case kJSArray: // fallthru |
393 case kJSObject: | 411 case kJSObject: |
394 return true; | 412 return true; |
395 case kTagged: | 413 case kTagged: |
396 break; | 414 break; |
397 } | 415 } |
398 return !representation.IsSmiOrInteger32() && !representation.IsDouble(); | 416 return !representation.IsSmiOrInteger32() && !representation.IsDouble(); |
399 } | 417 } |
400 | 418 |
401 static HType TypeFromValue(Handle<Object> value); | 419 static HType TypeFromValue(Handle<Object> value); |
| 420 static HType TypeFromRepresentation(Representation representation); |
402 | 421 |
403 const char* ToString(); | 422 const char* ToString(); |
404 | 423 |
405 private: | 424 private: |
406 enum Type { | 425 enum Type { |
407 kNone = 0x0, // 0000 0000 0000 0000 | 426 kNone = 0x0, // 0000 0000 0000 0000 |
408 kTagged = 0x1, // 0000 0000 0000 0001 | 427 kTagged = 0x1, // 0000 0000 0000 0001 |
409 kTaggedPrimitive = 0x5, // 0000 0000 0000 0101 | 428 kTaggedPrimitive = 0x5, // 0000 0000 0000 0101 |
410 kTaggedNumber = 0xd, // 0000 0000 0000 1101 | 429 kTaggedNumber = 0xd, // 0000 0000 0000 1101 |
411 kSmi = 0x1d, // 0000 0000 0001 1101 | 430 kSmi = 0x1d, // 0000 0000 0001 1101 |
412 kHeapNumber = 0x2d, // 0000 0000 0010 1101 | 431 kHeapNumber = 0x2d, // 0000 0000 0010 1101 |
413 kString = 0x45, // 0000 0000 0100 0101 | 432 kFloat32x4 = 0x45, // 0000 0000 0100 0101 |
414 kBoolean = 0x85, // 0000 0000 1000 0101 | 433 kInt32x4 = 0x85, // 0000 0000 1000 0101 |
415 kNonPrimitive = 0x101, // 0000 0001 0000 0001 | 434 kString = 0x105, // 0000 0001 0000 0101 |
416 kJSObject = 0x301, // 0000 0011 0000 0001 | 435 kBoolean = 0x205, // 0000 0010 1000 0101 |
417 kJSArray = 0x701 // 0000 0111 0000 0001 | 436 kNonPrimitive = 0x401, // 0000 0100 0000 0001 |
| 437 kJSObject = 0xc01, // 0000 1100 0000 0001 |
| 438 kJSArray = 0x1c01 // 0001 1100 0000 0001 |
418 }; | 439 }; |
419 | 440 |
420 // Make sure type fits in int16. | 441 // Make sure type fits in int16. |
421 STATIC_ASSERT(kJSArray < (1 << (2 * kBitsPerByte))); | 442 STATIC_ASSERT(kJSArray < (1 << (2 * kBitsPerByte))); |
422 | 443 |
423 explicit HType(Type t) : type_(t) { } | 444 explicit HType(Type t) : type_(t) { } |
424 | 445 |
425 int16_t type_; | 446 int16_t type_; |
426 }; | 447 }; |
427 | 448 |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 } | 690 } |
670 } | 691 } |
671 virtual void AssumeRepresentation(Representation r); | 692 virtual void AssumeRepresentation(Representation r); |
672 | 693 |
673 virtual Representation KnownOptimalRepresentation() { | 694 virtual Representation KnownOptimalRepresentation() { |
674 Representation r = representation(); | 695 Representation r = representation(); |
675 if (r.IsTagged()) { | 696 if (r.IsTagged()) { |
676 HType t = type(); | 697 HType t = type(); |
677 if (t.IsSmi()) return Representation::Smi(); | 698 if (t.IsSmi()) return Representation::Smi(); |
678 if (t.IsHeapNumber()) return Representation::Double(); | 699 if (t.IsHeapNumber()) return Representation::Double(); |
| 700 if (t.IsFloat32x4()) return Representation::Float32x4(); |
| 701 if (t.IsInt32x4()) return Representation::Int32x4(); |
679 if (t.IsHeapObject()) return r; | 702 if (t.IsHeapObject()) return r; |
680 return Representation::None(); | 703 return Representation::None(); |
681 } | 704 } |
682 return r; | 705 return r; |
683 } | 706 } |
684 | 707 |
685 HType type() const { return type_; } | 708 HType type() const { return type_; } |
686 void set_type(HType new_type) { | 709 void set_type(HType new_type) { |
687 ASSERT(new_type.IsSubtypeOf(type_)); | 710 ASSERT(new_type.IsSubtypeOf(type_)); |
688 type_ = new_type; | 711 type_ = new_type; |
(...skipping 1022 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1711 set_representation(to); | 1734 set_representation(to); |
1712 SetFlag(kUseGVN); | 1735 SetFlag(kUseGVN); |
1713 if (is_truncating_to_smi) { | 1736 if (is_truncating_to_smi) { |
1714 SetFlag(kTruncatingToSmi); | 1737 SetFlag(kTruncatingToSmi); |
1715 SetFlag(kTruncatingToInt32); | 1738 SetFlag(kTruncatingToInt32); |
1716 } | 1739 } |
1717 if (is_truncating_to_int32) SetFlag(kTruncatingToInt32); | 1740 if (is_truncating_to_int32) SetFlag(kTruncatingToInt32); |
1718 if (value->representation().IsSmi() || value->type().IsSmi()) { | 1741 if (value->representation().IsSmi() || value->type().IsSmi()) { |
1719 set_type(HType::Smi()); | 1742 set_type(HType::Smi()); |
1720 } else { | 1743 } else { |
1721 set_type(HType::TaggedNumber()); | 1744 if (to.IsFloat32x4()) { |
| 1745 set_type(HType::Float32x4()); |
| 1746 } else if (to.IsInt32x4()) { |
| 1747 set_type(HType::Int32x4()); |
| 1748 } else { |
| 1749 set_type(HType::TaggedNumber()); |
| 1750 } |
1722 if (to.IsTagged()) SetGVNFlag(kChangesNewSpacePromotion); | 1751 if (to.IsTagged()) SetGVNFlag(kChangesNewSpacePromotion); |
1723 } | 1752 } |
1724 } | 1753 } |
1725 | 1754 |
1726 bool can_convert_undefined_to_nan() { | 1755 bool can_convert_undefined_to_nan() { |
1727 return CheckUsesForFlag(kAllowUndefinedAsNaN); | 1756 return CheckUsesForFlag(kAllowUndefinedAsNaN); |
1728 } | 1757 } |
1729 | 1758 |
1730 virtual HValue* EnsureAndPropagateNotMinusZero( | 1759 virtual HValue* EnsureAndPropagateNotMinusZero( |
1731 BitVector* visited) V8_OVERRIDE; | 1760 BitVector* visited) V8_OVERRIDE; |
(...skipping 1005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2737 // corresponding HStoreRoot instruction. | 2766 // corresponding HStoreRoot instruction. |
2738 SetGVNFlag(kDependsOnCalls); | 2767 SetGVNFlag(kDependsOnCalls); |
2739 } | 2768 } |
2740 | 2769 |
2741 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 2770 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
2742 | 2771 |
2743 const Heap::RootListIndex index_; | 2772 const Heap::RootListIndex index_; |
2744 }; | 2773 }; |
2745 | 2774 |
2746 | 2775 |
| 2776 class HNullarySIMDOperation V8_FINAL : public HTemplateInstruction<1> { |
| 2777 public: |
| 2778 static HInstruction* New(Zone* zone, |
| 2779 HValue* context, |
| 2780 BuiltinFunctionId op); |
| 2781 |
| 2782 HValue* context() { return OperandAt(0); } |
| 2783 |
| 2784 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
| 2785 |
| 2786 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
| 2787 return Representation::Tagged(); |
| 2788 } |
| 2789 |
| 2790 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
| 2791 virtual HValue* Canonicalize() V8_OVERRIDE; |
| 2792 |
| 2793 BuiltinFunctionId op() const { return op_; } |
| 2794 const char* OpName() const; |
| 2795 |
| 2796 DECLARE_CONCRETE_INSTRUCTION(NullarySIMDOperation) |
| 2797 |
| 2798 protected: |
| 2799 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
| 2800 HNullarySIMDOperation* b = HNullarySIMDOperation::cast(other); |
| 2801 return op_ == b->op(); |
| 2802 } |
| 2803 |
| 2804 private: |
| 2805 HNullarySIMDOperation(HValue* context, BuiltinFunctionId op) |
| 2806 : HTemplateInstruction<1>(HType::Float32x4()), op_(op) { |
| 2807 SetOperandAt(0, context); |
| 2808 switch (op) { |
| 2809 case kFloat32x4Zero: |
| 2810 set_representation(Representation::Float32x4()); |
| 2811 break; |
| 2812 default: |
| 2813 UNREACHABLE(); |
| 2814 } |
| 2815 SetFlag(kUseGVN); |
| 2816 } |
| 2817 |
| 2818 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
| 2819 |
| 2820 BuiltinFunctionId op_; |
| 2821 }; |
| 2822 |
| 2823 |
| 2824 class HUnarySIMDOperation V8_FINAL : public HTemplateInstruction<2> { |
| 2825 public: |
| 2826 static HInstruction* New(Zone* zone, |
| 2827 HValue* context, |
| 2828 HValue* value, |
| 2829 BuiltinFunctionId op, |
| 2830 Representation to = Representation::Float32x4()); |
| 2831 |
| 2832 HValue* context() { return OperandAt(0); } |
| 2833 HValue* value() { return OperandAt(1); } |
| 2834 |
| 2835 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
| 2836 |
| 2837 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
| 2838 if (op_ == kFloat32x4OrInt32x4Change) { |
| 2839 return value()->representation(); |
| 2840 } else if (index == 0) { |
| 2841 return Representation::Tagged(); |
| 2842 } else { |
| 2843 switch (op_) { |
| 2844 case kSIMDAbs: |
| 2845 case kSIMDNeg: |
| 2846 case kSIMDReciprocal: |
| 2847 case kSIMDReciprocalSqrt: |
| 2848 case kSIMDSqrt: |
| 2849 case kSIMDBitsToInt32x4: |
| 2850 case kSIMDToInt32x4: |
| 2851 case kFloat32x4SignMask: |
| 2852 case kFloat32x4X: |
| 2853 case kFloat32x4Y: |
| 2854 case kFloat32x4Z: |
| 2855 case kFloat32x4W: |
| 2856 return Representation::Float32x4(); |
| 2857 case kSIMDBitsToFloat32x4: |
| 2858 case kSIMDToFloat32x4: |
| 2859 case kInt32x4SignMask: |
| 2860 case kInt32x4X: |
| 2861 case kInt32x4Y: |
| 2862 case kInt32x4Z: |
| 2863 case kInt32x4W: |
| 2864 case kInt32x4FlagX: |
| 2865 case kInt32x4FlagY: |
| 2866 case kInt32x4FlagZ: |
| 2867 case kInt32x4FlagW: |
| 2868 case kSIMDNegU32: |
| 2869 return Representation::Int32x4(); |
| 2870 case kFloat32x4Splat: |
| 2871 return Representation::Double(); |
| 2872 case kInt32x4Splat: |
| 2873 return Representation::Integer32(); |
| 2874 default: |
| 2875 UNREACHABLE(); |
| 2876 return Representation::None(); |
| 2877 } |
| 2878 } |
| 2879 } |
| 2880 |
| 2881 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
| 2882 |
| 2883 virtual HValue* Canonicalize() V8_OVERRIDE; |
| 2884 virtual Representation RepresentationFromInputs() V8_OVERRIDE; |
| 2885 |
| 2886 BuiltinFunctionId op() const { return op_; } |
| 2887 const char* OpName() const; |
| 2888 |
| 2889 DECLARE_CONCRETE_INSTRUCTION(UnarySIMDOperation) |
| 2890 |
| 2891 protected: |
| 2892 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
| 2893 HUnarySIMDOperation* b = HUnarySIMDOperation::cast(other); |
| 2894 return op_ == b->op(); |
| 2895 } |
| 2896 |
| 2897 private: |
| 2898 HUnarySIMDOperation(HValue* context, HValue* value, BuiltinFunctionId op, |
| 2899 Representation to = Representation::Float32x4()) |
| 2900 : HTemplateInstruction<2>(HType::TypeFromRepresentation(to)), op_(op) { |
| 2901 SetOperandAt(0, context); |
| 2902 SetOperandAt(1, value); |
| 2903 switch (op) { |
| 2904 case kFloat32x4OrInt32x4Change: |
| 2905 set_representation(to); |
| 2906 break; |
| 2907 case kSIMDAbs: |
| 2908 case kSIMDNeg: |
| 2909 case kSIMDReciprocal: |
| 2910 case kSIMDReciprocalSqrt: |
| 2911 case kSIMDSqrt: |
| 2912 case kSIMDBitsToFloat32x4: |
| 2913 case kSIMDToFloat32x4: |
| 2914 case kFloat32x4Splat: |
| 2915 set_representation(Representation::Float32x4()); |
| 2916 break; |
| 2917 case kSIMDBitsToInt32x4: |
| 2918 case kSIMDToInt32x4: |
| 2919 case kInt32x4Splat: |
| 2920 case kSIMDNegU32: |
| 2921 set_representation(Representation::Int32x4()); |
| 2922 type_ = HType::Int32x4(); |
| 2923 break; |
| 2924 case kFloat32x4SignMask: |
| 2925 case kInt32x4SignMask: |
| 2926 set_representation(Representation::Integer32()); |
| 2927 break; |
| 2928 case kFloat32x4X: |
| 2929 case kFloat32x4Y: |
| 2930 case kFloat32x4Z: |
| 2931 case kFloat32x4W: |
| 2932 set_representation(Representation::Double()); |
| 2933 break; |
| 2934 case kInt32x4X: |
| 2935 case kInt32x4Y: |
| 2936 case kInt32x4Z: |
| 2937 case kInt32x4W: |
| 2938 set_representation(Representation::Integer32()); |
| 2939 break; |
| 2940 case kInt32x4FlagX: |
| 2941 case kInt32x4FlagY: |
| 2942 case kInt32x4FlagZ: |
| 2943 case kInt32x4FlagW: |
| 2944 set_representation(Representation::Tagged()); |
| 2945 break; |
| 2946 default: |
| 2947 UNREACHABLE(); |
| 2948 } |
| 2949 SetFlag(kUseGVN); |
| 2950 } |
| 2951 |
| 2952 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
| 2953 |
| 2954 BuiltinFunctionId op_; |
| 2955 }; |
| 2956 |
| 2957 |
| 2958 class HBinarySIMDOperation V8_FINAL : public HTemplateInstruction<3> { |
| 2959 public: |
| 2960 static HInstruction* New(Zone* zone, |
| 2961 HValue* context, |
| 2962 HValue* left, |
| 2963 HValue* right, |
| 2964 BuiltinFunctionId op); |
| 2965 |
| 2966 HValue* context() { return OperandAt(0); } |
| 2967 HValue* left() { return OperandAt(1); } |
| 2968 HValue* right() { return OperandAt(2); } |
| 2969 |
| 2970 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
| 2971 |
| 2972 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
| 2973 if (index == 0) { |
| 2974 return Representation::Tagged(); |
| 2975 } else { |
| 2976 switch (op_) { |
| 2977 case kSIMDAdd: |
| 2978 case kSIMDSub: |
| 2979 case kSIMDMul: |
| 2980 case kSIMDDiv: |
| 2981 case kSIMDMin: |
| 2982 case kSIMDMax: |
| 2983 case kSIMDLessThan: |
| 2984 case kSIMDLessThanOrEqual: |
| 2985 case kSIMDEqual: |
| 2986 case kSIMDNotEqual: |
| 2987 case kSIMDGreaterThanOrEqual: |
| 2988 case kSIMDGreaterThan: |
| 2989 return Representation::Float32x4(); |
| 2990 case kSIMDAnd: |
| 2991 case kSIMDOr: |
| 2992 case kSIMDXor: |
| 2993 case kSIMDAddU32: |
| 2994 case kSIMDSubU32: |
| 2995 case kSIMDMulU32: |
| 2996 return Representation::Int32x4(); |
| 2997 case kSIMDShuffle: |
| 2998 return index == 1 ? Representation::Float32x4() |
| 2999 : Representation::Integer32(); |
| 3000 case kSIMDScale: |
| 3001 case kSIMDWithX: |
| 3002 case kSIMDWithY: |
| 3003 case kSIMDWithZ: |
| 3004 case kSIMDWithW: |
| 3005 return index == 1 ? Representation::Float32x4() |
| 3006 : Representation::Double(); |
| 3007 case kSIMDWithXu32: |
| 3008 case kSIMDWithYu32: |
| 3009 case kSIMDWithZu32: |
| 3010 case kSIMDWithWu32: |
| 3011 case kSIMDShuffleU32: |
| 3012 return index == 1 ? Representation::Int32x4() |
| 3013 : Representation::Integer32(); |
| 3014 case kSIMDWithFlagX: |
| 3015 case kSIMDWithFlagY: |
| 3016 case kSIMDWithFlagZ: |
| 3017 case kSIMDWithFlagW: |
| 3018 return index == 1 ? Representation::Int32x4() |
| 3019 : Representation::Tagged(); |
| 3020 default: |
| 3021 UNREACHABLE(); |
| 3022 return Representation::None(); |
| 3023 } |
| 3024 } |
| 3025 } |
| 3026 |
| 3027 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
| 3028 |
| 3029 virtual HValue* Canonicalize() V8_OVERRIDE; |
| 3030 virtual Representation RepresentationFromInputs() V8_OVERRIDE; |
| 3031 |
| 3032 BuiltinFunctionId op() const { return op_; } |
| 3033 const char* OpName() const; |
| 3034 |
| 3035 DECLARE_CONCRETE_INSTRUCTION(BinarySIMDOperation) |
| 3036 |
| 3037 protected: |
| 3038 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
| 3039 HBinarySIMDOperation* b = HBinarySIMDOperation::cast(other); |
| 3040 return op_ == b->op(); |
| 3041 } |
| 3042 |
| 3043 private: |
| 3044 HBinarySIMDOperation(HValue* context, HValue* left, HValue* right, |
| 3045 BuiltinFunctionId op) |
| 3046 : HTemplateInstruction<3>(HType::Float32x4()), op_(op) { |
| 3047 SetOperandAt(0, context); |
| 3048 SetOperandAt(1, left); |
| 3049 SetOperandAt(2, right); |
| 3050 switch (op) { |
| 3051 case kSIMDAdd: |
| 3052 case kSIMDSub: |
| 3053 case kSIMDMul: |
| 3054 case kSIMDDiv: |
| 3055 case kSIMDMin: |
| 3056 case kSIMDMax: |
| 3057 case kSIMDScale: |
| 3058 case kSIMDShuffle: |
| 3059 case kSIMDWithX: |
| 3060 case kSIMDWithY: |
| 3061 case kSIMDWithZ: |
| 3062 case kSIMDWithW: |
| 3063 set_representation(Representation::Float32x4()); |
| 3064 break; |
| 3065 case kSIMDAnd: |
| 3066 case kSIMDOr: |
| 3067 case kSIMDXor: |
| 3068 case kSIMDAddU32: |
| 3069 case kSIMDSubU32: |
| 3070 case kSIMDMulU32: |
| 3071 case kSIMDLessThan: |
| 3072 case kSIMDLessThanOrEqual: |
| 3073 case kSIMDEqual: |
| 3074 case kSIMDNotEqual: |
| 3075 case kSIMDGreaterThanOrEqual: |
| 3076 case kSIMDGreaterThan: |
| 3077 case kSIMDWithXu32: |
| 3078 case kSIMDWithYu32: |
| 3079 case kSIMDWithZu32: |
| 3080 case kSIMDWithWu32: |
| 3081 case kSIMDWithFlagX: |
| 3082 case kSIMDWithFlagY: |
| 3083 case kSIMDWithFlagZ: |
| 3084 case kSIMDWithFlagW: |
| 3085 case kSIMDShuffleU32: |
| 3086 set_representation(Representation::Int32x4()); |
| 3087 type_ = HType::Int32x4(); |
| 3088 break; |
| 3089 default: |
| 3090 UNREACHABLE(); |
| 3091 } |
| 3092 SetFlag(kUseGVN); |
| 3093 } |
| 3094 |
| 3095 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
| 3096 |
| 3097 BuiltinFunctionId op_; |
| 3098 }; |
| 3099 |
| 3100 |
| 3101 class HTernarySIMDOperation V8_FINAL : public HTemplateInstruction<4> { |
| 3102 public: |
| 3103 static HInstruction* New(Zone* zone, |
| 3104 HValue* context, |
| 3105 HValue* first, |
| 3106 HValue* second, |
| 3107 HValue* third, |
| 3108 BuiltinFunctionId op); |
| 3109 |
| 3110 HValue* context() { return OperandAt(0); } |
| 3111 HValue* first() { return OperandAt(1); } |
| 3112 HValue* second() { return OperandAt(2); } |
| 3113 HValue* third() { return OperandAt(3); } |
| 3114 |
| 3115 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
| 3116 |
| 3117 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
| 3118 if (index == 0) { |
| 3119 return Representation::Tagged(); |
| 3120 } else { |
| 3121 switch (op_) { |
| 3122 case kSIMDSelect: |
| 3123 switch (index) { |
| 3124 case 1: return Representation::Int32x4(); |
| 3125 case 2: return Representation::Float32x4(); |
| 3126 case 3: return Representation::Float32x4(); |
| 3127 default: |
| 3128 UNREACHABLE(); |
| 3129 return Representation::None(); |
| 3130 } |
| 3131 case kSIMDShuffleMix: |
| 3132 switch (index) { |
| 3133 case 1: return Representation::Float32x4(); |
| 3134 case 2: return Representation::Float32x4(); |
| 3135 case 3: return Representation::Integer32(); |
| 3136 default: |
| 3137 UNREACHABLE(); |
| 3138 return Representation::None(); |
| 3139 } |
| 3140 case kSIMDClamp: |
| 3141 return Representation::Float32x4(); |
| 3142 default: |
| 3143 UNREACHABLE(); |
| 3144 return Representation::None(); |
| 3145 } |
| 3146 } |
| 3147 } |
| 3148 |
| 3149 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
| 3150 |
| 3151 virtual HValue* Canonicalize() V8_OVERRIDE; |
| 3152 virtual Representation RepresentationFromInputs() V8_OVERRIDE; |
| 3153 |
| 3154 BuiltinFunctionId op() const { return op_; } |
| 3155 const char* OpName() const; |
| 3156 |
| 3157 DECLARE_CONCRETE_INSTRUCTION(TernarySIMDOperation) |
| 3158 |
| 3159 protected: |
| 3160 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
| 3161 HTernarySIMDOperation* b = HTernarySIMDOperation::cast(other); |
| 3162 return op_ == b->op(); |
| 3163 } |
| 3164 |
| 3165 private: |
| 3166 HTernarySIMDOperation(HValue* context, HValue* first, HValue* second, |
| 3167 HValue* third, BuiltinFunctionId op) |
| 3168 : HTemplateInstruction<4>(HType::Float32x4()), op_(op) { |
| 3169 SetOperandAt(0, context); |
| 3170 SetOperandAt(1, first); |
| 3171 SetOperandAt(2, second); |
| 3172 SetOperandAt(3, third); |
| 3173 switch (op) { |
| 3174 case kSIMDSelect: |
| 3175 case kSIMDShuffleMix: |
| 3176 case kSIMDClamp: |
| 3177 set_representation(Representation::Float32x4()); |
| 3178 break; |
| 3179 default: |
| 3180 UNREACHABLE(); |
| 3181 } |
| 3182 SetFlag(kUseGVN); |
| 3183 } |
| 3184 |
| 3185 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
| 3186 |
| 3187 BuiltinFunctionId op_; |
| 3188 }; |
| 3189 |
| 3190 |
| 3191 class HQuarternarySIMDOperation V8_FINAL : public HTemplateInstruction<5> { |
| 3192 public: |
| 3193 static HInstruction* New(Zone* zone, |
| 3194 HValue* context, |
| 3195 HValue* x, |
| 3196 HValue* y, |
| 3197 HValue* z, |
| 3198 HValue* w, |
| 3199 BuiltinFunctionId op); |
| 3200 |
| 3201 HValue* context() { return OperandAt(0); } |
| 3202 HValue* x() { return OperandAt(1); } |
| 3203 HValue* y() { return OperandAt(2); } |
| 3204 HValue* z() { return OperandAt(3); } |
| 3205 HValue* w() { return OperandAt(4); } |
| 3206 |
| 3207 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
| 3208 |
| 3209 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
| 3210 if (index == 0) { |
| 3211 return Representation::Tagged(); |
| 3212 } else { |
| 3213 switch (op_) { |
| 3214 case kFloat32x4Constructor: return Representation::Double(); |
| 3215 case kInt32x4Constructor: |
| 3216 return Representation::Integer32(); |
| 3217 case kInt32x4Bool: |
| 3218 return Representation::Tagged(); |
| 3219 default: |
| 3220 UNREACHABLE(); |
| 3221 return Representation::None(); |
| 3222 } |
| 3223 } |
| 3224 } |
| 3225 |
| 3226 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
| 3227 |
| 3228 virtual HValue* Canonicalize() V8_OVERRIDE; |
| 3229 virtual Representation RepresentationFromInputs() V8_OVERRIDE; |
| 3230 |
| 3231 BuiltinFunctionId op() const { return op_; } |
| 3232 const char* OpName() const; |
| 3233 |
| 3234 DECLARE_CONCRETE_INSTRUCTION(QuarternarySIMDOperation) |
| 3235 |
| 3236 protected: |
| 3237 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
| 3238 HQuarternarySIMDOperation* b = HQuarternarySIMDOperation::cast(other); |
| 3239 return op_ == b->op(); |
| 3240 } |
| 3241 |
| 3242 private: |
| 3243 HQuarternarySIMDOperation(HValue* context, HValue* x, HValue* y, HValue* z, |
| 3244 HValue* w, BuiltinFunctionId op) |
| 3245 : HTemplateInstruction<5>(HType::Float32x4()), op_(op) { |
| 3246 SetOperandAt(0, context); |
| 3247 SetOperandAt(1, x); |
| 3248 SetOperandAt(2, y); |
| 3249 SetOperandAt(3, z); |
| 3250 SetOperandAt(4, w); |
| 3251 switch (op) { |
| 3252 case kFloat32x4Constructor: |
| 3253 set_representation(Representation::Float32x4()); |
| 3254 break; |
| 3255 case kInt32x4Constructor: |
| 3256 case kInt32x4Bool: |
| 3257 set_representation(Representation::Int32x4()); |
| 3258 type_ = HType::Int32x4(); |
| 3259 break; |
| 3260 default: |
| 3261 UNREACHABLE(); |
| 3262 } |
| 3263 SetFlag(kUseGVN); |
| 3264 } |
| 3265 |
| 3266 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
| 3267 |
| 3268 BuiltinFunctionId op_; |
| 3269 }; |
| 3270 |
| 3271 |
2747 class HLoadExternalArrayPointer V8_FINAL : public HUnaryOperation { | 3272 class HLoadExternalArrayPointer V8_FINAL : public HUnaryOperation { |
2748 public: | 3273 public: |
2749 DECLARE_INSTRUCTION_FACTORY_P1(HLoadExternalArrayPointer, HValue*); | 3274 DECLARE_INSTRUCTION_FACTORY_P1(HLoadExternalArrayPointer, HValue*); |
2750 | 3275 |
2751 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 3276 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
2752 return Representation::Tagged(); | 3277 return Representation::Tagged(); |
2753 } | 3278 } |
2754 | 3279 |
2755 virtual HType CalculateInferredType() V8_OVERRIDE { | 3280 virtual HType CalculateInferredType() V8_OVERRIDE { |
2756 return HType::None(); | 3281 return HType::None(); |
(...skipping 1847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4604 Handle<String> class_name_; | 5129 Handle<String> class_name_; |
4605 }; | 5130 }; |
4606 | 5131 |
4607 | 5132 |
4608 class HTypeofIsAndBranch V8_FINAL : public HUnaryControlInstruction { | 5133 class HTypeofIsAndBranch V8_FINAL : public HUnaryControlInstruction { |
4609 public: | 5134 public: |
4610 DECLARE_INSTRUCTION_FACTORY_P2(HTypeofIsAndBranch, HValue*, Handle<String>); | 5135 DECLARE_INSTRUCTION_FACTORY_P2(HTypeofIsAndBranch, HValue*, Handle<String>); |
4611 | 5136 |
4612 Handle<String> type_literal() { return type_literal_; } | 5137 Handle<String> type_literal() { return type_literal_; } |
4613 bool compares_number_type() { return compares_number_type_; } | 5138 bool compares_number_type() { return compares_number_type_; } |
| 5139 bool compares_float32x4_type() { return compares_float32x4_type_; } |
| 5140 bool compares_int32x4_type() { return compares_int32x4_type_; } |
4614 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5141 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
4615 | 5142 |
4616 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) | 5143 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) |
4617 | 5144 |
4618 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5145 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4619 return Representation::None(); | 5146 return Representation::None(); |
4620 } | 5147 } |
4621 | 5148 |
4622 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; | 5149 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
4623 | 5150 |
4624 private: | 5151 private: |
4625 HTypeofIsAndBranch(HValue* value, Handle<String> type_literal) | 5152 HTypeofIsAndBranch(HValue* value, Handle<String> type_literal) |
4626 : HUnaryControlInstruction(value, NULL, NULL), | 5153 : HUnaryControlInstruction(value, NULL, NULL), |
4627 type_literal_(type_literal) { | 5154 type_literal_(type_literal) { |
4628 Heap* heap = type_literal->GetHeap(); | 5155 Heap* heap = type_literal->GetHeap(); |
4629 compares_number_type_ = type_literal->Equals(heap->number_string()); | 5156 compares_number_type_ = type_literal->Equals(heap->number_string()); |
| 5157 compares_float32x4_type_ = type_literal->Equals(heap->float32x4_string()); |
| 5158 compares_int32x4_type_ = type_literal->Equals(heap->int32x4_string()); |
4630 } | 5159 } |
4631 | 5160 |
4632 Handle<String> type_literal_; | 5161 Handle<String> type_literal_; |
4633 bool compares_number_type_ : 1; | 5162 bool compares_number_type_ : 1; |
| 5163 bool compares_float32x4_type_ : 1; |
| 5164 bool compares_int32x4_type_ : 1; |
4634 }; | 5165 }; |
4635 | 5166 |
4636 | 5167 |
4637 class HInstanceOf V8_FINAL : public HBinaryOperation { | 5168 class HInstanceOf V8_FINAL : public HBinaryOperation { |
4638 public: | 5169 public: |
4639 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOf, HValue*, HValue*); | 5170 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOf, HValue*, HValue*); |
4640 | 5171 |
4641 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 5172 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
4642 return Representation::Tagged(); | 5173 return Representation::Tagged(); |
4643 } | 5174 } |
(...skipping 1379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6023 Map::kInstanceSizeOffset, | 6554 Map::kInstanceSizeOffset, |
6024 Representation::UInteger8()); | 6555 Representation::UInteger8()); |
6025 } | 6556 } |
6026 | 6557 |
6027 static HObjectAccess ForMapInstanceType() { | 6558 static HObjectAccess ForMapInstanceType() { |
6028 return HObjectAccess(kInobject, | 6559 return HObjectAccess(kInobject, |
6029 Map::kInstanceTypeOffset, | 6560 Map::kInstanceTypeOffset, |
6030 Representation::UInteger8()); | 6561 Representation::UInteger8()); |
6031 } | 6562 } |
6032 | 6563 |
| 6564 static HObjectAccess ForMapPrototype() { |
| 6565 return HObjectAccess(kInobject, Map::kPrototypeOffset); |
| 6566 } |
| 6567 |
6033 static HObjectAccess ForPropertyCellValue() { | 6568 static HObjectAccess ForPropertyCellValue() { |
6034 return HObjectAccess(kInobject, PropertyCell::kValueOffset); | 6569 return HObjectAccess(kInobject, PropertyCell::kValueOffset); |
6035 } | 6570 } |
6036 | 6571 |
6037 static HObjectAccess ForCellValue() { | 6572 static HObjectAccess ForCellValue() { |
6038 return HObjectAccess(kInobject, Cell::kValueOffset); | 6573 return HObjectAccess(kInobject, Cell::kValueOffset); |
6039 } | 6574 } |
6040 | 6575 |
6041 static HObjectAccess ForAllocationMementoSite() { | 6576 static HObjectAccess ForAllocationMementoSite() { |
6042 return HObjectAccess(kInobject, AllocationMemento::kAllocationSiteOffset); | 6577 return HObjectAccess(kInobject, AllocationMemento::kAllocationSiteOffset); |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6410 | 6945 |
6411 SetGVNFlag(kDependsOnArrayElements); | 6946 SetGVNFlag(kDependsOnArrayElements); |
6412 } else { | 6947 } else { |
6413 set_representation(Representation::Double()); | 6948 set_representation(Representation::Double()); |
6414 SetGVNFlag(kDependsOnDoubleArrayElements); | 6949 SetGVNFlag(kDependsOnDoubleArrayElements); |
6415 } | 6950 } |
6416 } else { | 6951 } else { |
6417 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || | 6952 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
6418 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { | 6953 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
6419 set_representation(Representation::Double()); | 6954 set_representation(Representation::Double()); |
| 6955 } else if (elements_kind == EXTERNAL_FLOAT32x4_ELEMENTS) { |
| 6956 set_representation(CpuFeatures::IsSupported(SSE2) ? |
| 6957 Representation::Float32x4() : Representation::Tagged()); |
| 6958 } else if (elements_kind == EXTERNAL_INT32x4_ELEMENTS) { |
| 6959 set_representation(CpuFeatures::IsSupported(SSE2) ? |
| 6960 Representation::Int32x4() : Representation::Tagged()); |
6420 } else { | 6961 } else { |
6421 set_representation(Representation::Integer32()); | 6962 set_representation(Representation::Integer32()); |
6422 } | 6963 } |
6423 | 6964 |
6424 SetGVNFlag(kDependsOnExternalMemory); | 6965 SetGVNFlag(kDependsOnExternalMemory); |
6425 // Native code could change the specialized array. | 6966 // Native code could change the specialized array. |
6426 SetGVNFlag(kDependsOnCalls); | 6967 SetGVNFlag(kDependsOnCalls); |
6427 } | 6968 } |
6428 | 6969 |
6429 SetFlag(kUseGVN); | 6970 SetFlag(kUseGVN); |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6664 // kind_external: external[int32] = (double | int32) | 7205 // kind_external: external[int32] = (double | int32) |
6665 if (index == 0) { | 7206 if (index == 0) { |
6666 return is_external() ? Representation::External() | 7207 return is_external() ? Representation::External() |
6667 : Representation::Tagged(); | 7208 : Representation::Tagged(); |
6668 } else if (index == 1) { | 7209 } else if (index == 1) { |
6669 return ArrayInstructionInterface::KeyedAccessIndexRequirement( | 7210 return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
6670 OperandAt(1)->representation()); | 7211 OperandAt(1)->representation()); |
6671 } | 7212 } |
6672 | 7213 |
6673 ASSERT_EQ(index, 2); | 7214 ASSERT_EQ(index, 2); |
| 7215 |
6674 if (IsDoubleOrFloatElementsKind(elements_kind())) { | 7216 if (IsDoubleOrFloatElementsKind(elements_kind())) { |
6675 return Representation::Double(); | 7217 return Representation::Double(); |
6676 } | 7218 } |
6677 | 7219 |
| 7220 if (IsExternalFloat32x4ElementsKind(elements_kind())) { |
| 7221 return CpuFeatures::IsSupported(SSE2) ? |
| 7222 Representation::Float32x4() : Representation::Tagged(); |
| 7223 } |
| 7224 |
| 7225 if (IsExternalInt32x4ElementsKind(elements_kind())) { |
| 7226 return CpuFeatures::IsSupported(SSE2) ? |
| 7227 Representation::Int32x4() : Representation::Tagged(); |
| 7228 } |
| 7229 |
6678 if (IsFastSmiElementsKind(elements_kind())) { | 7230 if (IsFastSmiElementsKind(elements_kind())) { |
6679 return Representation::Smi(); | 7231 return Representation::Smi(); |
6680 } | 7232 } |
6681 | 7233 |
6682 return is_external() ? Representation::Integer32() | 7234 return is_external() ? Representation::Integer32() |
6683 : Representation::Tagged(); | 7235 : Representation::Tagged(); |
6684 } | 7236 } |
6685 | 7237 |
6686 bool is_external() const { | 7238 bool is_external() const { |
6687 return IsExternalArrayElementsKind(elements_kind()); | 7239 return IsExternalArrayElementsKind(elements_kind()); |
6688 } | 7240 } |
6689 | 7241 |
6690 virtual Representation observed_input_representation(int index) V8_OVERRIDE { | 7242 virtual Representation observed_input_representation(int index) V8_OVERRIDE { |
6691 if (index < 2) return RequiredInputRepresentation(index); | 7243 if (index < 2) return RequiredInputRepresentation(index); |
6692 if (IsUninitialized()) { | 7244 if (IsUninitialized()) { |
6693 return Representation::None(); | 7245 return Representation::None(); |
6694 } | 7246 } |
6695 if (IsFastSmiElementsKind(elements_kind())) { | 7247 if (IsFastSmiElementsKind(elements_kind())) { |
6696 return Representation::Smi(); | 7248 return Representation::Smi(); |
6697 } | 7249 } |
6698 if (IsDoubleOrFloatElementsKind(elements_kind())) { | 7250 if (IsDoubleOrFloatElementsKind(elements_kind())) { |
6699 return Representation::Double(); | 7251 return Representation::Double(); |
6700 } | 7252 } |
| 7253 if (IsExternalFloat32x4ElementsKind(elements_kind())) { |
| 7254 return CpuFeatures::IsSupported(SSE2) ? |
| 7255 Representation::Float32x4() : Representation::Tagged(); |
| 7256 } |
| 7257 if (IsExternalInt32x4ElementsKind(elements_kind())) { |
| 7258 return CpuFeatures::IsSupported(SSE2) ? |
| 7259 Representation::Int32x4() : Representation::Tagged(); |
| 7260 } |
6701 if (is_external()) { | 7261 if (is_external()) { |
6702 return Representation::Integer32(); | 7262 return Representation::Integer32(); |
6703 } | 7263 } |
6704 // For fast object elements kinds, don't assume anything. | 7264 // For fast object elements kinds, don't assume anything. |
6705 return Representation::None(); | 7265 return Representation::None(); |
6706 } | 7266 } |
6707 | 7267 |
6708 HValue* elements() { return OperandAt(0); } | 7268 HValue* elements() { return OperandAt(0); } |
6709 HValue* key() { return OperandAt(1); } | 7269 HValue* key() { return OperandAt(1); } |
6710 HValue* value() { return OperandAt(2); } | 7270 HValue* value() { return OperandAt(2); } |
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7473 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 8033 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
7474 }; | 8034 }; |
7475 | 8035 |
7476 | 8036 |
7477 #undef DECLARE_INSTRUCTION | 8037 #undef DECLARE_INSTRUCTION |
7478 #undef DECLARE_CONCRETE_INSTRUCTION | 8038 #undef DECLARE_CONCRETE_INSTRUCTION |
7479 | 8039 |
7480 } } // namespace v8::internal | 8040 } } // namespace v8::internal |
7481 | 8041 |
7482 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 8042 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |