| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/simplified-operator.h" | 5 #include "src/compiler/simplified-operator.h" |
| 6 | 6 |
| 7 #include "src/base/lazy-instance.h" | 7 #include "src/base/lazy-instance.h" |
| 8 #include "src/compiler/opcodes.h" | 8 #include "src/compiler/opcodes.h" |
| 9 #include "src/compiler/operator.h" | 9 #include "src/compiler/operator.h" |
| 10 #include "src/types.h" | 10 #include "src/types.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 } | 165 } |
| 166 | 166 |
| 167 | 167 |
| 168 const ElementAccess& ElementAccessOf(const Operator* op) { | 168 const ElementAccess& ElementAccessOf(const Operator* op) { |
| 169 DCHECK_NOT_NULL(op); | 169 DCHECK_NOT_NULL(op); |
| 170 DCHECK(op->opcode() == IrOpcode::kLoadElement || | 170 DCHECK(op->opcode() == IrOpcode::kLoadElement || |
| 171 op->opcode() == IrOpcode::kStoreElement); | 171 op->opcode() == IrOpcode::kStoreElement); |
| 172 return OpParameter<ElementAccess>(op); | 172 return OpParameter<ElementAccess>(op); |
| 173 } | 173 } |
| 174 | 174 |
| 175 size_t hash_value(CheckFloat64HoleMode mode) { |
| 176 return static_cast<size_t>(mode); |
| 177 } |
| 178 |
| 179 std::ostream& operator<<(std::ostream& os, CheckFloat64HoleMode mode) { |
| 180 switch (mode) { |
| 181 case CheckFloat64HoleMode::kAllowReturnHole: |
| 182 return os << "allow-return-hole"; |
| 183 case CheckFloat64HoleMode::kNeverReturnHole: |
| 184 return os << "never-return-hole"; |
| 185 } |
| 186 UNREACHABLE(); |
| 187 return os; |
| 188 } |
| 189 |
| 190 CheckFloat64HoleMode CheckFloat64HoleModeOf(const Operator* op) { |
| 191 DCHECK_EQ(IrOpcode::kCheckFloat64Hole, op->opcode()); |
| 192 return OpParameter<CheckFloat64HoleMode>(op); |
| 193 } |
| 194 |
| 195 size_t hash_value(CheckTaggedHoleMode mode) { |
| 196 return static_cast<size_t>(mode); |
| 197 } |
| 198 |
| 199 std::ostream& operator<<(std::ostream& os, CheckTaggedHoleMode mode) { |
| 200 switch (mode) { |
| 201 case CheckTaggedHoleMode::kConvertHoleToUndefined: |
| 202 return os << "convert-hole-to-undefined"; |
| 203 case CheckTaggedHoleMode::kNeverReturnHole: |
| 204 return os << "never-return-hole"; |
| 205 } |
| 206 UNREACHABLE(); |
| 207 return os; |
| 208 } |
| 209 |
| 210 CheckTaggedHoleMode CheckTaggedHoleModeOf(const Operator* op) { |
| 211 DCHECK_EQ(IrOpcode::kCheckTaggedHole, op->opcode()); |
| 212 return OpParameter<CheckTaggedHoleMode>(op); |
| 213 } |
| 214 |
| 175 Type* TypeOf(const Operator* op) { | 215 Type* TypeOf(const Operator* op) { |
| 176 DCHECK_EQ(IrOpcode::kTypeGuard, op->opcode()); | 216 DCHECK_EQ(IrOpcode::kTypeGuard, op->opcode()); |
| 177 return OpParameter<Type*>(op); | 217 return OpParameter<Type*>(op); |
| 178 } | 218 } |
| 179 | 219 |
| 180 BinaryOperationHints::Hint BinaryOperationHintOf(const Operator* op) { | 220 BinaryOperationHints::Hint BinaryOperationHintOf(const Operator* op) { |
| 181 DCHECK(op->opcode() == IrOpcode::kSpeculativeNumberAdd || | 221 DCHECK(op->opcode() == IrOpcode::kSpeculativeNumberAdd || |
| 182 op->opcode() == IrOpcode::kSpeculativeNumberSubtract); | 222 op->opcode() == IrOpcode::kSpeculativeNumberSubtract); |
| 183 return OpParameter<BinaryOperationHints::Hint>(op); | 223 return OpParameter<BinaryOperationHints::Hint>(op); |
| 184 } | 224 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 207 V(NumberFround, Operator::kNoProperties, 1) \ | 247 V(NumberFround, Operator::kNoProperties, 1) \ |
| 208 V(NumberAtan, Operator::kNoProperties, 1) \ | 248 V(NumberAtan, Operator::kNoProperties, 1) \ |
| 209 V(NumberAtan2, Operator::kNoProperties, 2) \ | 249 V(NumberAtan2, Operator::kNoProperties, 2) \ |
| 210 V(NumberLog, Operator::kNoProperties, 1) \ | 250 V(NumberLog, Operator::kNoProperties, 1) \ |
| 211 V(NumberLog1p, Operator::kNoProperties, 1) \ | 251 V(NumberLog1p, Operator::kNoProperties, 1) \ |
| 212 V(NumberRound, Operator::kNoProperties, 1) \ | 252 V(NumberRound, Operator::kNoProperties, 1) \ |
| 213 V(NumberSqrt, Operator::kNoProperties, 1) \ | 253 V(NumberSqrt, Operator::kNoProperties, 1) \ |
| 214 V(NumberTrunc, Operator::kNoProperties, 1) \ | 254 V(NumberTrunc, Operator::kNoProperties, 1) \ |
| 215 V(NumberToInt32, Operator::kNoProperties, 1) \ | 255 V(NumberToInt32, Operator::kNoProperties, 1) \ |
| 216 V(NumberToUint32, Operator::kNoProperties, 1) \ | 256 V(NumberToUint32, Operator::kNoProperties, 1) \ |
| 217 V(NumberIsHoleNaN, Operator::kNoProperties, 1) \ | |
| 218 V(NumberSilenceNaN, Operator::kNoProperties, 1) \ | 257 V(NumberSilenceNaN, Operator::kNoProperties, 1) \ |
| 219 V(NumberConvertHoleNaN, Operator::kNoProperties, 1) \ | |
| 220 V(StringFromCharCode, Operator::kNoProperties, 1) \ | 258 V(StringFromCharCode, Operator::kNoProperties, 1) \ |
| 221 V(StringToNumber, Operator::kNoProperties, 1) \ | 259 V(StringToNumber, Operator::kNoProperties, 1) \ |
| 222 V(PlainPrimitiveToNumber, Operator::kNoProperties, 1) \ | 260 V(PlainPrimitiveToNumber, Operator::kNoProperties, 1) \ |
| 223 V(PlainPrimitiveToWord32, Operator::kNoProperties, 1) \ | 261 V(PlainPrimitiveToWord32, Operator::kNoProperties, 1) \ |
| 224 V(PlainPrimitiveToFloat64, Operator::kNoProperties, 1) \ | 262 V(PlainPrimitiveToFloat64, Operator::kNoProperties, 1) \ |
| 225 V(ChangeTaggedSignedToInt32, Operator::kNoProperties, 1) \ | 263 V(ChangeTaggedSignedToInt32, Operator::kNoProperties, 1) \ |
| 226 V(ChangeTaggedToInt32, Operator::kNoProperties, 1) \ | 264 V(ChangeTaggedToInt32, Operator::kNoProperties, 1) \ |
| 227 V(ChangeTaggedToUint32, Operator::kNoProperties, 1) \ | 265 V(ChangeTaggedToUint32, Operator::kNoProperties, 1) \ |
| 228 V(ChangeTaggedToFloat64, Operator::kNoProperties, 1) \ | 266 V(ChangeTaggedToFloat64, Operator::kNoProperties, 1) \ |
| 229 V(ChangeInt31ToTaggedSigned, Operator::kNoProperties, 1) \ | 267 V(ChangeInt31ToTaggedSigned, Operator::kNoProperties, 1) \ |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 #define CHECKED(Name) \ | 302 #define CHECKED(Name) \ |
| 265 struct Name##Operator final : public Operator { \ | 303 struct Name##Operator final : public Operator { \ |
| 266 Name##Operator() \ | 304 Name##Operator() \ |
| 267 : Operator(IrOpcode::k##Name, Operator::kNoThrow, #Name, 1, 1, 1, 1, \ | 305 : Operator(IrOpcode::k##Name, Operator::kNoThrow, #Name, 1, 1, 1, 1, \ |
| 268 1, 1) {} \ | 306 1, 1) {} \ |
| 269 }; \ | 307 }; \ |
| 270 Name##Operator k##Name; | 308 Name##Operator k##Name; |
| 271 CHECKED_OP_LIST(CHECKED) | 309 CHECKED_OP_LIST(CHECKED) |
| 272 #undef CHECKED | 310 #undef CHECKED |
| 273 | 311 |
| 312 template <CheckFloat64HoleMode kMode> |
| 313 struct CheckFloat64HoleNaNOperatortor final |
| 314 : public Operator1<CheckFloat64HoleMode> { |
| 315 CheckFloat64HoleNaNOperatortor() |
| 316 : Operator1<CheckFloat64HoleMode>( |
| 317 IrOpcode::kCheckFloat64Hole, Operator::kFoldable, |
| 318 "CheckFloat64Hole", 1, 1, 1, 1, 1, 0, kMode) {} |
| 319 }; |
| 320 CheckFloat64HoleNaNOperatortor<CheckFloat64HoleMode::kAllowReturnHole> |
| 321 kCheckFloat64HoleAllowReturnHoleOperator; |
| 322 CheckFloat64HoleNaNOperatortor<CheckFloat64HoleMode::kNeverReturnHole> |
| 323 kCheckFloat64HoleNeverReturnHoleOperator; |
| 324 |
| 325 template <CheckTaggedHoleMode kMode> |
| 326 struct CheckTaggedHoleOperator final : public Operator1<CheckTaggedHoleMode> { |
| 327 CheckTaggedHoleOperator() |
| 328 : Operator1<CheckTaggedHoleMode>(IrOpcode::kCheckTaggedHole, |
| 329 Operator::kFoldable, "CheckTaggedHole", |
| 330 1, 1, 1, 1, 1, 0, kMode) {} |
| 331 }; |
| 332 CheckTaggedHoleOperator<CheckTaggedHoleMode::kConvertHoleToUndefined> |
| 333 kCheckTaggedHoleConvertHoleToUndefinedOperator; |
| 334 CheckTaggedHoleOperator<CheckTaggedHoleMode::kNeverReturnHole> |
| 335 kCheckTaggedHoleNeverReturnHoleOperator; |
| 336 |
| 274 struct CheckIfOperator final : public Operator { | 337 struct CheckIfOperator final : public Operator { |
| 275 CheckIfOperator() | 338 CheckIfOperator() |
| 276 : Operator(IrOpcode::kCheckIf, Operator::kFoldable, "CheckIf", 1, 1, 1, | 339 : Operator(IrOpcode::kCheckIf, Operator::kFoldable, "CheckIf", 1, 1, 1, |
| 277 0, 1, 1) {} | 340 0, 1, 1) {} |
| 278 }; | 341 }; |
| 279 CheckIfOperator kCheckIf; | 342 CheckIfOperator kCheckIf; |
| 280 | 343 |
| 281 template <PretenureFlag kPretenure> | 344 template <PretenureFlag kPretenure> |
| 282 struct AllocateOperator final : public Operator1<PretenureFlag> { | 345 struct AllocateOperator final : public Operator1<PretenureFlag> { |
| 283 AllocateOperator() | 346 AllocateOperator() |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 #define GET_FROM_CACHE(Name, properties, input_count) \ | 382 #define GET_FROM_CACHE(Name, properties, input_count) \ |
| 320 const Operator* SimplifiedOperatorBuilder::Name() { return &cache_.k##Name; } | 383 const Operator* SimplifiedOperatorBuilder::Name() { return &cache_.k##Name; } |
| 321 PURE_OP_LIST(GET_FROM_CACHE) | 384 PURE_OP_LIST(GET_FROM_CACHE) |
| 322 #undef GET_FROM_CACHE | 385 #undef GET_FROM_CACHE |
| 323 | 386 |
| 324 #define GET_FROM_CACHE(Name) \ | 387 #define GET_FROM_CACHE(Name) \ |
| 325 const Operator* SimplifiedOperatorBuilder::Name() { return &cache_.k##Name; } | 388 const Operator* SimplifiedOperatorBuilder::Name() { return &cache_.k##Name; } |
| 326 CHECKED_OP_LIST(GET_FROM_CACHE) | 389 CHECKED_OP_LIST(GET_FROM_CACHE) |
| 327 #undef GET_FROM_CACHE | 390 #undef GET_FROM_CACHE |
| 328 | 391 |
| 392 const Operator* SimplifiedOperatorBuilder::CheckFloat64Hole( |
| 393 CheckFloat64HoleMode mode) { |
| 394 switch (mode) { |
| 395 case CheckFloat64HoleMode::kAllowReturnHole: |
| 396 return &cache_.kCheckFloat64HoleAllowReturnHoleOperator; |
| 397 case CheckFloat64HoleMode::kNeverReturnHole: |
| 398 return &cache_.kCheckFloat64HoleNeverReturnHoleOperator; |
| 399 } |
| 400 UNREACHABLE(); |
| 401 return nullptr; |
| 402 } |
| 403 |
| 404 const Operator* SimplifiedOperatorBuilder::CheckTaggedHole( |
| 405 CheckTaggedHoleMode mode) { |
| 406 switch (mode) { |
| 407 case CheckTaggedHoleMode::kConvertHoleToUndefined: |
| 408 return &cache_.kCheckTaggedHoleConvertHoleToUndefinedOperator; |
| 409 case CheckTaggedHoleMode::kNeverReturnHole: |
| 410 return &cache_.kCheckTaggedHoleNeverReturnHoleOperator; |
| 411 } |
| 412 UNREACHABLE(); |
| 413 return nullptr; |
| 414 } |
| 415 |
| 329 const Operator* SimplifiedOperatorBuilder::CheckIf() { | 416 const Operator* SimplifiedOperatorBuilder::CheckIf() { |
| 330 return &cache_.kCheckIf; | 417 return &cache_.kCheckIf; |
| 331 } | 418 } |
| 332 | 419 |
| 333 const Operator* SimplifiedOperatorBuilder::ReferenceEqual(Type* type) { | 420 const Operator* SimplifiedOperatorBuilder::ReferenceEqual(Type* type) { |
| 334 return new (zone()) Operator(IrOpcode::kReferenceEqual, | 421 return new (zone()) Operator(IrOpcode::kReferenceEqual, |
| 335 Operator::kCommutative | Operator::kPure, | 422 Operator::kCommutative | Operator::kPure, |
| 336 "ReferenceEqual", 2, 0, 0, 1, 0, 0); | 423 "ReferenceEqual", 2, 0, 0, 1, 0, 0); |
| 337 } | 424 } |
| 338 | 425 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 Operator1<Type>(IrOpcode::k##Name, Operator::kNoThrow | properties, \ | 505 Operator1<Type>(IrOpcode::k##Name, Operator::kNoThrow | properties, \ |
| 419 #Name, value_input_count, 1, control_input_count, \ | 506 #Name, value_input_count, 1, control_input_count, \ |
| 420 output_count, 1, 0, access); \ | 507 output_count, 1, 0, access); \ |
| 421 } | 508 } |
| 422 ACCESS_OP_LIST(ACCESS) | 509 ACCESS_OP_LIST(ACCESS) |
| 423 #undef ACCESS | 510 #undef ACCESS |
| 424 | 511 |
| 425 } // namespace compiler | 512 } // namespace compiler |
| 426 } // namespace internal | 513 } // namespace internal |
| 427 } // namespace v8 | 514 } // namespace v8 |
| OLD | NEW |