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 2044 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2055 return BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(value); | 2055 return BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(value); |
2056 } | 2056 } |
2057 | 2057 |
2058 | 2058 |
2059 HConstant::HConstant(Handle<Object> handle, Representation r) | 2059 HConstant::HConstant(Handle<Object> handle, Representation r) |
2060 : handle_(handle), | 2060 : handle_(handle), |
2061 unique_id_(), | 2061 unique_id_(), |
2062 has_int32_value_(false), | 2062 has_int32_value_(false), |
2063 has_double_value_(false), | 2063 has_double_value_(false), |
2064 is_internalized_string_(false), | 2064 is_internalized_string_(false), |
| 2065 is_not_in_new_space_(true), |
2065 boolean_value_(handle->BooleanValue()) { | 2066 boolean_value_(handle->BooleanValue()) { |
| 2067 if (handle_->IsHeapObject()) { |
| 2068 Heap* heap = Handle<HeapObject>::cast(handle)->GetHeap(); |
| 2069 is_not_in_new_space_ = !heap->InNewSpace(*handle); |
| 2070 } |
2066 if (handle_->IsNumber()) { | 2071 if (handle_->IsNumber()) { |
2067 double n = handle_->Number(); | 2072 double n = handle_->Number(); |
2068 has_int32_value_ = IsInteger32(n); | 2073 has_int32_value_ = IsInteger32(n); |
2069 int32_value_ = DoubleToInt32(n); | 2074 int32_value_ = DoubleToInt32(n); |
2070 double_value_ = n; | 2075 double_value_ = n; |
2071 has_double_value_ = true; | 2076 has_double_value_ = true; |
2072 } else { | 2077 } else { |
2073 type_from_value_ = HType::TypeFromValue(handle_); | 2078 type_from_value_ = HType::TypeFromValue(handle_); |
2074 is_internalized_string_ = handle_->IsInternalizedString(); | 2079 is_internalized_string_ = handle_->IsInternalizedString(); |
2075 } | 2080 } |
2076 if (r.IsNone()) { | 2081 if (r.IsNone()) { |
2077 if (has_int32_value_) { | 2082 if (has_int32_value_) { |
2078 r = Representation::Integer32(); | 2083 r = Representation::Integer32(); |
2079 } else if (has_double_value_) { | 2084 } else if (has_double_value_) { |
2080 r = Representation::Double(); | 2085 r = Representation::Double(); |
2081 } else { | 2086 } else { |
2082 r = Representation::Tagged(); | 2087 r = Representation::Tagged(); |
2083 } | 2088 } |
2084 } | 2089 } |
2085 Initialize(r); | 2090 Initialize(r); |
2086 } | 2091 } |
2087 | 2092 |
2088 | 2093 |
2089 HConstant::HConstant(Handle<Object> handle, | 2094 HConstant::HConstant(Handle<Object> handle, |
2090 UniqueValueId unique_id, | 2095 UniqueValueId unique_id, |
2091 Representation r, | 2096 Representation r, |
2092 HType type, | 2097 HType type, |
2093 bool is_internalize_string, | 2098 bool is_internalize_string, |
| 2099 bool is_not_in_new_space, |
2094 bool boolean_value) | 2100 bool boolean_value) |
2095 : handle_(handle), | 2101 : handle_(handle), |
2096 unique_id_(unique_id), | 2102 unique_id_(unique_id), |
2097 has_int32_value_(false), | 2103 has_int32_value_(false), |
2098 has_double_value_(false), | 2104 has_double_value_(false), |
2099 is_internalized_string_(is_internalize_string), | 2105 is_internalized_string_(is_internalize_string), |
| 2106 is_not_in_new_space_(is_not_in_new_space), |
2100 boolean_value_(boolean_value), | 2107 boolean_value_(boolean_value), |
2101 type_from_value_(type) { | 2108 type_from_value_(type) { |
2102 ASSERT(!handle.is_null()); | 2109 ASSERT(!handle.is_null()); |
2103 ASSERT(!type.IsUninitialized()); | 2110 ASSERT(!type.IsUninitialized()); |
2104 ASSERT(!type.IsTaggedNumber()); | 2111 ASSERT(!type.IsTaggedNumber()); |
2105 Initialize(r); | 2112 Initialize(r); |
2106 } | 2113 } |
2107 | 2114 |
2108 | 2115 |
2109 HConstant::HConstant(int32_t integer_value, | 2116 HConstant::HConstant(int32_t integer_value, |
2110 Representation r, | 2117 Representation r, |
| 2118 bool is_not_in_new_space, |
2111 Handle<Object> optional_handle) | 2119 Handle<Object> optional_handle) |
2112 : handle_(optional_handle), | 2120 : handle_(optional_handle), |
2113 unique_id_(), | 2121 unique_id_(), |
2114 has_int32_value_(true), | 2122 has_int32_value_(true), |
2115 has_double_value_(true), | 2123 has_double_value_(true), |
2116 is_internalized_string_(false), | 2124 is_internalized_string_(false), |
| 2125 is_not_in_new_space_(is_not_in_new_space), |
2117 boolean_value_(integer_value != 0), | 2126 boolean_value_(integer_value != 0), |
2118 int32_value_(integer_value), | 2127 int32_value_(integer_value), |
2119 double_value_(FastI2D(integer_value)) { | 2128 double_value_(FastI2D(integer_value)) { |
2120 Initialize(r); | 2129 Initialize(r); |
2121 } | 2130 } |
2122 | 2131 |
2123 | 2132 |
2124 HConstant::HConstant(double double_value, | 2133 HConstant::HConstant(double double_value, |
2125 Representation r, | 2134 Representation r, |
| 2135 bool is_not_in_new_space, |
2126 Handle<Object> optional_handle) | 2136 Handle<Object> optional_handle) |
2127 : handle_(optional_handle), | 2137 : handle_(optional_handle), |
2128 unique_id_(), | 2138 unique_id_(), |
2129 has_int32_value_(IsInteger32(double_value)), | 2139 has_int32_value_(IsInteger32(double_value)), |
2130 has_double_value_(true), | 2140 has_double_value_(true), |
2131 is_internalized_string_(false), | 2141 is_internalized_string_(false), |
| 2142 is_not_in_new_space_(is_not_in_new_space), |
2132 boolean_value_(double_value != 0 && !std::isnan(double_value)), | 2143 boolean_value_(double_value != 0 && !std::isnan(double_value)), |
2133 int32_value_(DoubleToInt32(double_value)), | 2144 int32_value_(DoubleToInt32(double_value)), |
2134 double_value_(double_value) { | 2145 double_value_(double_value) { |
2135 Initialize(r); | 2146 Initialize(r); |
2136 } | 2147 } |
2137 | 2148 |
2138 | 2149 |
2139 void HConstant::Initialize(Representation r) { | 2150 void HConstant::Initialize(Representation r) { |
2140 set_representation(r); | 2151 set_representation(r); |
2141 SetFlag(kUseGVN); | 2152 SetFlag(kUseGVN); |
2142 if (representation().IsInteger32()) { | 2153 if (representation().IsInteger32()) { |
2143 ClearGVNFlag(kDependsOnOsrEntries); | 2154 ClearGVNFlag(kDependsOnOsrEntries); |
2144 } | 2155 } |
2145 } | 2156 } |
2146 | 2157 |
2147 | 2158 |
2148 HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const { | 2159 HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const { |
2149 if (r.IsInteger32() && !has_int32_value_) return NULL; | 2160 if (r.IsInteger32() && !has_int32_value_) return NULL; |
2150 if (r.IsDouble() && !has_double_value_) return NULL; | 2161 if (r.IsDouble() && !has_double_value_) return NULL; |
2151 if (has_int32_value_) return new(zone) HConstant(int32_value_, r, handle_); | 2162 if (has_int32_value_) { |
2152 if (has_double_value_) return new(zone) HConstant(double_value_, r, handle_); | 2163 return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, handle_); |
| 2164 } |
| 2165 if (has_double_value_) { |
| 2166 return new(zone) HConstant(double_value_, r, is_not_in_new_space_, handle_); |
| 2167 } |
2153 ASSERT(!handle_.is_null()); | 2168 ASSERT(!handle_.is_null()); |
2154 return new(zone) HConstant(handle_, | 2169 return new(zone) HConstant(handle_, |
2155 unique_id_, | 2170 unique_id_, |
2156 r, | 2171 r, |
2157 type_from_value_, | 2172 type_from_value_, |
2158 is_internalized_string_, | 2173 is_internalized_string_, |
| 2174 is_not_in_new_space_, |
2159 boolean_value_); | 2175 boolean_value_); |
2160 } | 2176 } |
2161 | 2177 |
2162 | 2178 |
2163 HConstant* HConstant::CopyToTruncatedInt32(Zone* zone) const { | 2179 HConstant* HConstant::CopyToTruncatedInt32(Zone* zone) const { |
2164 if (has_int32_value_) { | 2180 if (has_int32_value_) { |
2165 return new(zone) HConstant( | 2181 return new(zone) HConstant(int32_value_, |
2166 int32_value_, Representation::Integer32(), handle_); | 2182 Representation::Integer32(), |
| 2183 is_not_in_new_space_, |
| 2184 handle_); |
2167 } | 2185 } |
2168 if (has_double_value_) { | 2186 if (has_double_value_) { |
2169 return new(zone) HConstant( | 2187 return new(zone) HConstant(DoubleToInt32(double_value_), |
2170 DoubleToInt32(double_value_), Representation::Integer32(), handle_); | 2188 Representation::Integer32(), |
| 2189 is_not_in_new_space_, |
| 2190 handle_); |
2171 } | 2191 } |
2172 return NULL; | 2192 return NULL; |
2173 } | 2193 } |
2174 | 2194 |
2175 | 2195 |
2176 void HConstant::PrintDataTo(StringStream* stream) { | 2196 void HConstant::PrintDataTo(StringStream* stream) { |
2177 if (has_int32_value_) { | 2197 if (has_int32_value_) { |
2178 stream->Add("%d ", int32_value_); | 2198 stream->Add("%d ", int32_value_); |
2179 } else if (has_double_value_) { | 2199 } else if (has_double_value_) { |
2180 stream->Add("%f ", FmtElm(double_value_)); | 2200 stream->Add("%f ", FmtElm(double_value_)); |
(...skipping 1446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3627 | 3647 |
3628 | 3648 |
3629 void HCheckFunction::Verify() { | 3649 void HCheckFunction::Verify() { |
3630 HInstruction::Verify(); | 3650 HInstruction::Verify(); |
3631 ASSERT(HasNoUses()); | 3651 ASSERT(HasNoUses()); |
3632 } | 3652 } |
3633 | 3653 |
3634 #endif | 3654 #endif |
3635 | 3655 |
3636 } } // namespace v8::internal | 3656 } } // namespace v8::internal |
OLD | NEW |