OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 2307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2318 bool HasInteger32Value() const { return has_int32_value_; } | 2318 bool HasInteger32Value() const { return has_int32_value_; } |
2319 int32_t Integer32Value() const { | 2319 int32_t Integer32Value() const { |
2320 ASSERT(HasInteger32Value()); | 2320 ASSERT(HasInteger32Value()); |
2321 return int32_value_; | 2321 return int32_value_; |
2322 } | 2322 } |
2323 bool HasDoubleValue() const { return has_double_value_; } | 2323 bool HasDoubleValue() const { return has_double_value_; } |
2324 double DoubleValue() const { | 2324 double DoubleValue() const { |
2325 ASSERT(HasDoubleValue()); | 2325 ASSERT(HasDoubleValue()); |
2326 return double_value_; | 2326 return double_value_; |
2327 } | 2327 } |
| 2328 bool HasNumberValue() const { return has_int32_value_ || has_double_value_; } |
| 2329 int32_t NumberValueAsInteger32() const { |
| 2330 ASSERT(HasNumberValue()); |
| 2331 if (has_int32_value_) return int32_value_; |
| 2332 return DoubleToInt32(double_value_); |
| 2333 } |
2328 bool HasStringValue() const { return handle_->IsString(); } | 2334 bool HasStringValue() const { return handle_->IsString(); } |
2329 | 2335 |
2330 bool ToBoolean() const; | 2336 bool ToBoolean() const; |
2331 | 2337 |
2332 virtual intptr_t Hashcode() { | 2338 virtual intptr_t Hashcode() { |
2333 ASSERT(!HEAP->allow_allocation(false)); | 2339 ASSERT(!HEAP->allow_allocation(false)); |
2334 return reinterpret_cast<intptr_t>(*handle()); | 2340 return reinterpret_cast<intptr_t>(*handle()); |
2335 } | 2341 } |
2336 | 2342 |
2337 #ifdef DEBUG | 2343 #ifdef DEBUG |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2935 } | 2941 } |
2936 | 2942 |
2937 // Add is only commutative if two integer values are added and not if two | 2943 // Add is only commutative if two integer values are added and not if two |
2938 // tagged values are added (because it might be a String concatenation). | 2944 // tagged values are added (because it might be a String concatenation). |
2939 virtual bool IsCommutative() const { | 2945 virtual bool IsCommutative() const { |
2940 return !representation().IsTagged(); | 2946 return !representation().IsTagged(); |
2941 } | 2947 } |
2942 | 2948 |
2943 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 2949 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
2944 | 2950 |
| 2951 static HInstruction* NewHAdd(Zone* zone, |
| 2952 HValue* context, |
| 2953 HValue* left, |
| 2954 HValue* right); |
| 2955 |
2945 virtual HType CalculateInferredType(); | 2956 virtual HType CalculateInferredType(); |
2946 | 2957 |
2947 DECLARE_CONCRETE_INSTRUCTION(Add) | 2958 DECLARE_CONCRETE_INSTRUCTION(Add) |
2948 | 2959 |
2949 protected: | 2960 protected: |
2950 virtual bool DataEquals(HValue* other) { return true; } | 2961 virtual bool DataEquals(HValue* other) { return true; } |
2951 | 2962 |
2952 virtual Range* InferRange(); | 2963 virtual Range* InferRange(); |
2953 }; | 2964 }; |
2954 | 2965 |
2955 | 2966 |
2956 class HSub: public HArithmeticBinaryOperation { | 2967 class HSub: public HArithmeticBinaryOperation { |
2957 public: | 2968 public: |
2958 HSub(HValue* context, HValue* left, HValue* right) | 2969 HSub(HValue* context, HValue* left, HValue* right) |
2959 : HArithmeticBinaryOperation(context, left, right) { | 2970 : HArithmeticBinaryOperation(context, left, right) { |
2960 SetFlag(kCanOverflow); | 2971 SetFlag(kCanOverflow); |
2961 } | 2972 } |
2962 | 2973 |
2963 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 2974 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
2964 | 2975 |
| 2976 static HInstruction* NewHSub(Zone* zone, |
| 2977 HValue* context, |
| 2978 HValue* left, |
| 2979 HValue* right); |
| 2980 |
2965 DECLARE_CONCRETE_INSTRUCTION(Sub) | 2981 DECLARE_CONCRETE_INSTRUCTION(Sub) |
2966 | 2982 |
2967 protected: | 2983 protected: |
2968 virtual bool DataEquals(HValue* other) { return true; } | 2984 virtual bool DataEquals(HValue* other) { return true; } |
2969 | 2985 |
2970 virtual Range* InferRange(); | 2986 virtual Range* InferRange(); |
2971 }; | 2987 }; |
2972 | 2988 |
2973 | 2989 |
2974 class HMul: public HArithmeticBinaryOperation { | 2990 class HMul: public HArithmeticBinaryOperation { |
2975 public: | 2991 public: |
2976 HMul(HValue* context, HValue* left, HValue* right) | 2992 HMul(HValue* context, HValue* left, HValue* right) |
2977 : HArithmeticBinaryOperation(context, left, right) { | 2993 : HArithmeticBinaryOperation(context, left, right) { |
2978 SetFlag(kCanOverflow); | 2994 SetFlag(kCanOverflow); |
2979 } | 2995 } |
2980 | 2996 |
2981 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 2997 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
2982 | 2998 |
2983 // Only commutative if it is certain that not two objects are multiplicated. | 2999 // Only commutative if it is certain that not two objects are multiplicated. |
2984 virtual bool IsCommutative() const { | 3000 virtual bool IsCommutative() const { |
2985 return !representation().IsTagged(); | 3001 return !representation().IsTagged(); |
2986 } | 3002 } |
2987 | 3003 |
| 3004 static HInstruction* NewHMul(Zone* zone, |
| 3005 HValue* context, |
| 3006 HValue* left, |
| 3007 HValue* right); |
| 3008 |
2988 DECLARE_CONCRETE_INSTRUCTION(Mul) | 3009 DECLARE_CONCRETE_INSTRUCTION(Mul) |
2989 | 3010 |
2990 protected: | 3011 protected: |
2991 virtual bool DataEquals(HValue* other) { return true; } | 3012 virtual bool DataEquals(HValue* other) { return true; } |
2992 | 3013 |
2993 virtual Range* InferRange(); | 3014 virtual Range* InferRange(); |
2994 }; | 3015 }; |
2995 | 3016 |
2996 | 3017 |
2997 class HMod: public HArithmeticBinaryOperation { | 3018 class HMod: public HArithmeticBinaryOperation { |
2998 public: | 3019 public: |
2999 HMod(HValue* context, HValue* left, HValue* right) | 3020 HMod(HValue* context, HValue* left, HValue* right) |
3000 : HArithmeticBinaryOperation(context, left, right) { | 3021 : HArithmeticBinaryOperation(context, left, right) { |
3001 SetFlag(kCanBeDivByZero); | 3022 SetFlag(kCanBeDivByZero); |
3002 } | 3023 } |
3003 | 3024 |
3004 bool HasPowerOf2Divisor() { | 3025 bool HasPowerOf2Divisor() { |
3005 if (right()->IsConstant() && | 3026 if (right()->IsConstant() && |
3006 HConstant::cast(right())->HasInteger32Value()) { | 3027 HConstant::cast(right())->HasInteger32Value()) { |
3007 int32_t value = HConstant::cast(right())->Integer32Value(); | 3028 int32_t value = HConstant::cast(right())->Integer32Value(); |
3008 return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value)); | 3029 return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value)); |
3009 } | 3030 } |
3010 | 3031 |
3011 return false; | 3032 return false; |
3012 } | 3033 } |
3013 | 3034 |
3014 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 3035 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
3015 | 3036 |
| 3037 static HInstruction* NewHMod(Zone* zone, |
| 3038 HValue* context, |
| 3039 HValue* left, |
| 3040 HValue* right); |
| 3041 |
3016 DECLARE_CONCRETE_INSTRUCTION(Mod) | 3042 DECLARE_CONCRETE_INSTRUCTION(Mod) |
3017 | 3043 |
3018 protected: | 3044 protected: |
3019 virtual bool DataEquals(HValue* other) { return true; } | 3045 virtual bool DataEquals(HValue* other) { return true; } |
3020 | 3046 |
3021 virtual Range* InferRange(); | 3047 virtual Range* InferRange(); |
3022 }; | 3048 }; |
3023 | 3049 |
3024 | 3050 |
3025 class HDiv: public HArithmeticBinaryOperation { | 3051 class HDiv: public HArithmeticBinaryOperation { |
3026 public: | 3052 public: |
3027 HDiv(HValue* context, HValue* left, HValue* right) | 3053 HDiv(HValue* context, HValue* left, HValue* right) |
3028 : HArithmeticBinaryOperation(context, left, right) { | 3054 : HArithmeticBinaryOperation(context, left, right) { |
3029 SetFlag(kCanBeDivByZero); | 3055 SetFlag(kCanBeDivByZero); |
3030 SetFlag(kCanOverflow); | 3056 SetFlag(kCanOverflow); |
3031 } | 3057 } |
3032 | 3058 |
3033 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 3059 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
3034 | 3060 |
| 3061 |
| 3062 static HInstruction* NewHDiv(Zone* zone, |
| 3063 HValue* context, |
| 3064 HValue* left, |
| 3065 HValue* right); |
| 3066 |
3035 DECLARE_CONCRETE_INSTRUCTION(Div) | 3067 DECLARE_CONCRETE_INSTRUCTION(Div) |
3036 | 3068 |
3037 protected: | 3069 protected: |
3038 virtual bool DataEquals(HValue* other) { return true; } | 3070 virtual bool DataEquals(HValue* other) { return true; } |
3039 | 3071 |
3040 virtual Range* InferRange(); | 3072 virtual Range* InferRange(); |
3041 }; | 3073 }; |
3042 | 3074 |
3043 | 3075 |
3044 class HBitwise: public HBitwiseBinaryOperation { | 3076 class HBitwise: public HBitwiseBinaryOperation { |
3045 public: | 3077 public: |
3046 HBitwise(Token::Value op, HValue* context, HValue* left, HValue* right) | 3078 HBitwise(Token::Value op, HValue* context, HValue* left, HValue* right) |
3047 : HBitwiseBinaryOperation(context, left, right), op_(op) { | 3079 : HBitwiseBinaryOperation(context, left, right), op_(op) { |
3048 ASSERT(op == Token::BIT_AND || | 3080 ASSERT(op == Token::BIT_AND || |
3049 op == Token::BIT_OR || | 3081 op == Token::BIT_OR || |
3050 op == Token::BIT_XOR); | 3082 op == Token::BIT_XOR); |
3051 } | 3083 } |
3052 | 3084 |
3053 Token::Value op() const { return op_; } | 3085 Token::Value op() const { return op_; } |
3054 | 3086 |
3055 virtual bool IsCommutative() const { return true; } | 3087 virtual bool IsCommutative() const { return true; } |
3056 | 3088 |
| 3089 static HInstruction* NewHBitwise(Zone* zone, |
| 3090 Token::Value op, |
| 3091 HValue* context, |
| 3092 HValue* left, |
| 3093 HValue* right); |
| 3094 |
3057 DECLARE_CONCRETE_INSTRUCTION(Bitwise) | 3095 DECLARE_CONCRETE_INSTRUCTION(Bitwise) |
3058 | 3096 |
3059 protected: | 3097 protected: |
3060 virtual bool DataEquals(HValue* other) { | 3098 virtual bool DataEquals(HValue* other) { |
3061 return op() == HBitwise::cast(other)->op(); | 3099 return op() == HBitwise::cast(other)->op(); |
3062 } | 3100 } |
3063 | 3101 |
3064 virtual Range* InferRange(); | 3102 virtual Range* InferRange(); |
3065 | 3103 |
3066 private: | 3104 private: |
3067 Token::Value op_; | 3105 Token::Value op_; |
3068 }; | 3106 }; |
3069 | 3107 |
3070 | 3108 |
3071 class HShl: public HBitwiseBinaryOperation { | 3109 class HShl: public HBitwiseBinaryOperation { |
3072 public: | 3110 public: |
3073 HShl(HValue* context, HValue* left, HValue* right) | 3111 HShl(HValue* context, HValue* left, HValue* right) |
3074 : HBitwiseBinaryOperation(context, left, right) { } | 3112 : HBitwiseBinaryOperation(context, left, right) { } |
3075 | 3113 |
3076 virtual Range* InferRange(); | 3114 virtual Range* InferRange(); |
3077 | 3115 |
| 3116 static HInstruction* NewHShl(Zone* zone, |
| 3117 HValue* context, |
| 3118 HValue* left, |
| 3119 HValue* right); |
| 3120 |
3078 DECLARE_CONCRETE_INSTRUCTION(Shl) | 3121 DECLARE_CONCRETE_INSTRUCTION(Shl) |
3079 | 3122 |
3080 protected: | 3123 protected: |
3081 virtual bool DataEquals(HValue* other) { return true; } | 3124 virtual bool DataEquals(HValue* other) { return true; } |
3082 }; | 3125 }; |
3083 | 3126 |
3084 | 3127 |
3085 class HShr: public HBitwiseBinaryOperation { | 3128 class HShr: public HBitwiseBinaryOperation { |
3086 public: | 3129 public: |
3087 HShr(HValue* context, HValue* left, HValue* right) | 3130 HShr(HValue* context, HValue* left, HValue* right) |
3088 : HBitwiseBinaryOperation(context, left, right) { } | 3131 : HBitwiseBinaryOperation(context, left, right) { } |
3089 | 3132 |
3090 virtual Range* InferRange(); | 3133 virtual Range* InferRange(); |
3091 | 3134 |
| 3135 static HInstruction* NewHShr(Zone* zone, |
| 3136 HValue* context, |
| 3137 HValue* left, |
| 3138 HValue* right); |
| 3139 |
3092 DECLARE_CONCRETE_INSTRUCTION(Shr) | 3140 DECLARE_CONCRETE_INSTRUCTION(Shr) |
3093 | 3141 |
3094 protected: | 3142 protected: |
3095 virtual bool DataEquals(HValue* other) { return true; } | 3143 virtual bool DataEquals(HValue* other) { return true; } |
3096 }; | 3144 }; |
3097 | 3145 |
3098 | 3146 |
3099 class HSar: public HBitwiseBinaryOperation { | 3147 class HSar: public HBitwiseBinaryOperation { |
3100 public: | 3148 public: |
3101 HSar(HValue* context, HValue* left, HValue* right) | 3149 HSar(HValue* context, HValue* left, HValue* right) |
3102 : HBitwiseBinaryOperation(context, left, right) { } | 3150 : HBitwiseBinaryOperation(context, left, right) { } |
3103 | 3151 |
3104 virtual Range* InferRange(); | 3152 virtual Range* InferRange(); |
3105 | 3153 |
| 3154 static HInstruction* NewHSar(Zone* zone, |
| 3155 HValue* context, |
| 3156 HValue* left, |
| 3157 HValue* right); |
| 3158 |
3106 DECLARE_CONCRETE_INSTRUCTION(Sar) | 3159 DECLARE_CONCRETE_INSTRUCTION(Sar) |
3107 | 3160 |
3108 protected: | 3161 protected: |
3109 virtual bool DataEquals(HValue* other) { return true; } | 3162 virtual bool DataEquals(HValue* other) { return true; } |
3110 }; | 3163 }; |
3111 | 3164 |
3112 | 3165 |
3113 class HOsrEntry: public HTemplateInstruction<0> { | 3166 class HOsrEntry: public HTemplateInstruction<0> { |
3114 public: | 3167 public: |
3115 explicit HOsrEntry(int ast_id) : ast_id_(ast_id) { | 3168 explicit HOsrEntry(int ast_id) : ast_id_(ast_id) { |
(...skipping 1169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4285 | 4338 |
4286 DECLARE_CONCRETE_INSTRUCTION(In) | 4339 DECLARE_CONCRETE_INSTRUCTION(In) |
4287 }; | 4340 }; |
4288 | 4341 |
4289 #undef DECLARE_INSTRUCTION | 4342 #undef DECLARE_INSTRUCTION |
4290 #undef DECLARE_CONCRETE_INSTRUCTION | 4343 #undef DECLARE_CONCRETE_INSTRUCTION |
4291 | 4344 |
4292 } } // namespace v8::internal | 4345 } } // namespace v8::internal |
4293 | 4346 |
4294 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 4347 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |