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 |
11 // with the distribution. | 11 // with the distribution. |
12 // * Neither the name of Google Inc. nor the names of its | 12 // * Neither the name of Google Inc. nor the names of its |
13 // contributors may be used to endorse or promote products derived | 13 // contributors may be used to endorse or promote products derived |
14 // from this software without specific prior written permission. | 14 // from this software without specific prior written permission. |
15 // | 15 // |
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 #include "v8.h" | 28 #include "v8.h" |
29 | 29 |
| 30 #include "double.h" |
30 #include "factory.h" | 31 #include "factory.h" |
31 #include "hydrogen.h" | 32 #include "hydrogen.h" |
32 | 33 |
33 #if V8_TARGET_ARCH_IA32 | 34 #if V8_TARGET_ARCH_IA32 |
34 #include "ia32/lithium-ia32.h" | 35 #include "ia32/lithium-ia32.h" |
35 #elif V8_TARGET_ARCH_X64 | 36 #elif V8_TARGET_ARCH_X64 |
36 #include "x64/lithium-x64.h" | 37 #include "x64/lithium-x64.h" |
37 #elif V8_TARGET_ARCH_ARM | 38 #elif V8_TARGET_ARCH_ARM |
38 #include "arm/lithium-arm.h" | 39 #include "arm/lithium-arm.h" |
39 #elif V8_TARGET_ARCH_MIPS | 40 #elif V8_TARGET_ARCH_MIPS |
(...skipping 2704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2744 | 2745 |
2745 | 2746 |
2746 #define H_CONSTANT_INT32(val) \ | 2747 #define H_CONSTANT_INT32(val) \ |
2747 new(zone) HConstant(FACTORY->NewNumberFromInt(val, TENURED), \ | 2748 new(zone) HConstant(FACTORY->NewNumberFromInt(val, TENURED), \ |
2748 Representation::Integer32()) | 2749 Representation::Integer32()) |
2749 #define H_CONSTANT_DOUBLE(val) \ | 2750 #define H_CONSTANT_DOUBLE(val) \ |
2750 new(zone) HConstant(FACTORY->NewNumber(val, TENURED), \ | 2751 new(zone) HConstant(FACTORY->NewNumber(val, TENURED), \ |
2751 Representation::Double()) | 2752 Representation::Double()) |
2752 | 2753 |
2753 #define DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HInstr, op) \ | 2754 #define DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HInstr, op) \ |
2754 HInstruction* HInstr::New##HInstr(Zone* zone, \ | 2755 HInstruction* HInstr::New( \ |
2755 HValue* context, \ | 2756 Zone* zone, HValue* context, HValue* left, HValue* right) { \ |
2756 HValue* left, \ | 2757 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { \ |
2757 HValue* right) { \ | |
2758 if (left->IsConstant() && right->IsConstant()) { \ | |
2759 HConstant* c_left = HConstant::cast(left); \ | 2758 HConstant* c_left = HConstant::cast(left); \ |
2760 HConstant* c_right = HConstant::cast(right); \ | 2759 HConstant* c_right = HConstant::cast(right); \ |
2761 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \ | 2760 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \ |
2762 double double_res = c_left->DoubleValue() op c_right->DoubleValue(); \ | 2761 double double_res = c_left->DoubleValue() op c_right->DoubleValue(); \ |
2763 if (TypeInfo::IsInt32Double(double_res)) { \ | 2762 if (TypeInfo::IsInt32Double(double_res)) { \ |
2764 return H_CONSTANT_INT32(static_cast<int32_t>(double_res)); \ | 2763 return H_CONSTANT_INT32(static_cast<int32_t>(double_res)); \ |
2765 } \ | 2764 } \ |
2766 return H_CONSTANT_DOUBLE(double_res); \ | 2765 return H_CONSTANT_DOUBLE(double_res); \ |
2767 } \ | 2766 } \ |
2768 } \ | 2767 } \ |
2769 return new(zone) HInstr(context, left, right); \ | 2768 return new(zone) HInstr(context, left, right); \ |
2770 } | 2769 } |
2771 | 2770 |
2772 | 2771 |
2773 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HAdd, +) | 2772 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HAdd, +) |
2774 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HMul, *) | 2773 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HMul, *) |
2775 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HSub, -) | 2774 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HSub, -) |
2776 | 2775 |
2777 #undef DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR | 2776 #undef DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR |
2778 | 2777 |
2779 | 2778 |
2780 HInstruction* HMod::NewHMod(Zone* zone, | 2779 HInstruction* HStringAdd::New( |
2781 HValue* context, | 2780 Zone* zone, HValue* context, HValue* left, HValue* right) { |
2782 HValue* left, | 2781 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { |
2783 HValue* right) { | 2782 HConstant* c_right = HConstant::cast(right); |
2784 if (left->IsConstant() && right->IsConstant()) { | 2783 HConstant* c_left = HConstant::cast(left); |
| 2784 if (c_left->HasStringValue() && c_right->HasStringValue()) { |
| 2785 return new(zone) HConstant(FACTORY->NewConsString(c_left->StringValue(), |
| 2786 c_right->StringValue()), |
| 2787 Representation::Tagged()); |
| 2788 } |
| 2789 } |
| 2790 return new(zone) HStringAdd(context, left, right); |
| 2791 } |
| 2792 |
| 2793 |
| 2794 HInstruction* HStringCharFromCode::New( |
| 2795 Zone* zone, HValue* context, HValue* char_code) { |
| 2796 if (FLAG_fold_constants && char_code->IsConstant()) { |
| 2797 HConstant* c_code = HConstant::cast(char_code); |
| 2798 if (c_code->HasNumberValue()) { |
| 2799 if (isfinite(c_code->DoubleValue())) { |
| 2800 uint32_t code = c_code->NumberValueAsInteger32() & 0xffff; |
| 2801 return new(zone) HConstant(LookupSingleCharacterStringFromCode(code), |
| 2802 Representation::Tagged()); |
| 2803 } |
| 2804 return new(zone) HConstant(FACTORY->empty_string(), |
| 2805 Representation::Tagged()); |
| 2806 } |
| 2807 } |
| 2808 return new(zone) HStringCharFromCode(context, char_code); |
| 2809 } |
| 2810 |
| 2811 |
| 2812 HInstruction* HStringLength::New(Zone* zone, HValue* string) { |
| 2813 if (FLAG_fold_constants && string->IsConstant()) { |
| 2814 HConstant* c_string = HConstant::cast(string); |
| 2815 if (c_string->HasStringValue()) { |
| 2816 return H_CONSTANT_INT32(c_string->StringValue()->length()); |
| 2817 } |
| 2818 } |
| 2819 return new(zone) HStringLength(string); |
| 2820 } |
| 2821 |
| 2822 |
| 2823 HInstruction* HUnaryMathOperation::New( |
| 2824 Zone* zone, HValue* context, HValue* value, BuiltinFunctionId op) { |
| 2825 do { |
| 2826 if (!FLAG_fold_constants) break; |
| 2827 if (!value->IsConstant()) break; |
| 2828 HConstant* constant = HConstant::cast(value); |
| 2829 if (!constant->HasNumberValue()) break; |
| 2830 double d = constant->DoubleValue(); |
| 2831 if (isnan(d)) { // NaN poisons everything. |
| 2832 return H_CONSTANT_DOUBLE(OS::nan_value()); |
| 2833 } |
| 2834 if (isinf(d)) { // +Infinity and -Infinity. |
| 2835 switch (op) { |
| 2836 case kMathSin: |
| 2837 case kMathCos: |
| 2838 case kMathTan: |
| 2839 return H_CONSTANT_DOUBLE(OS::nan_value()); |
| 2840 case kMathExp: |
| 2841 return H_CONSTANT_DOUBLE((d > 0.0) ? d : 0.0); |
| 2842 case kMathLog: |
| 2843 case kMathSqrt: |
| 2844 return H_CONSTANT_DOUBLE((d > 0.0) ? d : OS::nan_value()); |
| 2845 case kMathPowHalf: |
| 2846 case kMathAbs: |
| 2847 return H_CONSTANT_DOUBLE((d > 0.0) ? d : -d); |
| 2848 case kMathRound: |
| 2849 case kMathFloor: |
| 2850 return H_CONSTANT_DOUBLE(d); |
| 2851 default: |
| 2852 UNREACHABLE(); |
| 2853 break; |
| 2854 } |
| 2855 } |
| 2856 switch (op) { |
| 2857 case kMathSin: |
| 2858 return H_CONSTANT_DOUBLE(fast_sin(d)); |
| 2859 case kMathCos: |
| 2860 return H_CONSTANT_DOUBLE(fast_cos(d)); |
| 2861 case kMathTan: |
| 2862 return H_CONSTANT_DOUBLE(fast_tan(d)); |
| 2863 case kMathExp: |
| 2864 return H_CONSTANT_DOUBLE(fast_exp(d)); |
| 2865 case kMathLog: |
| 2866 return H_CONSTANT_DOUBLE(fast_log(d)); |
| 2867 case kMathSqrt: |
| 2868 return H_CONSTANT_DOUBLE(fast_sqrt(d)); |
| 2869 case kMathPowHalf: |
| 2870 return H_CONSTANT_DOUBLE(power_double_double(d, 0.5)); |
| 2871 case kMathAbs: |
| 2872 return H_CONSTANT_DOUBLE((d >= 0.0) ? d + 0.0 : -d); |
| 2873 case kMathRound: |
| 2874 // -0.5 .. -0.0 round to -0.0. |
| 2875 if ((d >= -0.5 && Double(d).Sign() < 0)) return H_CONSTANT_DOUBLE(-0.0); |
| 2876 // Doubles are represented as Significant * 2 ^ Exponent. If the |
| 2877 // Exponent is not negative, the double value is already an integer. |
| 2878 if (Double(d).Exponent() >= 0) return H_CONSTANT_DOUBLE(d); |
| 2879 return H_CONSTANT_DOUBLE(floor(d + 0.5)); |
| 2880 case kMathFloor: |
| 2881 return H_CONSTANT_DOUBLE(floor(d)); |
| 2882 default: |
| 2883 UNREACHABLE(); |
| 2884 break; |
| 2885 } |
| 2886 } while (false); |
| 2887 return new(zone) HUnaryMathOperation(context, value, op); |
| 2888 } |
| 2889 |
| 2890 |
| 2891 HInstruction* HPower::New(Zone* zone, HValue* left, HValue* right) { |
| 2892 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { |
| 2893 HConstant* c_left = HConstant::cast(left); |
| 2894 HConstant* c_right = HConstant::cast(right); |
| 2895 if (c_left->HasNumberValue() && c_right->HasNumberValue()) { |
| 2896 double result = power_helper(c_left->DoubleValue(), |
| 2897 c_right->DoubleValue()); |
| 2898 return H_CONSTANT_DOUBLE(isnan(result) ? OS::nan_value() : result); |
| 2899 } |
| 2900 } |
| 2901 return new(zone) HPower(left, right); |
| 2902 } |
| 2903 |
| 2904 |
| 2905 HInstruction* HMathMinMax::New( |
| 2906 Zone* zone, HValue* context, HValue* left, HValue* right, Operation op) { |
| 2907 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { |
| 2908 HConstant* c_left = HConstant::cast(left); |
| 2909 HConstant* c_right = HConstant::cast(right); |
| 2910 if (c_left->HasNumberValue() && c_right->HasNumberValue()) { |
| 2911 double d_left = c_left->DoubleValue(); |
| 2912 double d_right = c_right->DoubleValue(); |
| 2913 if (op == kMathMin) { |
| 2914 if (d_left > d_right) return H_CONSTANT_DOUBLE(d_right); |
| 2915 if (d_left < d_right) return H_CONSTANT_DOUBLE(d_left); |
| 2916 if (d_left == d_right) { |
| 2917 // Handle +0 and -0. |
| 2918 return H_CONSTANT_DOUBLE((Double(d_left).Sign() == -1) ? d_left |
| 2919 : d_right); |
| 2920 } |
| 2921 } else { |
| 2922 if (d_left < d_right) return H_CONSTANT_DOUBLE(d_right); |
| 2923 if (d_left > d_right) return H_CONSTANT_DOUBLE(d_left); |
| 2924 if (d_left == d_right) { |
| 2925 // Handle +0 and -0. |
| 2926 return H_CONSTANT_DOUBLE((Double(d_left).Sign() == -1) ? d_right |
| 2927 : d_left); |
| 2928 } |
| 2929 } |
| 2930 // All comparisons failed, must be NaN. |
| 2931 return H_CONSTANT_DOUBLE(OS::nan_value()); |
| 2932 } |
| 2933 } |
| 2934 return new(zone) HMathMinMax(context, left, right, op); |
| 2935 } |
| 2936 |
| 2937 |
| 2938 HInstruction* HMod::New( |
| 2939 Zone* zone, HValue* context, HValue* left, HValue* right) { |
| 2940 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { |
2785 HConstant* c_left = HConstant::cast(left); | 2941 HConstant* c_left = HConstant::cast(left); |
2786 HConstant* c_right = HConstant::cast(right); | 2942 HConstant* c_right = HConstant::cast(right); |
2787 if (c_left->HasInteger32Value() && c_right->HasInteger32Value()) { | 2943 if (c_left->HasInteger32Value() && c_right->HasInteger32Value()) { |
2788 int32_t dividend = c_left->Integer32Value(); | 2944 int32_t dividend = c_left->Integer32Value(); |
2789 int32_t divisor = c_right->Integer32Value(); | 2945 int32_t divisor = c_right->Integer32Value(); |
2790 if (divisor != 0) { | 2946 if (divisor != 0) { |
2791 int32_t res = dividend % divisor; | 2947 int32_t res = dividend % divisor; |
2792 if ((res == 0) && (dividend < 0)) { | 2948 if ((res == 0) && (dividend < 0)) { |
2793 return H_CONSTANT_DOUBLE(-0.0); | 2949 return H_CONSTANT_DOUBLE(-0.0); |
2794 } | 2950 } |
2795 return H_CONSTANT_INT32(res); | 2951 return H_CONSTANT_INT32(res); |
2796 } | 2952 } |
2797 } | 2953 } |
2798 } | 2954 } |
2799 return new(zone) HMod(context, left, right); | 2955 return new(zone) HMod(context, left, right); |
2800 } | 2956 } |
2801 | 2957 |
2802 | 2958 |
2803 HInstruction* HDiv::NewHDiv(Zone* zone, | 2959 HInstruction* HDiv::New( |
2804 HValue* context, | 2960 Zone* zone, HValue* context, HValue* left, HValue* right) { |
2805 HValue* left, | |
2806 HValue* right) { | |
2807 // If left and right are constant values, try to return a constant value. | 2961 // If left and right are constant values, try to return a constant value. |
2808 if (left->IsConstant() && right->IsConstant()) { | 2962 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { |
2809 HConstant* c_left = HConstant::cast(left); | 2963 HConstant* c_left = HConstant::cast(left); |
2810 HConstant* c_right = HConstant::cast(right); | 2964 HConstant* c_right = HConstant::cast(right); |
2811 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { | 2965 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { |
2812 if (c_right->DoubleValue() != 0) { | 2966 if (c_right->DoubleValue() != 0) { |
2813 double double_res = c_left->DoubleValue() / c_right->DoubleValue(); | 2967 double double_res = c_left->DoubleValue() / c_right->DoubleValue(); |
2814 if (TypeInfo::IsInt32Double(double_res)) { | 2968 if (TypeInfo::IsInt32Double(double_res)) { |
2815 return H_CONSTANT_INT32(static_cast<int32_t>(double_res)); | 2969 return H_CONSTANT_INT32(static_cast<int32_t>(double_res)); |
2816 } | 2970 } |
2817 return H_CONSTANT_DOUBLE(double_res); | 2971 return H_CONSTANT_DOUBLE(double_res); |
| 2972 } else { |
| 2973 int sign = Double(c_left->DoubleValue()).Sign() * |
| 2974 Double(c_right->DoubleValue()).Sign(); // Right could be -0. |
| 2975 return H_CONSTANT_DOUBLE(sign * V8_INFINITY); |
2818 } | 2976 } |
2819 } | 2977 } |
2820 } | 2978 } |
2821 return new(zone) HDiv(context, left, right); | 2979 return new(zone) HDiv(context, left, right); |
2822 } | 2980 } |
2823 | 2981 |
2824 | 2982 |
2825 HInstruction* HBitwise::NewHBitwise(Zone* zone, | 2983 HInstruction* HBitwise::New( |
2826 Token::Value op, | 2984 Zone* zone, Token::Value op, HValue* context, HValue* left, HValue* right) { |
2827 HValue* context, | 2985 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { |
2828 HValue* left, | |
2829 HValue* right) { | |
2830 if (left->IsConstant() && right->IsConstant()) { | |
2831 HConstant* c_left = HConstant::cast(left); | 2986 HConstant* c_left = HConstant::cast(left); |
2832 HConstant* c_right = HConstant::cast(right); | 2987 HConstant* c_right = HConstant::cast(right); |
2833 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { | 2988 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { |
2834 int32_t result; | 2989 int32_t result; |
2835 int32_t v_left = c_left->NumberValueAsInteger32(); | 2990 int32_t v_left = c_left->NumberValueAsInteger32(); |
2836 int32_t v_right = c_right->NumberValueAsInteger32(); | 2991 int32_t v_right = c_right->NumberValueAsInteger32(); |
2837 switch (op) { | 2992 switch (op) { |
2838 case Token::BIT_XOR: | 2993 case Token::BIT_XOR: |
2839 result = v_left ^ v_right; | 2994 result = v_left ^ v_right; |
2840 break; | 2995 break; |
2841 case Token::BIT_AND: | 2996 case Token::BIT_AND: |
2842 result = v_left & v_right; | 2997 result = v_left & v_right; |
2843 break; | 2998 break; |
2844 case Token::BIT_OR: | 2999 case Token::BIT_OR: |
2845 result = v_left | v_right; | 3000 result = v_left | v_right; |
2846 break; | 3001 break; |
2847 default: | 3002 default: |
2848 result = 0; // Please the compiler. | 3003 result = 0; // Please the compiler. |
2849 UNREACHABLE(); | 3004 UNREACHABLE(); |
2850 } | 3005 } |
2851 return H_CONSTANT_INT32(result); | 3006 return H_CONSTANT_INT32(result); |
2852 } | 3007 } |
2853 } | 3008 } |
2854 return new(zone) HBitwise(op, context, left, right); | 3009 return new(zone) HBitwise(op, context, left, right); |
2855 } | 3010 } |
2856 | 3011 |
2857 | 3012 |
2858 #define DEFINE_NEW_H_BITWISE_INSTR(HInstr, result) \ | 3013 #define DEFINE_NEW_H_BITWISE_INSTR(HInstr, result) \ |
2859 HInstruction* HInstr::New##HInstr(Zone* zone, \ | 3014 HInstruction* HInstr::New( \ |
2860 HValue* context, \ | 3015 Zone* zone, HValue* context, HValue* left, HValue* right) { \ |
2861 HValue* left, \ | 3016 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { \ |
2862 HValue* right) { \ | |
2863 if (left->IsConstant() && right->IsConstant()) { \ | |
2864 HConstant* c_left = HConstant::cast(left); \ | 3017 HConstant* c_left = HConstant::cast(left); \ |
2865 HConstant* c_right = HConstant::cast(right); \ | 3018 HConstant* c_right = HConstant::cast(right); \ |
2866 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \ | 3019 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \ |
2867 return H_CONSTANT_INT32(result); \ | 3020 return H_CONSTANT_INT32(result); \ |
2868 } \ | 3021 } \ |
2869 } \ | 3022 } \ |
2870 return new(zone) HInstr(context, left, right); \ | 3023 return new(zone) HInstr(context, left, right); \ |
2871 } | 3024 } |
2872 | 3025 |
2873 | 3026 |
2874 DEFINE_NEW_H_BITWISE_INSTR(HSar, | 3027 DEFINE_NEW_H_BITWISE_INSTR(HSar, |
2875 c_left->NumberValueAsInteger32() >> (c_right->NumberValueAsInteger32() & 0x1f)) | 3028 c_left->NumberValueAsInteger32() >> (c_right->NumberValueAsInteger32() & 0x1f)) |
2876 DEFINE_NEW_H_BITWISE_INSTR(HShl, | 3029 DEFINE_NEW_H_BITWISE_INSTR(HShl, |
2877 c_left->NumberValueAsInteger32() << (c_right->NumberValueAsInteger32() & 0x1f)) | 3030 c_left->NumberValueAsInteger32() << (c_right->NumberValueAsInteger32() & 0x1f)) |
2878 | 3031 |
2879 #undef DEFINE_NEW_H_BITWISE_INSTR | 3032 #undef DEFINE_NEW_H_BITWISE_INSTR |
2880 | 3033 |
2881 | 3034 |
2882 HInstruction* HShr::NewHShr(Zone* zone, | 3035 HInstruction* HShr::New( |
2883 HValue* context, | 3036 Zone* zone, HValue* context, HValue* left, HValue* right) { |
2884 HValue* left, | 3037 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { |
2885 HValue* right) { | |
2886 if (left->IsConstant() && right->IsConstant()) { | |
2887 HConstant* c_left = HConstant::cast(left); | 3038 HConstant* c_left = HConstant::cast(left); |
2888 HConstant* c_right = HConstant::cast(right); | 3039 HConstant* c_right = HConstant::cast(right); |
2889 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { | 3040 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { |
2890 int32_t left_val = c_left->NumberValueAsInteger32(); | 3041 int32_t left_val = c_left->NumberValueAsInteger32(); |
2891 int32_t right_val = c_right->NumberValueAsInteger32() & 0x1f; | 3042 int32_t right_val = c_right->NumberValueAsInteger32() & 0x1f; |
2892 if ((right_val == 0) && (left_val < 0)) { | 3043 if ((right_val == 0) && (left_val < 0)) { |
2893 return H_CONSTANT_DOUBLE( | 3044 return H_CONSTANT_DOUBLE( |
2894 static_cast<double>(static_cast<uint32_t>(left_val))); | 3045 static_cast<double>(static_cast<uint32_t>(left_val))); |
2895 } | 3046 } |
2896 return H_CONSTANT_INT32(static_cast<uint32_t>(left_val) >> right_val); | 3047 return H_CONSTANT_INT32(static_cast<uint32_t>(left_val) >> right_val); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3060 | 3211 |
3061 | 3212 |
3062 void HCheckFunction::Verify() { | 3213 void HCheckFunction::Verify() { |
3063 HInstruction::Verify(); | 3214 HInstruction::Verify(); |
3064 ASSERT(HasNoUses()); | 3215 ASSERT(HasNoUses()); |
3065 } | 3216 } |
3066 | 3217 |
3067 #endif | 3218 #endif |
3068 | 3219 |
3069 } } // namespace v8::internal | 3220 } } // namespace v8::internal |
OLD | NEW |