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

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

Issue 1123043002: [strong] Fix inlining issue (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 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
« no previous file with comments | « src/hydrogen-instructions.h ('k') | src/ia32/lithium-codegen-ia32.cc » ('j') | 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 // 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/double.h" 8 #include "src/double.h"
9 #include "src/factory.h" 9 #include "src/factory.h"
10 #include "src/hydrogen-infer-representation.h" 10 #include "src/hydrogen-infer-representation.h"
(...skipping 3961 matching lines...) Expand 10 before | Expand all | Expand 10 after
3972 } 3972 }
3973 3973
3974 3974
3975 #define H_CONSTANT_INT(val) \ 3975 #define H_CONSTANT_INT(val) \
3976 HConstant::New(isolate, zone, context, static_cast<int32_t>(val)) 3976 HConstant::New(isolate, zone, context, static_cast<int32_t>(val))
3977 #define H_CONSTANT_DOUBLE(val) \ 3977 #define H_CONSTANT_DOUBLE(val) \
3978 HConstant::New(isolate, zone, context, static_cast<double>(val)) 3978 HConstant::New(isolate, zone, context, static_cast<double>(val))
3979 3979
3980 #define DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HInstr, op) \ 3980 #define DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HInstr, op) \
3981 HInstruction* HInstr::New(Isolate* isolate, Zone* zone, HValue* context, \ 3981 HInstruction* HInstr::New(Isolate* isolate, Zone* zone, HValue* context, \
3982 HValue* left, HValue* right) { \ 3982 HValue* left, HValue* right, \
3983 LanguageMode language_mode) { \
3983 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { \ 3984 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { \
3984 HConstant* c_left = HConstant::cast(left); \ 3985 HConstant* c_left = HConstant::cast(left); \
3985 HConstant* c_right = HConstant::cast(right); \ 3986 HConstant* c_right = HConstant::cast(right); \
3986 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \ 3987 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \
3987 double double_res = c_left->DoubleValue() op c_right->DoubleValue(); \ 3988 double double_res = c_left->DoubleValue() op c_right->DoubleValue(); \
3988 if (IsInt32Double(double_res)) { \ 3989 if (IsInt32Double(double_res)) { \
3989 return H_CONSTANT_INT(double_res); \ 3990 return H_CONSTANT_INT(double_res); \
3990 } \ 3991 } \
3991 return H_CONSTANT_DOUBLE(double_res); \ 3992 return H_CONSTANT_DOUBLE(double_res); \
3992 } \ 3993 } \
3993 } \ 3994 } \
3994 return new (zone) HInstr(context, left, right); \ 3995 return new (zone) HInstr(context, left, right, language_mode); \
3995 } 3996 }
3996 3997
3997 3998
3998 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HAdd, +) 3999 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HAdd, +)
3999 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HMul, *) 4000 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HMul, *)
4000 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HSub, -) 4001 DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HSub, -)
4001 4002
4002 #undef DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR 4003 #undef DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR
4003 4004
4004 4005
4005 HInstruction* HStringAdd::New(Isolate* isolate, Zone* zone, HValue* context, 4006 HInstruction* HStringAdd::New(Isolate* isolate, Zone* zone, HValue* context,
4006 HValue* left, HValue* right, 4007 HValue* left, HValue* right,
4008 LanguageMode language_mode,
4007 PretenureFlag pretenure_flag, 4009 PretenureFlag pretenure_flag,
4008 StringAddFlags flags, 4010 StringAddFlags flags,
4009 Handle<AllocationSite> allocation_site) { 4011 Handle<AllocationSite> allocation_site) {
4010 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { 4012 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
4011 HConstant* c_right = HConstant::cast(right); 4013 HConstant* c_right = HConstant::cast(right);
4012 HConstant* c_left = HConstant::cast(left); 4014 HConstant* c_left = HConstant::cast(left);
4013 if (c_left->HasStringValue() && c_right->HasStringValue()) { 4015 if (c_left->HasStringValue() && c_right->HasStringValue()) {
4014 Handle<String> left_string = c_left->StringValue(); 4016 Handle<String> left_string = c_left->StringValue();
4015 Handle<String> right_string = c_right->StringValue(); 4017 Handle<String> right_string = c_right->StringValue();
4016 // Prevent possible exception by invalid string length. 4018 // Prevent possible exception by invalid string length.
4017 if (left_string->length() + right_string->length() < String::kMaxLength) { 4019 if (left_string->length() + right_string->length() < String::kMaxLength) {
4018 MaybeHandle<String> concat = isolate->factory()->NewConsString( 4020 MaybeHandle<String> concat = isolate->factory()->NewConsString(
4019 c_left->StringValue(), c_right->StringValue()); 4021 c_left->StringValue(), c_right->StringValue());
4020 return HConstant::New(isolate, zone, context, concat.ToHandleChecked()); 4022 return HConstant::New(isolate, zone, context, concat.ToHandleChecked());
4021 } 4023 }
4022 } 4024 }
4023 } 4025 }
4024 return new(zone) HStringAdd( 4026 return new(zone) HStringAdd(
4025 context, left, right, pretenure_flag, flags, allocation_site); 4027 context, left, right, language_mode, pretenure_flag, flags,
4028 allocation_site);
4026 } 4029 }
4027 4030
4028 4031
4029 std::ostream& HStringAdd::PrintDataTo(std::ostream& os) const { // NOLINT 4032 std::ostream& HStringAdd::PrintDataTo(std::ostream& os) const { // NOLINT
4030 if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_BOTH) { 4033 if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_BOTH) {
4031 os << "_CheckBoth"; 4034 os << "_CheckBoth";
4032 } else if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_LEFT) { 4035 } else if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_LEFT) {
4033 os << "_CheckLeft"; 4036 os << "_CheckLeft";
4034 } else if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_RIGHT) { 4037 } else if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_RIGHT) {
4035 os << "_CheckRight"; 4038 os << "_CheckRight";
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
4213 } 4216 }
4214 // All comparisons failed, must be NaN. 4217 // All comparisons failed, must be NaN.
4215 return H_CONSTANT_DOUBLE(std::numeric_limits<double>::quiet_NaN()); 4218 return H_CONSTANT_DOUBLE(std::numeric_limits<double>::quiet_NaN());
4216 } 4219 }
4217 } 4220 }
4218 return new(zone) HMathMinMax(context, left, right, op); 4221 return new(zone) HMathMinMax(context, left, right, op);
4219 } 4222 }
4220 4223
4221 4224
4222 HInstruction* HMod::New(Isolate* isolate, Zone* zone, HValue* context, 4225 HInstruction* HMod::New(Isolate* isolate, Zone* zone, HValue* context,
4223 HValue* left, HValue* right) { 4226 HValue* left, HValue* right,
4227 LanguageMode language_mode) {
4224 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { 4228 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
4225 HConstant* c_left = HConstant::cast(left); 4229 HConstant* c_left = HConstant::cast(left);
4226 HConstant* c_right = HConstant::cast(right); 4230 HConstant* c_right = HConstant::cast(right);
4227 if (c_left->HasInteger32Value() && c_right->HasInteger32Value()) { 4231 if (c_left->HasInteger32Value() && c_right->HasInteger32Value()) {
4228 int32_t dividend = c_left->Integer32Value(); 4232 int32_t dividend = c_left->Integer32Value();
4229 int32_t divisor = c_right->Integer32Value(); 4233 int32_t divisor = c_right->Integer32Value();
4230 if (dividend == kMinInt && divisor == -1) { 4234 if (dividend == kMinInt && divisor == -1) {
4231 return H_CONSTANT_DOUBLE(-0.0); 4235 return H_CONSTANT_DOUBLE(-0.0);
4232 } 4236 }
4233 if (divisor != 0) { 4237 if (divisor != 0) {
4234 int32_t res = dividend % divisor; 4238 int32_t res = dividend % divisor;
4235 if ((res == 0) && (dividend < 0)) { 4239 if ((res == 0) && (dividend < 0)) {
4236 return H_CONSTANT_DOUBLE(-0.0); 4240 return H_CONSTANT_DOUBLE(-0.0);
4237 } 4241 }
4238 return H_CONSTANT_INT(res); 4242 return H_CONSTANT_INT(res);
4239 } 4243 }
4240 } 4244 }
4241 } 4245 }
4242 return new(zone) HMod(context, left, right); 4246 return new(zone) HMod(context, left, right, language_mode);
4243 } 4247 }
4244 4248
4245 4249
4246 HInstruction* HDiv::New(Isolate* isolate, Zone* zone, HValue* context, 4250 HInstruction* HDiv::New(Isolate* isolate, Zone* zone, HValue* context,
4247 HValue* left, HValue* right) { 4251 HValue* left, HValue* right,
4252 LanguageMode language_mode) {
4248 // If left and right are constant values, try to return a constant value. 4253 // If left and right are constant values, try to return a constant value.
4249 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { 4254 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
4250 HConstant* c_left = HConstant::cast(left); 4255 HConstant* c_left = HConstant::cast(left);
4251 HConstant* c_right = HConstant::cast(right); 4256 HConstant* c_right = HConstant::cast(right);
4252 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { 4257 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {
4253 if (c_right->DoubleValue() != 0) { 4258 if (c_right->DoubleValue() != 0) {
4254 double double_res = c_left->DoubleValue() / c_right->DoubleValue(); 4259 double double_res = c_left->DoubleValue() / c_right->DoubleValue();
4255 if (IsInt32Double(double_res)) { 4260 if (IsInt32Double(double_res)) {
4256 return H_CONSTANT_INT(double_res); 4261 return H_CONSTANT_INT(double_res);
4257 } 4262 }
4258 return H_CONSTANT_DOUBLE(double_res); 4263 return H_CONSTANT_DOUBLE(double_res);
4259 } else { 4264 } else {
4260 int sign = Double(c_left->DoubleValue()).Sign() * 4265 int sign = Double(c_left->DoubleValue()).Sign() *
4261 Double(c_right->DoubleValue()).Sign(); // Right could be -0. 4266 Double(c_right->DoubleValue()).Sign(); // Right could be -0.
4262 return H_CONSTANT_DOUBLE(sign * V8_INFINITY); 4267 return H_CONSTANT_DOUBLE(sign * V8_INFINITY);
4263 } 4268 }
4264 } 4269 }
4265 } 4270 }
4266 return new(zone) HDiv(context, left, right); 4271 return new(zone) HDiv(context, left, right, language_mode);
4267 } 4272 }
4268 4273
4269 4274
4270 HInstruction* HBitwise::New(Isolate* isolate, Zone* zone, HValue* context, 4275 HInstruction* HBitwise::New(Isolate* isolate, Zone* zone, HValue* context,
4271 Token::Value op, HValue* left, HValue* right) { 4276 Token::Value op, HValue* left, HValue* right,
4277 LanguageMode language_mode) {
4272 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { 4278 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
4273 HConstant* c_left = HConstant::cast(left); 4279 HConstant* c_left = HConstant::cast(left);
4274 HConstant* c_right = HConstant::cast(right); 4280 HConstant* c_right = HConstant::cast(right);
4275 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { 4281 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {
4276 int32_t result; 4282 int32_t result;
4277 int32_t v_left = c_left->NumberValueAsInteger32(); 4283 int32_t v_left = c_left->NumberValueAsInteger32();
4278 int32_t v_right = c_right->NumberValueAsInteger32(); 4284 int32_t v_right = c_right->NumberValueAsInteger32();
4279 switch (op) { 4285 switch (op) {
4280 case Token::BIT_XOR: 4286 case Token::BIT_XOR:
4281 result = v_left ^ v_right; 4287 result = v_left ^ v_right;
4282 break; 4288 break;
4283 case Token::BIT_AND: 4289 case Token::BIT_AND:
4284 result = v_left & v_right; 4290 result = v_left & v_right;
4285 break; 4291 break;
4286 case Token::BIT_OR: 4292 case Token::BIT_OR:
4287 result = v_left | v_right; 4293 result = v_left | v_right;
4288 break; 4294 break;
4289 default: 4295 default:
4290 result = 0; // Please the compiler. 4296 result = 0; // Please the compiler.
4291 UNREACHABLE(); 4297 UNREACHABLE();
4292 } 4298 }
4293 return H_CONSTANT_INT(result); 4299 return H_CONSTANT_INT(result);
4294 } 4300 }
4295 } 4301 }
4296 return new(zone) HBitwise(context, op, left, right); 4302 return new(zone) HBitwise(context, op, left, right, language_mode);
4297 } 4303 }
4298 4304
4299 4305
4300 #define DEFINE_NEW_H_BITWISE_INSTR(HInstr, result) \ 4306 #define DEFINE_NEW_H_BITWISE_INSTR(HInstr, result) \
4301 HInstruction* HInstr::New(Isolate* isolate, Zone* zone, HValue* context, \ 4307 HInstruction* HInstr::New(Isolate* isolate, Zone* zone, HValue* context, \
4302 HValue* left, HValue* right) { \ 4308 HValue* left, HValue* right, \
4309 LanguageMode language_mode) { \
4303 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { \ 4310 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { \
4304 HConstant* c_left = HConstant::cast(left); \ 4311 HConstant* c_left = HConstant::cast(left); \
4305 HConstant* c_right = HConstant::cast(right); \ 4312 HConstant* c_right = HConstant::cast(right); \
4306 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \ 4313 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { \
4307 return H_CONSTANT_INT(result); \ 4314 return H_CONSTANT_INT(result); \
4308 } \ 4315 } \
4309 } \ 4316 } \
4310 return new (zone) HInstr(context, left, right); \ 4317 return new (zone) HInstr(context, left, right, language_mode); \
4311 } 4318 }
4312 4319
4313 4320
4314 DEFINE_NEW_H_BITWISE_INSTR(HSar, 4321 DEFINE_NEW_H_BITWISE_INSTR(HSar,
4315 c_left->NumberValueAsInteger32() >> (c_right->NumberValueAsInteger32() & 0x1f)) 4322 c_left->NumberValueAsInteger32() >> (c_right->NumberValueAsInteger32() & 0x1f))
4316 DEFINE_NEW_H_BITWISE_INSTR(HShl, 4323 DEFINE_NEW_H_BITWISE_INSTR(HShl,
4317 c_left->NumberValueAsInteger32() << (c_right->NumberValueAsInteger32() & 0x1f)) 4324 c_left->NumberValueAsInteger32() << (c_right->NumberValueAsInteger32() & 0x1f))
4318 4325
4319 #undef DEFINE_NEW_H_BITWISE_INSTR 4326 #undef DEFINE_NEW_H_BITWISE_INSTR
4320 4327
4321 4328
4322 HInstruction* HShr::New(Isolate* isolate, Zone* zone, HValue* context, 4329 HInstruction* HShr::New(Isolate* isolate, Zone* zone, HValue* context,
4323 HValue* left, HValue* right) { 4330 HValue* left, HValue* right,
4331 LanguageMode language_mode) {
4324 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { 4332 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
4325 HConstant* c_left = HConstant::cast(left); 4333 HConstant* c_left = HConstant::cast(left);
4326 HConstant* c_right = HConstant::cast(right); 4334 HConstant* c_right = HConstant::cast(right);
4327 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) { 4335 if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {
4328 int32_t left_val = c_left->NumberValueAsInteger32(); 4336 int32_t left_val = c_left->NumberValueAsInteger32();
4329 int32_t right_val = c_right->NumberValueAsInteger32() & 0x1f; 4337 int32_t right_val = c_right->NumberValueAsInteger32() & 0x1f;
4330 if ((right_val == 0) && (left_val < 0)) { 4338 if ((right_val == 0) && (left_val < 0)) {
4331 return H_CONSTANT_DOUBLE(static_cast<uint32_t>(left_val)); 4339 return H_CONSTANT_DOUBLE(static_cast<uint32_t>(left_val));
4332 } 4340 }
4333 return H_CONSTANT_INT(static_cast<uint32_t>(left_val) >> right_val); 4341 return H_CONSTANT_INT(static_cast<uint32_t>(left_val) >> right_val);
4334 } 4342 }
4335 } 4343 }
4336 return new(zone) HShr(context, left, right); 4344 return new(zone) HShr(context, left, right, language_mode);
4337 } 4345 }
4338 4346
4339 4347
4340 HInstruction* HSeqStringGetChar::New(Isolate* isolate, Zone* zone, 4348 HInstruction* HSeqStringGetChar::New(Isolate* isolate, Zone* zone,
4341 HValue* context, String::Encoding encoding, 4349 HValue* context, String::Encoding encoding,
4342 HValue* string, HValue* index) { 4350 HValue* string, HValue* index) {
4343 if (FLAG_fold_constants && string->IsConstant() && index->IsConstant()) { 4351 if (FLAG_fold_constants && string->IsConstant() && index->IsConstant()) {
4344 HConstant* c_string = HConstant::cast(string); 4352 HConstant* c_string = HConstant::cast(string);
4345 HConstant* c_index = HConstant::cast(index); 4353 HConstant* c_index = HConstant::cast(index);
4346 if (c_string->HasStringValue() && c_index->HasInteger32Value()) { 4354 if (c_string->HasStringValue() && c_index->HasInteger32Value()) {
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
4711 break; 4719 break;
4712 case HObjectAccess::kExternalMemory: 4720 case HObjectAccess::kExternalMemory:
4713 os << "[external-memory]"; 4721 os << "[external-memory]";
4714 break; 4722 break;
4715 } 4723 }
4716 4724
4717 return os << "@" << access.offset(); 4725 return os << "@" << access.offset();
4718 } 4726 }
4719 4727
4720 } } // namespace v8::internal 4728 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen-instructions.h ('k') | src/ia32/lithium-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698