OLD | NEW |
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 4479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4490 ASSERT(ToRegister(instr->context()).is(esi)); | 4490 ASSERT(ToRegister(instr->context()).is(esi)); |
4491 ASSERT(ToRegister(instr->object()).is(edx)); | 4491 ASSERT(ToRegister(instr->object()).is(edx)); |
4492 ASSERT(ToRegister(instr->value()).is(eax)); | 4492 ASSERT(ToRegister(instr->value()).is(eax)); |
4493 | 4493 |
4494 __ mov(ecx, instr->name()); | 4494 __ mov(ecx, instr->name()); |
4495 Handle<Code> ic = StoreIC::initialize_stub(isolate(), instr->strict_mode()); | 4495 Handle<Code> ic = StoreIC::initialize_stub(isolate(), instr->strict_mode()); |
4496 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 4496 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
4497 } | 4497 } |
4498 | 4498 |
4499 | 4499 |
4500 void LCodeGen::ApplyCheckIf(Condition cc, LBoundsCheck* check) { | 4500 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
4501 if (FLAG_debug_code && check->hydrogen()->skip_check()) { | 4501 Condition cc = instr->hydrogen()->allow_equality() ? above : above_equal; |
| 4502 if (instr->index()->IsConstantOperand()) { |
| 4503 __ cmp(ToOperand(instr->length()), |
| 4504 ToImmediate(LConstantOperand::cast(instr->index()), |
| 4505 instr->hydrogen()->length()->representation())); |
| 4506 cc = ReverseCondition(cc); |
| 4507 } else if (instr->length()->IsConstantOperand()) { |
| 4508 __ cmp(ToOperand(instr->index()), |
| 4509 ToImmediate(LConstantOperand::cast(instr->length()), |
| 4510 instr->hydrogen()->index()->representation())); |
| 4511 } else { |
| 4512 __ cmp(ToRegister(instr->index()), ToOperand(instr->length())); |
| 4513 } |
| 4514 if (FLAG_debug_code && instr->hydrogen()->skip_check()) { |
4502 Label done; | 4515 Label done; |
4503 __ j(NegateCondition(cc), &done, Label::kNear); | 4516 __ j(NegateCondition(cc), &done, Label::kNear); |
4504 __ int3(); | 4517 __ int3(); |
4505 __ bind(&done); | 4518 __ bind(&done); |
4506 } else { | 4519 } else { |
4507 DeoptimizeIf(cc, check->environment()); | 4520 DeoptimizeIf(cc, instr->environment()); |
4508 } | 4521 } |
4509 } | 4522 } |
4510 | 4523 |
4511 | |
4512 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { | |
4513 if (instr->hydrogen()->skip_check() && !FLAG_debug_code) return; | |
4514 | |
4515 if (instr->index()->IsConstantOperand()) { | |
4516 Immediate immediate = | |
4517 ToImmediate(LConstantOperand::cast(instr->index()), | |
4518 instr->hydrogen()->length()->representation()); | |
4519 __ cmp(ToOperand(instr->length()), immediate); | |
4520 Condition condition = | |
4521 instr->hydrogen()->allow_equality() ? below : below_equal; | |
4522 ApplyCheckIf(condition, instr); | |
4523 } else { | |
4524 __ cmp(ToRegister(instr->index()), ToOperand(instr->length())); | |
4525 Condition condition = | |
4526 instr->hydrogen()->allow_equality() ? above : above_equal; | |
4527 ApplyCheckIf(condition, instr); | |
4528 } | |
4529 } | |
4530 | |
4531 | 4524 |
4532 void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) { | 4525 void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) { |
4533 ElementsKind elements_kind = instr->elements_kind(); | 4526 ElementsKind elements_kind = instr->elements_kind(); |
4534 LOperand* key = instr->key(); | 4527 LOperand* key = instr->key(); |
4535 if (!key->IsConstantOperand() && | 4528 if (!key->IsConstantOperand() && |
4536 ExternalArrayOpRequiresTemp(instr->hydrogen()->key()->representation(), | 4529 ExternalArrayOpRequiresTemp(instr->hydrogen()->key()->representation(), |
4537 elements_kind)) { | 4530 elements_kind)) { |
4538 __ SmiUntag(ToRegister(key)); | 4531 __ SmiUntag(ToRegister(key)); |
4539 } | 4532 } |
4540 Operand operand(BuildFastArrayOperand( | 4533 Operand operand(BuildFastArrayOperand( |
(...skipping 1908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6449 __ bind(deferred->exit()); | 6442 __ bind(deferred->exit()); |
6450 __ bind(&done); | 6443 __ bind(&done); |
6451 } | 6444 } |
6452 | 6445 |
6453 | 6446 |
6454 #undef __ | 6447 #undef __ |
6455 | 6448 |
6456 } } // namespace v8::internal | 6449 } } // namespace v8::internal |
6457 | 6450 |
6458 #endif // V8_TARGET_ARCH_IA32 | 6451 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |