Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/hydrogen-instructions.h

Issue 24350014: Use Unique<Object> in HConstant and remove UniqueValueId. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 bool MulAndCheckOverflow(const Representation& r, Range* other); 299 bool MulAndCheckOverflow(const Representation& r, Range* other);
300 300
301 private: 301 private:
302 int32_t lower_; 302 int32_t lower_;
303 int32_t upper_; 303 int32_t upper_;
304 Range* next_; 304 Range* next_;
305 bool can_be_minus_zero_; 305 bool can_be_minus_zero_;
306 }; 306 };
307 307
308 308
309 class UniqueValueId V8_FINAL {
310 public:
311 UniqueValueId() : raw_address_(NULL) { }
312
313 explicit UniqueValueId(Handle<Object> handle) {
314 ASSERT(!AllowHeapAllocation::IsAllowed());
315 static const Address kEmptyHandleSentinel = reinterpret_cast<Address>(1);
316 if (handle.is_null()) {
317 raw_address_ = kEmptyHandleSentinel;
318 } else {
319 raw_address_ = reinterpret_cast<Address>(*handle);
320 ASSERT_NE(kEmptyHandleSentinel, raw_address_);
321 }
322 ASSERT(IsInitialized());
323 }
324
325 bool IsInitialized() const { return raw_address_ != NULL; }
326
327 bool operator==(const UniqueValueId& other) const {
328 ASSERT(IsInitialized() && other.IsInitialized());
329 return raw_address_ == other.raw_address_;
330 }
331
332 bool operator!=(const UniqueValueId& other) const {
333 ASSERT(IsInitialized() && other.IsInitialized());
334 return raw_address_ != other.raw_address_;
335 }
336
337 intptr_t Hashcode() const {
338 ASSERT(IsInitialized());
339 return reinterpret_cast<intptr_t>(raw_address_);
340 }
341
342 #define IMMOVABLE_UNIQUE_VALUE_ID(name) \
343 static UniqueValueId name(Heap* heap) { return UniqueValueId(heap->name()); }
344
345 IMMOVABLE_UNIQUE_VALUE_ID(free_space_map)
346 IMMOVABLE_UNIQUE_VALUE_ID(minus_zero_value)
347 IMMOVABLE_UNIQUE_VALUE_ID(nan_value)
348 IMMOVABLE_UNIQUE_VALUE_ID(undefined_value)
349 IMMOVABLE_UNIQUE_VALUE_ID(null_value)
350 IMMOVABLE_UNIQUE_VALUE_ID(true_value)
351 IMMOVABLE_UNIQUE_VALUE_ID(false_value)
352 IMMOVABLE_UNIQUE_VALUE_ID(the_hole_value)
353 IMMOVABLE_UNIQUE_VALUE_ID(empty_string)
354 IMMOVABLE_UNIQUE_VALUE_ID(empty_fixed_array)
355
356 #undef IMMOVABLE_UNIQUE_VALUE_ID
357
358 private:
359 Address raw_address_;
360
361 explicit UniqueValueId(Object* object) {
362 raw_address_ = reinterpret_cast<Address>(object);
363 ASSERT(IsInitialized());
364 }
365 };
366
367
368 class HType V8_FINAL { 309 class HType V8_FINAL {
369 public: 310 public:
370 static HType None() { return HType(kNone); } 311 static HType None() { return HType(kNone); }
371 static HType Tagged() { return HType(kTagged); } 312 static HType Tagged() { return HType(kTagged); }
372 static HType TaggedPrimitive() { return HType(kTaggedPrimitive); } 313 static HType TaggedPrimitive() { return HType(kTaggedPrimitive); }
373 static HType TaggedNumber() { return HType(kTaggedNumber); } 314 static HType TaggedNumber() { return HType(kTaggedNumber); }
374 static HType Smi() { return HType(kSmi); } 315 static HType Smi() { return HType(kSmi); }
375 static HType HeapNumber() { return HType(kHeapNumber); } 316 static HType HeapNumber() { return HType(kHeapNumber); }
376 static HType String() { return HType(kString); } 317 static HType String() { return HType(kString); }
377 static HType Boolean() { return HType(kBoolean); } 318 static HType Boolean() { return HType(kBoolean); }
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 // This gives the instruction an opportunity to replace itself with an 838 // This gives the instruction an opportunity to replace itself with an
898 // instruction that does the same in some better way. To replace an 839 // instruction that does the same in some better way. To replace an
899 // instruction with a new one, first add the new instruction to the graph, 840 // instruction with a new one, first add the new instruction to the graph,
900 // then return it. Return NULL to have the instruction deleted. 841 // then return it. Return NULL to have the instruction deleted.
901 virtual HValue* Canonicalize() { return this; } 842 virtual HValue* Canonicalize() { return this; }
902 843
903 bool Equals(HValue* other); 844 bool Equals(HValue* other);
904 virtual intptr_t Hashcode(); 845 virtual intptr_t Hashcode();
905 846
906 // Compute unique ids upfront that is safe wrt GC and concurrent compilation. 847 // Compute unique ids upfront that is safe wrt GC and concurrent compilation.
907 virtual void FinalizeUniqueValueId() { } 848 virtual void FinalizeUniqueness() { }
908 849
909 // Printing support. 850 // Printing support.
910 virtual void PrintTo(StringStream* stream) = 0; 851 virtual void PrintTo(StringStream* stream) = 0;
911 void PrintNameTo(StringStream* stream); 852 void PrintNameTo(StringStream* stream);
912 void PrintTypeTo(StringStream* stream); 853 void PrintTypeTo(StringStream* stream);
913 void PrintRangeTo(StringStream* stream); 854 void PrintRangeTo(StringStream* stream);
914 void PrintChangesTo(StringStream* stream); 855 void PrintChangesTo(StringStream* stream);
915 856
916 const char* Mnemonic() const; 857 const char* Mnemonic() const;
917 858
(...skipping 1766 matching lines...) Expand 10 before | Expand all | Expand 10 after
2684 Unique<JSFunction> target = Unique<JSFunction>::CreateUninitialized(func); 2625 Unique<JSFunction> target = Unique<JSFunction>::CreateUninitialized(func);
2685 HCheckValue* check = new(zone) HCheckValue(value, target, in_new_space); 2626 HCheckValue* check = new(zone) HCheckValue(value, target, in_new_space);
2686 return check; 2627 return check;
2687 } 2628 }
2688 static HCheckValue* New(Zone* zone, HValue* context, 2629 static HCheckValue* New(Zone* zone, HValue* context,
2689 HValue* value, Unique<HeapObject> target, 2630 HValue* value, Unique<HeapObject> target,
2690 bool object_in_new_space) { 2631 bool object_in_new_space) {
2691 return new(zone) HCheckValue(value, target, object_in_new_space); 2632 return new(zone) HCheckValue(value, target, object_in_new_space);
2692 } 2633 }
2693 2634
2694 virtual void FinalizeUniqueValueId() V8_OVERRIDE { 2635 virtual void FinalizeUniqueness() V8_OVERRIDE {
2695 object_ = Unique<HeapObject>(object_.handle()); 2636 object_ = Unique<HeapObject>(object_.handle());
2696 } 2637 }
2697 2638
2698 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 2639 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
2699 return Representation::Tagged(); 2640 return Representation::Tagged();
2700 } 2641 }
2701 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 2642 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
2702 2643
2703 virtual HValue* Canonicalize() V8_OVERRIDE; 2644 virtual HValue* Canonicalize() V8_OVERRIDE;
2704 2645
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after
3290 int capture_id_; 3231 int capture_id_;
3291 }; 3232 };
3292 3233
3293 3234
3294 class HConstant V8_FINAL : public HTemplateInstruction<0> { 3235 class HConstant V8_FINAL : public HTemplateInstruction<0> {
3295 public: 3236 public:
3296 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t); 3237 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t);
3297 DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation); 3238 DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation);
3298 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double); 3239 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double);
3299 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>); 3240 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>);
3300 DECLARE_INSTRUCTION_FACTORY_P2(HConstant, Handle<Map>, UniqueValueId);
3301 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference); 3241 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference);
3302 3242
3303 static HConstant* CreateAndInsertAfter(Zone* zone, 3243 static HConstant* CreateAndInsertAfter(Zone* zone,
3304 HValue* context, 3244 HValue* context,
3305 int32_t value, 3245 int32_t value,
3306 Representation representation, 3246 Representation representation,
3307 HInstruction* instruction) { 3247 HInstruction* instruction) {
3308 HConstant* new_constant = 3248 HConstant* new_constant =
3309 HConstant::New(zone, context, value, representation); 3249 HConstant::New(zone, context, value, representation);
3310 new_constant->InsertAfter(instruction); 3250 new_constant->InsertAfter(instruction);
3311 return new_constant; 3251 return new_constant;
3312 } 3252 }
3313 3253
3314 static HConstant* CreateAndInsertBefore(Zone* zone, 3254 static HConstant* CreateAndInsertBefore(Zone* zone,
3315 HValue* context, 3255 HValue* context,
3316 int32_t value, 3256 int32_t value,
3317 Representation representation, 3257 Representation representation,
3318 HInstruction* instruction) { 3258 HInstruction* instruction) {
3319 HConstant* new_constant = 3259 HConstant* new_constant =
3320 HConstant::New(zone, context, value, representation); 3260 HConstant::New(zone, context, value, representation);
3321 new_constant->InsertBefore(instruction); 3261 new_constant->InsertBefore(instruction);
3322 return new_constant; 3262 return new_constant;
3323 } 3263 }
3324 3264
3325 Handle<Object> handle(Isolate* isolate) { 3265 Handle<Object> handle(Isolate* isolate) {
3326 if (handle_.is_null()) { 3266 if (object_.handle().is_null()) {
3327 Factory* factory = isolate->factory();
3328 // Default arguments to is_not_in_new_space depend on this heap number 3267 // Default arguments to is_not_in_new_space depend on this heap number
3329 // to be tenured so that it's guaranteed not be be located in new space. 3268 // to be tenured so that it's guaranteed not to be located in new space.
3330 handle_ = factory->NewNumber(double_value_, TENURED); 3269 object_ = Unique<Object>::CreateUninitialized(
3270 isolate->factory()->NewNumber(double_value_, TENURED));
3331 } 3271 }
3332 AllowDeferredHandleDereference smi_check; 3272 AllowDeferredHandleDereference smi_check;
3333 ASSERT(has_int32_value_ || !handle_->IsSmi()); 3273 ASSERT(has_int32_value_ || !object_.handle()->IsSmi());
3334 return handle_; 3274 return object_.handle();
3335 } 3275 }
3336 3276
3337 bool HasMap(Handle<Map> map) { 3277 bool HasMap(Handle<Map> map) {
3338 Handle<Object> constant_object = handle(map->GetIsolate()); 3278 Handle<Object> constant_object = handle(map->GetIsolate());
3339 return constant_object->IsHeapObject() && 3279 return constant_object->IsHeapObject() &&
3340 Handle<HeapObject>::cast(constant_object)->map() == *map; 3280 Handle<HeapObject>::cast(constant_object)->map() == *map;
3341 } 3281 }
3342 3282
3343 bool IsSpecialDouble() const { 3283 bool IsSpecialDouble() const {
3344 return has_double_value_ && 3284 return has_double_value_ &&
(...skipping 13 matching lines...) Expand all
3358 if (has_double_value_) { 3298 if (has_double_value_) {
3359 if (IsSpecialDouble()) { 3299 if (IsSpecialDouble()) {
3360 return true; 3300 return true;
3361 } 3301 }
3362 return false; 3302 return false;
3363 } 3303 }
3364 if (has_external_reference_value_) { 3304 if (has_external_reference_value_) {
3365 return false; 3305 return false;
3366 } 3306 }
3367 3307
3368 ASSERT(!handle_.is_null()); 3308 ASSERT(!object_.handle().is_null());
3369 Heap* heap = isolate()->heap(); 3309 Heap* heap = isolate()->heap();
3370 ASSERT(unique_id_ != UniqueValueId::minus_zero_value(heap)); 3310 ASSERT(!object_.IsKnownGlobal(heap->minus_zero_value()));
3371 ASSERT(unique_id_ != UniqueValueId::nan_value(heap)); 3311 ASSERT(!object_.IsKnownGlobal(heap->nan_value()));
3372 return unique_id_ == UniqueValueId::undefined_value(heap) || 3312 return
3373 unique_id_ == UniqueValueId::null_value(heap) || 3313 object_.IsKnownGlobal(heap->undefined_value()) ||
3374 unique_id_ == UniqueValueId::true_value(heap) || 3314 object_.IsKnownGlobal(heap->null_value()) ||
3375 unique_id_ == UniqueValueId::false_value(heap) || 3315 object_.IsKnownGlobal(heap->true_value()) ||
3376 unique_id_ == UniqueValueId::the_hole_value(heap) || 3316 object_.IsKnownGlobal(heap->false_value()) ||
3377 unique_id_ == UniqueValueId::empty_string(heap) || 3317 object_.IsKnownGlobal(heap->the_hole_value()) ||
3378 unique_id_ == UniqueValueId::empty_fixed_array(heap); 3318 object_.IsKnownGlobal(heap->empty_string()) ||
3319 object_.IsKnownGlobal(heap->empty_fixed_array());
3379 } 3320 }
3380 3321
3381 bool IsCell() const { 3322 bool IsCell() const {
3382 return is_cell_; 3323 return is_cell_;
3383 } 3324 }
3384 3325
3385 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 3326 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
3386 return Representation::None(); 3327 return Representation::None();
3387 } 3328 }
3388 3329
(...skipping 18 matching lines...) Expand all
3407 bool HasSmiValue() const { return has_smi_value_; } 3348 bool HasSmiValue() const { return has_smi_value_; }
3408 bool HasDoubleValue() const { return has_double_value_; } 3349 bool HasDoubleValue() const { return has_double_value_; }
3409 double DoubleValue() const { 3350 double DoubleValue() const {
3410 ASSERT(HasDoubleValue()); 3351 ASSERT(HasDoubleValue());
3411 return double_value_; 3352 return double_value_;
3412 } 3353 }
3413 bool IsTheHole() const { 3354 bool IsTheHole() const {
3414 if (HasDoubleValue() && FixedDoubleArray::is_the_hole_nan(double_value_)) { 3355 if (HasDoubleValue() && FixedDoubleArray::is_the_hole_nan(double_value_)) {
3415 return true; 3356 return true;
3416 } 3357 }
3417 Heap* heap = isolate()->heap(); 3358 return object_.IsKnownGlobal(isolate()->heap()->the_hole_value());
3418 if (!handle_.is_null() && *handle_ == heap->the_hole_value()) {
3419 return true;
3420 }
3421 return false;
3422 } 3359 }
3423 bool HasNumberValue() const { return has_double_value_; } 3360 bool HasNumberValue() const { return has_double_value_; }
3424 int32_t NumberValueAsInteger32() const { 3361 int32_t NumberValueAsInteger32() const {
3425 ASSERT(HasNumberValue()); 3362 ASSERT(HasNumberValue());
3426 // Irrespective of whether a numeric HConstant can be safely 3363 // Irrespective of whether a numeric HConstant can be safely
3427 // represented as an int32, we store the (in some cases lossy) 3364 // represented as an int32, we store the (in some cases lossy)
3428 // representation of the number in int32_value_. 3365 // representation of the number in int32_value_.
3429 return int32_value_; 3366 return int32_value_;
3430 } 3367 }
3431 bool HasStringValue() const { 3368 bool HasStringValue() const {
3432 if (has_double_value_ || has_int32_value_) return false; 3369 if (has_double_value_ || has_int32_value_) return false;
3433 ASSERT(!handle_.is_null()); 3370 ASSERT(!object_.handle().is_null());
3434 return type_.IsString(); 3371 return type_.IsString();
3435 } 3372 }
3436 Handle<String> StringValue() const { 3373 Handle<String> StringValue() const {
3437 ASSERT(HasStringValue()); 3374 ASSERT(HasStringValue());
3438 return Handle<String>::cast(handle_); 3375 return Handle<String>::cast(object_.handle());
3439 } 3376 }
3440 bool HasInternalizedStringValue() const { 3377 bool HasInternalizedStringValue() const {
3441 return HasStringValue() && is_internalized_string_; 3378 return HasStringValue() && is_internalized_string_;
3442 } 3379 }
3443 3380
3444 bool HasExternalReferenceValue() const { 3381 bool HasExternalReferenceValue() const {
3445 return has_external_reference_value_; 3382 return has_external_reference_value_;
3446 } 3383 }
3447 ExternalReference ExternalReferenceValue() const { 3384 ExternalReference ExternalReferenceValue() const {
3448 return external_reference_value_; 3385 return external_reference_value_;
3449 } 3386 }
3450 3387
3451 bool HasBooleanValue() const { return type_.IsBoolean(); } 3388 bool HasBooleanValue() const { return type_.IsBoolean(); }
3452 bool BooleanValue() const { return boolean_value_; } 3389 bool BooleanValue() const { return boolean_value_; }
3453 3390
3454 virtual intptr_t Hashcode() V8_OVERRIDE { 3391 virtual intptr_t Hashcode() V8_OVERRIDE {
3455 if (has_int32_value_) { 3392 if (has_int32_value_) {
3456 return static_cast<intptr_t>(int32_value_); 3393 return static_cast<intptr_t>(int32_value_);
3457 } else if (has_double_value_) { 3394 } else if (has_double_value_) {
3458 return static_cast<intptr_t>(BitCast<int64_t>(double_value_)); 3395 return static_cast<intptr_t>(BitCast<int64_t>(double_value_));
3459 } else if (has_external_reference_value_) { 3396 } else if (has_external_reference_value_) {
3460 return reinterpret_cast<intptr_t>(external_reference_value_.address()); 3397 return reinterpret_cast<intptr_t>(external_reference_value_.address());
3461 } else { 3398 } else {
3462 ASSERT(!handle_.is_null()); 3399 ASSERT(!object_.handle().is_null());
3463 return unique_id_.Hashcode(); 3400 return object_.Hashcode();
3464 } 3401 }
3465 } 3402 }
3466 3403
3467 virtual void FinalizeUniqueValueId() V8_OVERRIDE { 3404 virtual void FinalizeUniqueness() V8_OVERRIDE {
3468 if (!has_double_value_ && !has_external_reference_value_) { 3405 if (!has_double_value_ && !has_external_reference_value_) {
3469 ASSERT(!handle_.is_null()); 3406 ASSERT(!object_.handle().is_null());
3470 unique_id_ = UniqueValueId(handle_); 3407 object_ = Unique<Object>(object_.handle());
3471 } 3408 }
3472 } 3409 }
3473 3410
3474 bool UniqueValueIdsMatch(UniqueValueId other) {
3475 return !has_double_value_ && !has_external_reference_value_ &&
3476 unique_id_ == other;
3477 }
3478
3479 Unique<Object> GetUnique() const { 3411 Unique<Object> GetUnique() const {
3480 // TODO(titzer): store a Unique<HeapObject> inside the HConstant. 3412 return object_;
3481 Address raw_address = reinterpret_cast<Address>(unique_id_.Hashcode());
3482 return Unique<Object>(raw_address, handle_);
3483 } 3413 }
3484 3414
3485 #ifdef DEBUG 3415 #ifdef DEBUG
3486 virtual void Verify() V8_OVERRIDE { } 3416 virtual void Verify() V8_OVERRIDE { }
3487 #endif 3417 #endif
3488 3418
3489 DECLARE_CONCRETE_INSTRUCTION(Constant) 3419 DECLARE_CONCRETE_INSTRUCTION(Constant)
3490 3420
3491 protected: 3421 protected:
3492 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 3422 virtual Range* InferRange(Zone* zone) V8_OVERRIDE;
3493 3423
3494 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 3424 virtual bool DataEquals(HValue* other) V8_OVERRIDE {
3495 HConstant* other_constant = HConstant::cast(other); 3425 HConstant* other_constant = HConstant::cast(other);
3496 if (has_int32_value_) { 3426 if (has_int32_value_) {
3497 return other_constant->has_int32_value_ && 3427 return other_constant->has_int32_value_ &&
3498 int32_value_ == other_constant->int32_value_; 3428 int32_value_ == other_constant->int32_value_;
3499 } else if (has_double_value_) { 3429 } else if (has_double_value_) {
3500 return other_constant->has_double_value_ && 3430 return other_constant->has_double_value_ &&
3501 BitCast<int64_t>(double_value_) == 3431 BitCast<int64_t>(double_value_) ==
3502 BitCast<int64_t>(other_constant->double_value_); 3432 BitCast<int64_t>(other_constant->double_value_);
3503 } else if (has_external_reference_value_) { 3433 } else if (has_external_reference_value_) {
3504 return other_constant->has_external_reference_value_ && 3434 return other_constant->has_external_reference_value_ &&
3505 external_reference_value_ == 3435 external_reference_value_ ==
3506 other_constant->external_reference_value_; 3436 other_constant->external_reference_value_;
3507 } else { 3437 } else {
3508 ASSERT(!handle_.is_null()); 3438 ASSERT(!object_.handle().is_null());
3509 return !other_constant->handle_.is_null() && 3439 return other_constant->object_ == object_;
3510 unique_id_ == other_constant->unique_id_;
3511 } 3440 }
3512 } 3441 }
3513 3442
3514 private: 3443 private:
3515 friend class HGraph; 3444 friend class HGraph;
3516 HConstant(Handle<Object> handle, Representation r = Representation::None()); 3445 HConstant(Handle<Object> handle, Representation r = Representation::None());
3517 HConstant(int32_t value, 3446 HConstant(int32_t value,
3518 Representation r = Representation::None(), 3447 Representation r = Representation::None(),
3519 bool is_not_in_new_space = true, 3448 bool is_not_in_new_space = true,
3520 Handle<Object> optional_handle = Handle<Object>::null()); 3449 Unique<Object> optional = Unique<Object>(Handle<Object>::null()));
3521 HConstant(double value, 3450 HConstant(double value,
3522 Representation r = Representation::None(), 3451 Representation r = Representation::None(),
3523 bool is_not_in_new_space = true, 3452 bool is_not_in_new_space = true,
3524 Handle<Object> optional_handle = Handle<Object>::null()); 3453 Unique<Object> optional = Unique<Object>(Handle<Object>::null()));
3525 HConstant(Handle<Object> handle, 3454 HConstant(Unique<Object> unique,
3526 UniqueValueId unique_id,
3527 Representation r, 3455 Representation r,
3528 HType type, 3456 HType type,
3529 bool is_internalized_string, 3457 bool is_internalized_string,
3530 bool is_not_in_new_space, 3458 bool is_not_in_new_space,
3531 bool is_cell, 3459 bool is_cell,
3532 bool boolean_value); 3460 bool boolean_value);
3533 HConstant(Handle<Map> handle, 3461
3534 UniqueValueId unique_id);
3535 explicit HConstant(ExternalReference reference); 3462 explicit HConstant(ExternalReference reference);
3536 3463
3537 void Initialize(Representation r); 3464 void Initialize(Representation r);
3538 3465
3539 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 3466 virtual bool IsDeletable() const V8_OVERRIDE { return true; }
3540 3467
3541 // If this is a numerical constant, handle_ either points to to the 3468 // If this is a numerical constant, object_ either points to to the
Toon Verwaest 2013/09/24 09:17:54 points to to the -> points to the
3542 // HeapObject the constant originated from or is null. If the 3469 // HeapObject the constant originated from or is null. If the
3543 // constant is non-numeric, handle_ always points to a valid 3470 // constant is non-numeric, object_ always points to a valid
3544 // constant HeapObject. 3471 // constant HeapObject.
3545 Handle<Object> handle_; 3472 Unique<Object> object_;
3546 UniqueValueId unique_id_;
3547 3473
3548 // We store the HConstant in the most specific form safely possible. 3474 // We store the HConstant in the most specific form safely possible.
3549 // The two flags, has_int32_value_ and has_double_value_ tell us if 3475 // The two flags, has_int32_value_ and has_double_value_ tell us if
3550 // int32_value_ and double_value_ hold valid, safe representations 3476 // int32_value_ and double_value_ hold valid, safe representations
3551 // of the constant. has_int32_value_ implies has_double_value_ but 3477 // of the constant. has_int32_value_ implies has_double_value_ but
3552 // not the converse. 3478 // not the converse.
3553 bool has_smi_value_ : 1; 3479 bool has_smi_value_ : 1;
3554 bool has_int32_value_ : 1; 3480 bool has_int32_value_ : 1;
3555 bool has_double_value_ : 1; 3481 bool has_double_value_ : 1;
3556 bool has_external_reference_value_ : 1; 3482 bool has_external_reference_value_ : 1;
(...skipping 1573 matching lines...) Expand 10 before | Expand all | Expand 10 after
5130 5056
5131 Unique<Cell> cell() const { return cell_; } 5057 Unique<Cell> cell() const { return cell_; }
5132 bool RequiresHoleCheck() const; 5058 bool RequiresHoleCheck() const;
5133 5059
5134 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5060 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
5135 5061
5136 virtual intptr_t Hashcode() V8_OVERRIDE { 5062 virtual intptr_t Hashcode() V8_OVERRIDE {
5137 return cell_.Hashcode(); 5063 return cell_.Hashcode();
5138 } 5064 }
5139 5065
5140 virtual void FinalizeUniqueValueId() V8_OVERRIDE { 5066 virtual void FinalizeUniqueness() V8_OVERRIDE {
5141 cell_ = Unique<Cell>(cell_.handle()); 5067 cell_ = Unique<Cell>(cell_.handle());
5142 } 5068 }
5143 5069
5144 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5070 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
5145 return Representation::None(); 5071 return Representation::None();
5146 } 5072 }
5147 5073
5148 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) 5074 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell)
5149 5075
5150 protected: 5076 protected:
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
5428 Handle<PropertyCell>, PropertyDetails); 5354 Handle<PropertyCell>, PropertyDetails);
5429 5355
5430 Unique<PropertyCell> cell() const { return cell_; } 5356 Unique<PropertyCell> cell() const { return cell_; }
5431 bool RequiresHoleCheck() { 5357 bool RequiresHoleCheck() {
5432 return !details_.IsDontDelete() || details_.IsReadOnly(); 5358 return !details_.IsDontDelete() || details_.IsReadOnly();
5433 } 5359 }
5434 bool NeedsWriteBarrier() { 5360 bool NeedsWriteBarrier() {
5435 return StoringValueNeedsWriteBarrier(value()); 5361 return StoringValueNeedsWriteBarrier(value());
5436 } 5362 }
5437 5363
5438 virtual void FinalizeUniqueValueId() V8_OVERRIDE { 5364 virtual void FinalizeUniqueness() V8_OVERRIDE {
5439 cell_ = Unique<PropertyCell>(cell_.handle()); 5365 cell_ = Unique<PropertyCell>(cell_.handle());
5440 } 5366 }
5441 5367
5442 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 5368 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
5443 return Representation::Tagged(); 5369 return Representation::Tagged();
5444 } 5370 }
5445 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 5371 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
5446 5372
5447 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) 5373 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell)
5448 5374
(...skipping 1615 matching lines...) Expand 10 before | Expand all | Expand 10 after
7064 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 6990 virtual bool IsDeletable() const V8_OVERRIDE { return true; }
7065 }; 6991 };
7066 6992
7067 6993
7068 #undef DECLARE_INSTRUCTION 6994 #undef DECLARE_INSTRUCTION
7069 #undef DECLARE_CONCRETE_INSTRUCTION 6995 #undef DECLARE_CONCRETE_INSTRUCTION
7070 6996
7071 } } // namespace v8::internal 6997 } } // namespace v8::internal
7072 6998
7073 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 6999 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('j') | src/unique.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698