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

Side by Side Diff: src/arm/lithium-codegen-arm.cc

Issue 15763004: Replace tagged keys for fast access by smi, and use smi in boundscheck. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Removed comment Created 7 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 | Annotate | Revision Log
« no previous file with comments | « src/arm/lithium-arm.cc ('k') | src/code-stubs-hydrogen.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 // 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 3258 matching lines...) Expand 10 before | Expand all | Expand 10 after
3269 int constant_key = 0; 3269 int constant_key = 0;
3270 if (key_is_constant) { 3270 if (key_is_constant) {
3271 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); 3271 constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
3272 if (constant_key & 0xF0000000) { 3272 if (constant_key & 0xF0000000) {
3273 Abort("array index constant value too big."); 3273 Abort("array index constant value too big.");
3274 } 3274 }
3275 } else { 3275 } else {
3276 key = ToRegister(instr->key()); 3276 key = ToRegister(instr->key());
3277 } 3277 }
3278 int element_size_shift = ElementsKindToShiftSize(elements_kind); 3278 int element_size_shift = ElementsKindToShiftSize(elements_kind);
3279 int shift_size = (instr->hydrogen()->key()->representation().IsTagged()) 3279 int shift_size = (instr->hydrogen()->key()->representation().IsSmi())
3280 ? (element_size_shift - kSmiTagSize) : element_size_shift; 3280 ? (element_size_shift - kSmiTagSize) : element_size_shift;
3281 int additional_offset = instr->additional_index() << element_size_shift; 3281 int additional_offset = instr->additional_index() << element_size_shift;
3282 3282
3283 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || 3283 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
3284 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 3284 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
3285 DwVfpRegister result = ToDoubleRegister(instr->result()); 3285 DwVfpRegister result = ToDoubleRegister(instr->result());
3286 Operand operand = key_is_constant 3286 Operand operand = key_is_constant
3287 ? Operand(constant_key << element_size_shift) 3287 ? Operand(constant_key << element_size_shift)
3288 : Operand(key, LSL, shift_size); 3288 : Operand(key, LSL, shift_size);
3289 __ add(scratch0(), external_pointer, operand); 3289 __ add(scratch0(), external_pointer, operand);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3341 3341
3342 3342
3343 void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) { 3343 void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) {
3344 Register elements = ToRegister(instr->elements()); 3344 Register elements = ToRegister(instr->elements());
3345 bool key_is_constant = instr->key()->IsConstantOperand(); 3345 bool key_is_constant = instr->key()->IsConstantOperand();
3346 Register key = no_reg; 3346 Register key = no_reg;
3347 DwVfpRegister result = ToDoubleRegister(instr->result()); 3347 DwVfpRegister result = ToDoubleRegister(instr->result());
3348 Register scratch = scratch0(); 3348 Register scratch = scratch0();
3349 3349
3350 int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS); 3350 int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS);
3351 int shift_size = (instr->hydrogen()->key()->representation().IsTagged()) 3351 int shift_size = (instr->hydrogen()->key()->representation().IsSmi())
3352 ? (element_size_shift - kSmiTagSize) : element_size_shift; 3352 ? (element_size_shift - kSmiTagSize) : element_size_shift;
3353 int constant_key = 0; 3353 int constant_key = 0;
3354 if (key_is_constant) { 3354 if (key_is_constant) {
3355 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); 3355 constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
3356 if (constant_key & 0xF0000000) { 3356 if (constant_key & 0xF0000000) {
3357 Abort("array index constant value too big."); 3357 Abort("array index constant value too big.");
3358 } 3358 }
3359 } else { 3359 } else {
3360 key = ToRegister(instr->key()); 3360 key = ToRegister(instr->key());
3361 } 3361 }
(...skipping 24 matching lines...) Expand all
3386 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); 3386 LConstantOperand* const_operand = LConstantOperand::cast(instr->key());
3387 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + 3387 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) +
3388 instr->additional_index()); 3388 instr->additional_index());
3389 store_base = elements; 3389 store_base = elements;
3390 } else { 3390 } else {
3391 Register key = EmitLoadRegister(instr->key(), scratch0()); 3391 Register key = EmitLoadRegister(instr->key(), scratch0());
3392 // Even though the HLoadKeyed instruction forces the input 3392 // Even though the HLoadKeyed instruction forces the input
3393 // representation for the key to be an integer, the input gets replaced 3393 // representation for the key to be an integer, the input gets replaced
3394 // during bound check elimination with the index argument to the bounds 3394 // during bound check elimination with the index argument to the bounds
3395 // check, which can be tagged, so that case must be handled here, too. 3395 // check, which can be tagged, so that case must be handled here, too.
3396 if (instr->hydrogen()->key()->representation().IsTagged()) { 3396 if (instr->hydrogen()->key()->representation().IsSmi()) {
3397 __ add(scratch, elements, Operand::PointerOffsetFromSmiKey(key)); 3397 __ add(scratch, elements, Operand::PointerOffsetFromSmiKey(key));
3398 } else { 3398 } else {
3399 __ add(scratch, elements, Operand(key, LSL, kPointerSizeLog2)); 3399 __ add(scratch, elements, Operand(key, LSL, kPointerSizeLog2));
3400 } 3400 }
3401 offset = FixedArray::OffsetOfElementAt(instr->additional_index()); 3401 offset = FixedArray::OffsetOfElementAt(instr->additional_index());
3402 } 3402 }
3403 __ ldr(result, FieldMemOperand(store_base, offset)); 3403 __ ldr(result, FieldMemOperand(store_base, offset));
3404 3404
3405 // Check for the hole value. 3405 // Check for the hole value.
3406 if (instr->hydrogen()->RequiresHoleCheck()) { 3406 if (instr->hydrogen()->RequiresHoleCheck()) {
(...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after
4322 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); 4322 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS);
4323 } 4323 }
4324 4324
4325 4325
4326 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { 4326 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) {
4327 if (instr->hydrogen()->skip_check()) return; 4327 if (instr->hydrogen()->skip_check()) return;
4328 4328
4329 if (instr->index()->IsConstantOperand()) { 4329 if (instr->index()->IsConstantOperand()) {
4330 int constant_index = 4330 int constant_index =
4331 ToInteger32(LConstantOperand::cast(instr->index())); 4331 ToInteger32(LConstantOperand::cast(instr->index()));
4332 if (instr->hydrogen()->length()->representation().IsTagged()) { 4332 if (instr->hydrogen()->length()->representation().IsSmi()) {
4333 __ mov(ip, Operand(Smi::FromInt(constant_index))); 4333 __ mov(ip, Operand(Smi::FromInt(constant_index)));
4334 } else { 4334 } else {
4335 __ mov(ip, Operand(constant_index)); 4335 __ mov(ip, Operand(constant_index));
4336 } 4336 }
4337 __ cmp(ip, ToRegister(instr->length())); 4337 __ cmp(ip, ToRegister(instr->length()));
4338 } else { 4338 } else {
4339 __ cmp(ToRegister(instr->index()), ToRegister(instr->length())); 4339 __ cmp(ToRegister(instr->index()), ToRegister(instr->length()));
4340 } 4340 }
4341 DeoptimizeIf(hs, instr->environment()); 4341 DeoptimizeIf(hs, instr->environment());
4342 } 4342 }
4343 4343
4344 4344
4345 void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) { 4345 void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) {
4346 Register external_pointer = ToRegister(instr->elements()); 4346 Register external_pointer = ToRegister(instr->elements());
4347 Register key = no_reg; 4347 Register key = no_reg;
4348 ElementsKind elements_kind = instr->elements_kind(); 4348 ElementsKind elements_kind = instr->elements_kind();
4349 bool key_is_constant = instr->key()->IsConstantOperand(); 4349 bool key_is_constant = instr->key()->IsConstantOperand();
4350 int constant_key = 0; 4350 int constant_key = 0;
4351 if (key_is_constant) { 4351 if (key_is_constant) {
4352 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); 4352 constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
4353 if (constant_key & 0xF0000000) { 4353 if (constant_key & 0xF0000000) {
4354 Abort("array index constant value too big."); 4354 Abort("array index constant value too big.");
4355 } 4355 }
4356 } else { 4356 } else {
4357 key = ToRegister(instr->key()); 4357 key = ToRegister(instr->key());
4358 } 4358 }
4359 int element_size_shift = ElementsKindToShiftSize(elements_kind); 4359 int element_size_shift = ElementsKindToShiftSize(elements_kind);
4360 int shift_size = (instr->hydrogen()->key()->representation().IsTagged()) 4360 int shift_size = (instr->hydrogen()->key()->representation().IsSmi())
4361 ? (element_size_shift - kSmiTagSize) : element_size_shift; 4361 ? (element_size_shift - kSmiTagSize) : element_size_shift;
4362 int additional_offset = instr->additional_index() << element_size_shift; 4362 int additional_offset = instr->additional_index() << element_size_shift;
4363 4363
4364 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || 4364 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
4365 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 4365 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
4366 DwVfpRegister value(ToDoubleRegister(instr->value())); 4366 DwVfpRegister value(ToDoubleRegister(instr->value()));
4367 Operand operand(key_is_constant 4367 Operand operand(key_is_constant
4368 ? Operand(constant_key << element_size_shift) 4368 ? Operand(constant_key << element_size_shift)
4369 : Operand(key, LSL, shift_size)); 4369 : Operand(key, LSL, shift_size));
4370 __ add(scratch0(), external_pointer, operand); 4370 __ add(scratch0(), external_pointer, operand);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
4423 // double value. 4423 // double value.
4424 if (key_is_constant) { 4424 if (key_is_constant) {
4425 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); 4425 constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
4426 if (constant_key & 0xF0000000) { 4426 if (constant_key & 0xF0000000) {
4427 Abort("array index constant value too big."); 4427 Abort("array index constant value too big.");
4428 } 4428 }
4429 } else { 4429 } else {
4430 key = ToRegister(instr->key()); 4430 key = ToRegister(instr->key());
4431 } 4431 }
4432 int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS); 4432 int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS);
4433 int shift_size = (instr->hydrogen()->key()->representation().IsTagged()) 4433 int shift_size = (instr->hydrogen()->key()->representation().IsSmi())
4434 ? (element_size_shift - kSmiTagSize) : element_size_shift; 4434 ? (element_size_shift - kSmiTagSize) : element_size_shift;
4435 Operand operand = key_is_constant 4435 Operand operand = key_is_constant
4436 ? Operand((constant_key << element_size_shift) + 4436 ? Operand((constant_key << element_size_shift) +
4437 FixedDoubleArray::kHeaderSize - kHeapObjectTag) 4437 FixedDoubleArray::kHeaderSize - kHeapObjectTag)
4438 : Operand(key, LSL, shift_size); 4438 : Operand(key, LSL, shift_size);
4439 __ add(scratch, elements, operand); 4439 __ add(scratch, elements, operand);
4440 if (!key_is_constant) { 4440 if (!key_is_constant) {
4441 __ add(scratch, scratch, 4441 __ add(scratch, scratch,
4442 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag)); 4442 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag));
4443 } 4443 }
(...skipping 25 matching lines...) Expand all
4469 ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); 4469 ASSERT(!instr->hydrogen()->NeedsWriteBarrier());
4470 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); 4470 LConstantOperand* const_operand = LConstantOperand::cast(instr->key());
4471 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) + 4471 offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) +
4472 instr->additional_index()); 4472 instr->additional_index());
4473 store_base = elements; 4473 store_base = elements;
4474 } else { 4474 } else {
4475 // Even though the HLoadKeyed instruction forces the input 4475 // Even though the HLoadKeyed instruction forces the input
4476 // representation for the key to be an integer, the input gets replaced 4476 // representation for the key to be an integer, the input gets replaced
4477 // during bound check elimination with the index argument to the bounds 4477 // during bound check elimination with the index argument to the bounds
4478 // check, which can be tagged, so that case must be handled here, too. 4478 // check, which can be tagged, so that case must be handled here, too.
4479 if (instr->hydrogen()->key()->representation().IsTagged()) { 4479 if (instr->hydrogen()->key()->representation().IsSmi()) {
4480 __ add(scratch, elements, Operand::PointerOffsetFromSmiKey(key)); 4480 __ add(scratch, elements, Operand::PointerOffsetFromSmiKey(key));
4481 } else { 4481 } else {
4482 __ add(scratch, elements, Operand(key, LSL, kPointerSizeLog2)); 4482 __ add(scratch, elements, Operand(key, LSL, kPointerSizeLog2));
4483 } 4483 }
4484 offset = FixedArray::OffsetOfElementAt(instr->additional_index()); 4484 offset = FixedArray::OffsetOfElementAt(instr->additional_index());
4485 } 4485 }
4486 __ str(value, FieldMemOperand(store_base, offset)); 4486 __ str(value, FieldMemOperand(store_base, offset));
4487 4487
4488 if (instr->hydrogen()->NeedsWriteBarrier()) { 4488 if (instr->hydrogen()->NeedsWriteBarrier()) {
4489 HType type = instr->hydrogen()->value()->type(); 4489 HType type = instr->hydrogen()->value()->type();
(...skipping 1505 matching lines...) Expand 10 before | Expand all | Expand 10 after
5995 __ sub(scratch, result, Operand::PointerOffsetFromSmiKey(index)); 5995 __ sub(scratch, result, Operand::PointerOffsetFromSmiKey(index));
5996 __ ldr(result, FieldMemOperand(scratch, 5996 __ ldr(result, FieldMemOperand(scratch,
5997 FixedArray::kHeaderSize - kPointerSize)); 5997 FixedArray::kHeaderSize - kPointerSize));
5998 __ bind(&done); 5998 __ bind(&done);
5999 } 5999 }
6000 6000
6001 6001
6002 #undef __ 6002 #undef __
6003 6003
6004 } } // namespace v8::internal 6004 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/lithium-arm.cc ('k') | src/code-stubs-hydrogen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698