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

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

Issue 21356002: Improve instruction creating/adding shorthand in HGraphBuilder (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback Created 7 years, 4 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
« no previous file with comments | « src/hydrogen-instructions.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1073 matching lines...) Expand 10 before | Expand all | Expand 10 after
1084 } else { 1084 } else {
1085 return; 1085 return;
1086 } 1086 }
1087 1087
1088 ReplaceAllUsesWith(index()); 1088 ReplaceAllUsesWith(index());
1089 1089
1090 HValue* current_index = decomposition.base(); 1090 HValue* current_index = decomposition.base();
1091 int actual_offset = decomposition.offset() + offset(); 1091 int actual_offset = decomposition.offset() + offset();
1092 int actual_scale = decomposition.scale() + scale(); 1092 int actual_scale = decomposition.scale() + scale();
1093 1093
1094 Zone* zone = block()->graph()->zone();
1095 HValue* context = block()->graph()->GetInvalidContext();
1094 if (actual_offset != 0) { 1096 if (actual_offset != 0) {
1095 HConstant* add_offset = new(block()->graph()->zone()) HConstant( 1097 HConstant* add_offset = HConstant::New(zone, context, actual_offset);
1096 actual_offset, index()->representation());
1097 add_offset->InsertBefore(this); 1098 add_offset->InsertBefore(this);
1098 HInstruction* add = HAdd::New(block()->graph()->zone(), 1099 HInstruction* add = HAdd::New(zone, context,
1099 block()->graph()->GetInvalidContext(), current_index, add_offset); 1100 current_index, add_offset);
1100 add->InsertBefore(this); 1101 add->InsertBefore(this);
1101 add->AssumeRepresentation(index()->representation()); 1102 add->AssumeRepresentation(index()->representation());
1102 add->ClearFlag(kCanOverflow); 1103 add->ClearFlag(kCanOverflow);
1103 current_index = add; 1104 current_index = add;
1104 } 1105 }
1105 1106
1106 if (actual_scale != 0) { 1107 if (actual_scale != 0) {
1107 HConstant* sar_scale = new(block()->graph()->zone()) HConstant( 1108 HConstant* sar_scale = HConstant::New(zone, context, actual_scale);
1108 actual_scale, index()->representation());
1109 sar_scale->InsertBefore(this); 1109 sar_scale->InsertBefore(this);
1110 HInstruction* sar = HSar::New(block()->graph()->zone(), 1110 HInstruction* sar = HSar::New(zone, context,
1111 block()->graph()->GetInvalidContext(), current_index, sar_scale); 1111 current_index, sar_scale);
1112 sar->InsertBefore(this); 1112 sar->InsertBefore(this);
1113 sar->AssumeRepresentation(index()->representation()); 1113 sar->AssumeRepresentation(index()->representation());
1114 current_index = sar; 1114 current_index = sar;
1115 } 1115 }
1116 1116
1117 SetOperandAt(0, current_index); 1117 SetOperandAt(0, current_index);
1118 1118
1119 base_ = NULL; 1119 base_ = NULL;
1120 offset_ = 0; 1120 offset_ = 0;
1121 scale_ = 0; 1121 scale_ = 0;
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after
1605 1605
1606 // Insert the new values in the graph. 1606 // Insert the new values in the graph.
1607 if (new_left->IsInstruction() && 1607 if (new_left->IsInstruction() &&
1608 !HInstruction::cast(new_left)->IsLinked()) { 1608 !HInstruction::cast(new_left)->IsLinked()) {
1609 HInstruction::cast(new_left)->InsertBefore(this); 1609 HInstruction::cast(new_left)->InsertBefore(this);
1610 } 1610 }
1611 if (new_right->IsInstruction() && 1611 if (new_right->IsInstruction() &&
1612 !HInstruction::cast(new_right)->IsLinked()) { 1612 !HInstruction::cast(new_right)->IsLinked()) {
1613 HInstruction::cast(new_right)->InsertBefore(this); 1613 HInstruction::cast(new_right)->InsertBefore(this);
1614 } 1614 }
1615 HMathFloorOfDiv* instr = new(block()->zone()) 1615 HMathFloorOfDiv* instr =
1616 HMathFloorOfDiv(context(), new_left, new_right); 1616 HMathFloorOfDiv::New(block()->zone(), context(), new_left, new_right);
1617 // Replace this HMathFloor instruction by the new HMathFloorOfDiv. 1617 // Replace this HMathFloor instruction by the new HMathFloorOfDiv.
1618 instr->InsertBefore(this); 1618 instr->InsertBefore(this);
1619 ReplaceAllUsesWith(instr); 1619 ReplaceAllUsesWith(instr);
1620 Kill(); 1620 Kill();
1621 // We know the division had no other uses than this HMathFloor. Delete it. 1621 // We know the division had no other uses than this HMathFloor. Delete it.
1622 // Dead code elimination will deal with |left| and |right| if 1622 // Dead code elimination will deal with |left| and |right| if
1623 // appropriate. 1623 // appropriate.
1624 hdiv->DeleteAndReplaceWith(NULL); 1624 hdiv->DeleteAndReplaceWith(NULL);
1625 1625
1626 // Return NULL to remove this instruction from the graph. 1626 // Return NULL to remove this instruction from the graph.
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after
2122 2122
2123 void InductionVariableData::ChecksRelatedToLength::UseNewIndexInCurrentBlock( 2123 void InductionVariableData::ChecksRelatedToLength::UseNewIndexInCurrentBlock(
2124 Token::Value token, 2124 Token::Value token,
2125 int32_t mask, 2125 int32_t mask,
2126 HValue* index_base, 2126 HValue* index_base,
2127 HValue* context) { 2127 HValue* context) {
2128 ASSERT(first_check_in_block() != NULL); 2128 ASSERT(first_check_in_block() != NULL);
2129 HValue* previous_index = first_check_in_block()->index(); 2129 HValue* previous_index = first_check_in_block()->index();
2130 ASSERT(context != NULL); 2130 ASSERT(context != NULL);
2131 2131
2132 set_added_constant(new(index_base->block()->graph()->zone()) HConstant( 2132 Zone* zone = index_base->block()->graph()->zone();
2133 mask, index_base->representation())); 2133 set_added_constant(HConstant::New(zone, context, mask));
2134 if (added_index() != NULL) { 2134 if (added_index() != NULL) {
2135 added_constant()->InsertBefore(added_index()); 2135 added_constant()->InsertBefore(added_index());
2136 } else { 2136 } else {
2137 added_constant()->InsertBefore(first_check_in_block()); 2137 added_constant()->InsertBefore(first_check_in_block());
2138 } 2138 }
2139 2139
2140 if (added_index() == NULL) { 2140 if (added_index() == NULL) {
2141 first_check_in_block()->ReplaceAllUsesWith(first_check_in_block()->index()); 2141 first_check_in_block()->ReplaceAllUsesWith(first_check_in_block()->index());
2142 HInstruction* new_index = HBitwise::New( 2142 HInstruction* new_index = HBitwise::New(zone, context, token, index_base,
2143 index_base->block()->graph()->zone(), 2143 added_constant());
2144 token, context, index_base, added_constant());
2145 ASSERT(new_index->IsBitwise()); 2144 ASSERT(new_index->IsBitwise());
2146 new_index->ClearAllSideEffects(); 2145 new_index->ClearAllSideEffects();
2147 new_index->AssumeRepresentation(Representation::Integer32()); 2146 new_index->AssumeRepresentation(Representation::Integer32());
2148 set_added_index(HBitwise::cast(new_index)); 2147 set_added_index(HBitwise::cast(new_index));
2149 added_index()->InsertBefore(first_check_in_block()); 2148 added_index()->InsertBefore(first_check_in_block());
2150 } 2149 }
2151 ASSERT(added_index()->op() == token); 2150 ASSERT(added_index()->op() == token);
2152 2151
2153 added_index()->SetOperandAt(1, index_base); 2152 added_index()->SetOperandAt(1, index_base);
2154 added_index()->SetOperandAt(2, added_constant()); 2153 added_index()->SetOperandAt(2, added_constant());
(...skipping 1119 matching lines...) Expand 10 before | Expand all | Expand 10 after
3274 // We don't have an easy way to handle both a call (to the generic stub) and 3273 // We don't have an easy way to handle both a call (to the generic stub) and
3275 // a deopt in the same hydrogen instruction, so in this case we don't add 3274 // a deopt in the same hydrogen instruction, so in this case we don't add
3276 // the negative lookups which can deopt - just let the generic stub handle 3275 // the negative lookups which can deopt - just let the generic stub handle
3277 // them. 3276 // them.
3278 SetAllSideEffects(); 3277 SetAllSideEffects();
3279 need_generic_ = true; 3278 need_generic_ = true;
3280 } 3279 }
3281 } 3280 }
3282 3281
3283 3282
3284 HCheckMaps* HCheckMaps::New(HValue* value, 3283 HCheckMaps* HCheckMaps::New(Zone* zone,
3284 HValue* context,
3285 HValue* value,
3285 Handle<Map> map, 3286 Handle<Map> map,
3286 Zone* zone,
3287 CompilationInfo* info, 3287 CompilationInfo* info,
3288 HValue* typecheck) { 3288 HValue* typecheck) {
3289 HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck); 3289 HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck);
3290 check_map->map_set_.Add(map, zone); 3290 check_map->map_set_.Add(map, zone);
3291 if (map->CanOmitMapChecks() && 3291 if (map->CanOmitMapChecks() &&
3292 value->IsConstant() && 3292 value->IsConstant() &&
3293 HConstant::cast(value)->InstanceOf(map)) { 3293 HConstant::cast(value)->InstanceOf(map)) {
3294 check_map->omit(info); 3294 check_map->omit(info);
3295 } 3295 }
3296 return check_map; 3296 return check_map;
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
3462 if (key()->IsLoadKeyed()) { 3462 if (key()->IsLoadKeyed()) {
3463 HLoadKeyed* key_load = HLoadKeyed::cast(key()); 3463 HLoadKeyed* key_load = HLoadKeyed::cast(key());
3464 if (key_load->elements()->IsForInCacheArray()) { 3464 if (key_load->elements()->IsForInCacheArray()) {
3465 HForInCacheArray* names_cache = 3465 HForInCacheArray* names_cache =
3466 HForInCacheArray::cast(key_load->elements()); 3466 HForInCacheArray::cast(key_load->elements());
3467 3467
3468 if (names_cache->enumerable() == object()) { 3468 if (names_cache->enumerable() == object()) {
3469 HForInCacheArray* index_cache = 3469 HForInCacheArray* index_cache =
3470 names_cache->index_cache(); 3470 names_cache->index_cache();
3471 HCheckMapValue* map_check = 3471 HCheckMapValue* map_check =
3472 new(block()->zone()) HCheckMapValue(object(), names_cache->map()); 3472 HCheckMapValue::New(block()->graph()->zone(),
3473 HInstruction* index = new(block()->zone()) HLoadKeyed( 3473 block()->graph()->GetInvalidContext(),
3474 object(),
3475 names_cache->map());
3476 HInstruction* index = HLoadKeyed::New(
3477 block()->graph()->zone(),
3478 block()->graph()->GetInvalidContext(),
3474 index_cache, 3479 index_cache,
3475 key_load->key(), 3480 key_load->key(),
3476 key_load->key(), 3481 key_load->key(),
3477 key_load->elements_kind()); 3482 key_load->elements_kind());
3478 map_check->InsertBefore(this); 3483 map_check->InsertBefore(this);
3479 index->InsertBefore(this); 3484 index->InsertBefore(this);
3480 HLoadFieldByIndex* load = new(block()->zone()) HLoadFieldByIndex( 3485 HLoadFieldByIndex* load = new(block()->zone()) HLoadFieldByIndex(
3481 object(), index); 3486 object(), index);
3482 load->InsertBefore(this); 3487 load->InsertBefore(this);
3483 return load; 3488 return load;
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
3696 if (new_dominator_size > Page::kMaxNonCodeHeapObjectSize) { 3701 if (new_dominator_size > Page::kMaxNonCodeHeapObjectSize) {
3697 if (FLAG_trace_allocation_folding) { 3702 if (FLAG_trace_allocation_folding) {
3698 PrintF("#%d (%s) cannot fold into #%d (%s) due to size: %d\n", 3703 PrintF("#%d (%s) cannot fold into #%d (%s) due to size: %d\n",
3699 id(), Mnemonic(), dominator->id(), dominator->Mnemonic(), 3704 id(), Mnemonic(), dominator->id(), dominator->Mnemonic(),
3700 new_dominator_size); 3705 new_dominator_size);
3701 } 3706 }
3702 return; 3707 return;
3703 } 3708 }
3704 HBasicBlock* block = dominator->block(); 3709 HBasicBlock* block = dominator->block();
3705 Zone* zone = block->zone(); 3710 Zone* zone = block->zone();
3706 HInstruction* new_dominator_size_constant = new(zone) HConstant( 3711 HInstruction* new_dominator_size_constant =
3707 new_dominator_size); 3712 HConstant::New(zone, context(), new_dominator_size);
3708 new_dominator_size_constant->InsertBefore(dominator_allocate_instr); 3713 new_dominator_size_constant->InsertBefore(dominator_allocate_instr);
3709 dominator_allocate_instr->UpdateSize(new_dominator_size_constant); 3714 dominator_allocate_instr->UpdateSize(new_dominator_size_constant);
3710 3715
3711 #ifdef VERIFY_HEAP 3716 #ifdef VERIFY_HEAP
3712 if (FLAG_verify_heap) { 3717 if (FLAG_verify_heap) {
3713 dominator_allocate_instr->MakePrefillWithFiller(); 3718 dominator_allocate_instr->MakePrefillWithFiller();
3714 } 3719 }
3715 #endif 3720 #endif
3716 3721
3717 // After that replace the dominated allocate instruction. 3722 // After that replace the dominated allocate instruction.
3718 HInstruction* dominated_allocate_instr = 3723 HInstruction* dominated_allocate_instr =
3719 new(zone) HInnerAllocatedObject(dominator_allocate_instr, 3724 HInnerAllocatedObject::New(zone,
3720 dominator_size_constant, 3725 context(),
3721 type()); 3726 dominator_allocate_instr,
3727 dominator_size_constant,
3728 type());
3722 dominated_allocate_instr->InsertBefore(this); 3729 dominated_allocate_instr->InsertBefore(this);
3723 DeleteAndReplaceWith(dominated_allocate_instr); 3730 DeleteAndReplaceWith(dominated_allocate_instr);
3724 if (FLAG_trace_allocation_folding) { 3731 if (FLAG_trace_allocation_folding) {
3725 PrintF("#%d (%s) folded into #%d (%s)\n", 3732 PrintF("#%d (%s) folded into #%d (%s)\n",
3726 id(), Mnemonic(), dominator->id(), dominator->Mnemonic()); 3733 id(), Mnemonic(), dominator->id(), dominator->Mnemonic());
3727 } 3734 }
3728 } 3735 }
3729 3736
3730 3737
3731 void HAllocate::PrintDataTo(StringStream* stream) { 3738 void HAllocate::PrintDataTo(StringStream* stream) {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
3849 return false; 3856 return false;
3850 } 3857 }
3851 if (HChange::cast(value())->value()->type().IsSmi()) { 3858 if (HChange::cast(value())->value()->type().IsSmi()) {
3852 return false; 3859 return false;
3853 } 3860 }
3854 } 3861 }
3855 return true; 3862 return true;
3856 } 3863 }
3857 3864
3858 3865
3859 #define H_CONSTANT_INT(val) \ 3866 #define H_CONSTANT_INT(val) \
3860 new(zone) HConstant(static_cast<int32_t>(val)) 3867 HConstant::New(zone, context, static_cast<int32_t>(val))
3861 #define H_CONSTANT_DOUBLE(val) \ 3868 #define H_CONSTANT_DOUBLE(val) \
3862 new(zone) HConstant(static_cast<double>(val), Representation::Double()) 3869 HConstant::New(zone, context, static_cast<double>(val))
3863 3870
3864 #define DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HInstr, op) \ 3871 #define DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HInstr, op) \
3865 HInstruction* HInstr::New( \ 3872 HInstruction* HInstr::New( \
3866 Zone* zone, HValue* context, HValue* left, HValue* right) { \ 3873 Zone* zone, HValue* context, HValue* left, HValue* right) { \
3867 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { \ 3874 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { \
3868 HConstant* c_left = HConstant::cast(left); \ 3875 HConstant* c_left = HConstant::cast(left); \
3869 HConstant* c_right = HConstant::cast(right); \ 3876 HConstant* c_right = HConstant::cast(right); \
3870 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \ 3877 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \
3871 double double_res = c_left->DoubleValue() op c_right->DoubleValue(); \ 3878 double double_res = c_left->DoubleValue() op c_right->DoubleValue(); \
3872 if (TypeInfo::IsInt32Double(double_res)) { \ 3879 if (TypeInfo::IsInt32Double(double_res)) { \
3873 return H_CONSTANT_INT(double_res); \ 3880 return H_CONSTANT_INT(double_res); \
3874 } \ 3881 } \
3875 return H_CONSTANT_DOUBLE(double_res); \ 3882 return H_CONSTANT_DOUBLE(double_res); \
3876 } \ 3883 } \
3877 } \ 3884 } \
3878 return new(zone) HInstr(context, left, right); \ 3885 return new(zone) HInstr(context, left, right); \
3879 } 3886 }
3880 3887
3881 3888
3882 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HAdd, +) 3889 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HAdd, +)
3883 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HMul, *) 3890 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HMul, *)
3884 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HSub, -) 3891 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HSub, -)
3885 3892
3886 #undef DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR 3893 #undef DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR
3887 3894
3888 3895
3889 HInstruction* HStringAdd::New(Zone* zone, 3896 HInstruction* HStringAdd::New(Zone* zone,
3890 HValue* context, 3897 HValue* context,
3891 HValue* left, 3898 HValue* left,
3892 HValue* right, 3899 HValue* right,
3893 StringAddFlags flags) { 3900 StringAddFlags flags) {
3894 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { 3901 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
3895 HConstant* c_right = HConstant::cast(right); 3902 HConstant* c_right = HConstant::cast(right);
3896 HConstant* c_left = HConstant::cast(left); 3903 HConstant* c_left = HConstant::cast(left);
3897 if (c_left->HasStringValue() && c_right->HasStringValue()) { 3904 if (c_left->HasStringValue() && c_right->HasStringValue()) {
3898 Handle<String> concat = zone->isolate()->factory()->NewFlatConcatString( 3905 Handle<String> concat = zone->isolate()->factory()->NewFlatConcatString(
3899 c_left->StringValue(), c_right->StringValue()); 3906 c_left->StringValue(), c_right->StringValue());
3900 return new(zone) HConstant(concat, Representation::Tagged()); 3907 return HConstant::New(zone, context, concat);
3901 } 3908 }
3902 } 3909 }
3903 return new(zone) HStringAdd(context, left, right, flags); 3910 return new(zone) HStringAdd(context, left, right, flags);
3904 } 3911 }
3905 3912
3906 3913
3907 HInstruction* HStringCharFromCode::New( 3914 HInstruction* HStringCharFromCode::New(
3908 Zone* zone, HValue* context, HValue* char_code) { 3915 Zone* zone, HValue* context, HValue* char_code) {
3909 if (FLAG_fold_constants && char_code->IsConstant()) { 3916 if (FLAG_fold_constants && char_code->IsConstant()) {
3910 HConstant* c_code = HConstant::cast(char_code); 3917 HConstant* c_code = HConstant::cast(char_code);
3911 Isolate* isolate = Isolate::Current(); 3918 Isolate* isolate = Isolate::Current();
3912 if (c_code->HasNumberValue()) { 3919 if (c_code->HasNumberValue()) {
3913 if (std::isfinite(c_code->DoubleValue())) { 3920 if (std::isfinite(c_code->DoubleValue())) {
3914 uint32_t code = c_code->NumberValueAsInteger32() & 0xffff; 3921 uint32_t code = c_code->NumberValueAsInteger32() & 0xffff;
3915 return new(zone) HConstant(LookupSingleCharacterStringFromCode(isolate, 3922 return HConstant::New(zone, context,
3916 code), 3923 LookupSingleCharacterStringFromCode(isolate, code));
3917 Representation::Tagged());
3918 } 3924 }
3919 return new(zone) HConstant(isolate->factory()->empty_string(), 3925 return HConstant::New(zone, context, isolate->factory()->empty_string());
3920 Representation::Tagged());
3921 } 3926 }
3922 } 3927 }
3923 return new(zone) HStringCharFromCode(context, char_code); 3928 return new(zone) HStringCharFromCode(context, char_code);
3924 } 3929 }
3925 3930
3926 3931
3927 HInstruction* HStringLength::New(Zone* zone, HValue* string) { 3932 HInstruction* HStringLength::New(Zone* zone, HValue* context, HValue* string) {
3928 if (FLAG_fold_constants && string->IsConstant()) { 3933 if (FLAG_fold_constants && string->IsConstant()) {
3929 HConstant* c_string = HConstant::cast(string); 3934 HConstant* c_string = HConstant::cast(string);
3930 if (c_string->HasStringValue()) { 3935 if (c_string->HasStringValue()) {
3931 return new(zone) HConstant(c_string->StringValue()->length()); 3936 return HConstant::New(zone, context, c_string->StringValue()->length());
3932 } 3937 }
3933 } 3938 }
3934 return new(zone) HStringLength(string); 3939 return new(zone) HStringLength(string);
3935 } 3940 }
3936 3941
3937 3942
3938 HInstruction* HUnaryMathOperation::New( 3943 HInstruction* HUnaryMathOperation::New(
3939 Zone* zone, HValue* context, HValue* value, BuiltinFunctionId op) { 3944 Zone* zone, HValue* context, HValue* value, BuiltinFunctionId op) {
3940 do { 3945 do {
3941 if (!FLAG_fold_constants) break; 3946 if (!FLAG_fold_constants) break;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
3996 return H_CONSTANT_DOUBLE(floor(d)); 4001 return H_CONSTANT_DOUBLE(floor(d));
3997 default: 4002 default:
3998 UNREACHABLE(); 4003 UNREACHABLE();
3999 break; 4004 break;
4000 } 4005 }
4001 } while (false); 4006 } while (false);
4002 return new(zone) HUnaryMathOperation(context, value, op); 4007 return new(zone) HUnaryMathOperation(context, value, op);
4003 } 4008 }
4004 4009
4005 4010
4006 HInstruction* HPower::New(Zone* zone, HValue* left, HValue* right) { 4011 HInstruction* HPower::New(Zone* zone,
4012 HValue* context,
4013 HValue* left,
4014 HValue* right) {
4007 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { 4015 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
4008 HConstant* c_left = HConstant::cast(left); 4016 HConstant* c_left = HConstant::cast(left);
4009 HConstant* c_right = HConstant::cast(right); 4017 HConstant* c_right = HConstant::cast(right);
4010 if (c_left->HasNumberValue() && c_right->HasNumberValue()) { 4018 if (c_left->HasNumberValue() && c_right->HasNumberValue()) {
4011 double result = power_helper(c_left->DoubleValue(), 4019 double result = power_helper(c_left->DoubleValue(),
4012 c_right->DoubleValue()); 4020 c_right->DoubleValue());
4013 return H_CONSTANT_DOUBLE(std::isnan(result) ? OS::nan_value() : result); 4021 return H_CONSTANT_DOUBLE(std::isnan(result) ? OS::nan_value() : result);
4014 } 4022 }
4015 } 4023 }
4016 return new(zone) HPower(left, right); 4024 return new(zone) HPower(left, right);
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
4095 Double(c_right->DoubleValue()).Sign(); // Right could be -0. 4103 Double(c_right->DoubleValue()).Sign(); // Right could be -0.
4096 return H_CONSTANT_DOUBLE(sign * V8_INFINITY); 4104 return H_CONSTANT_DOUBLE(sign * V8_INFINITY);
4097 } 4105 }
4098 } 4106 }
4099 } 4107 }
4100 return new(zone) HDiv(context, left, right); 4108 return new(zone) HDiv(context, left, right);
4101 } 4109 }
4102 4110
4103 4111
4104 HInstruction* HBitwise::New( 4112 HInstruction* HBitwise::New(
4105 Zone* zone, Token::Value op, HValue* context, HValue* left, HValue* right) { 4113 Zone* zone, HValue* context, Token::Value op, HValue* left, HValue* right) {
4106 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { 4114 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
4107 HConstant* c_left = HConstant::cast(left); 4115 HConstant* c_left = HConstant::cast(left);
4108 HConstant* c_right = HConstant::cast(right); 4116 HConstant* c_right = HConstant::cast(right);
4109 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { 4117 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {
4110 int32_t result; 4118 int32_t result;
4111 int32_t v_left = c_left->NumberValueAsInteger32(); 4119 int32_t v_left = c_left->NumberValueAsInteger32();
4112 int32_t v_right = c_right->NumberValueAsInteger32(); 4120 int32_t v_right = c_right->NumberValueAsInteger32();
4113 switch (op) { 4121 switch (op) {
4114 case Token::BIT_XOR: 4122 case Token::BIT_XOR:
4115 result = v_left ^ v_right; 4123 result = v_left ^ v_right;
4116 break; 4124 break;
4117 case Token::BIT_AND: 4125 case Token::BIT_AND:
4118 result = v_left & v_right; 4126 result = v_left & v_right;
4119 break; 4127 break;
4120 case Token::BIT_OR: 4128 case Token::BIT_OR:
4121 result = v_left | v_right; 4129 result = v_left | v_right;
4122 break; 4130 break;
4123 default: 4131 default:
4124 result = 0; // Please the compiler. 4132 result = 0; // Please the compiler.
4125 UNREACHABLE(); 4133 UNREACHABLE();
4126 } 4134 }
4127 return H_CONSTANT_INT(result); 4135 return H_CONSTANT_INT(result);
4128 } 4136 }
4129 } 4137 }
4130 return new(zone) HBitwise(op, context, left, right); 4138 return new(zone) HBitwise(context, op, left, right);
4131 } 4139 }
4132 4140
4133 4141
4134 #define DEFINE_NEW_H_BITWISE_INSTR(HInstr, result) \ 4142 #define DEFINE_NEW_H_BITWISE_INSTR(HInstr, result) \
4135 HInstruction* HInstr::New( \ 4143 HInstruction* HInstr::New( \
4136 Zone* zone, HValue* context, HValue* left, HValue* right) { \ 4144 Zone* zone, HValue* context, HValue* left, HValue* right) { \
4137 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { \ 4145 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { \
4138 HConstant* c_left = HConstant::cast(left); \ 4146 HConstant* c_left = HConstant::cast(left); \
4139 HConstant* c_right = HConstant::cast(right); \ 4147 HConstant* c_right = HConstant::cast(right); \
4140 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \ 4148 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
4189 for (int i = 0; i < OperandCount(); ++i) { 4197 for (int i = 0; i < OperandCount(); ++i) {
4190 if (!OperandAt(i)->IsConstant()) return; 4198 if (!OperandAt(i)->IsConstant()) return;
4191 } 4199 }
4192 HGraph* graph = block()->graph(); 4200 HGraph* graph = block()->graph();
4193 for (int i = 0; i < OperandCount(); ++i) { 4201 for (int i = 0; i < OperandCount(); ++i) {
4194 HConstant* operand = HConstant::cast(OperandAt(i)); 4202 HConstant* operand = HConstant::cast(OperandAt(i));
4195 if (operand->HasInteger32Value()) { 4203 if (operand->HasInteger32Value()) {
4196 continue; 4204 continue;
4197 } else if (operand->HasDoubleValue()) { 4205 } else if (operand->HasDoubleValue()) {
4198 HConstant* integer_input = 4206 HConstant* integer_input =
4199 new(graph->zone()) HConstant(DoubleToInt32(operand->DoubleValue())); 4207 HConstant::New(graph->zone(), graph->GetInvalidContext(),
4208 DoubleToInt32(operand->DoubleValue()));
4200 integer_input->InsertAfter(operand); 4209 integer_input->InsertAfter(operand);
4201 SetOperandAt(i, integer_input); 4210 SetOperandAt(i, integer_input);
4202 } else if (operand == graph->GetConstantTrue()) { 4211 } else if (operand == graph->GetConstantTrue()) {
4203 SetOperandAt(i, graph->GetConstant1()); 4212 SetOperandAt(i, graph->GetConstant1());
4204 } else { 4213 } else {
4205 // This catches |false|, |undefined|, strings and objects. 4214 // This catches |false|, |undefined|, strings and objects.
4206 SetOperandAt(i, graph->GetConstant0()); 4215 SetOperandAt(i, graph->GetConstant0());
4207 } 4216 }
4208 } 4217 }
4209 // Overwrite observed input representations because they are likely Tagged. 4218 // Overwrite observed input representations because they are likely Tagged.
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
4460 break; 4469 break;
4461 case kExternalMemory: 4470 case kExternalMemory:
4462 stream->Add("[external-memory]"); 4471 stream->Add("[external-memory]");
4463 break; 4472 break;
4464 } 4473 }
4465 4474
4466 stream->Add("@%d", offset()); 4475 stream->Add("@%d", offset());
4467 } 4476 }
4468 4477
4469 } } // namespace v8::internal 4478 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen-instructions.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698