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

Side by Side Diff: src/x64/full-codegen-x64.cc

Issue 6592064: Make the materialization of smi constants consistent between the two compiler... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 9 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/ia32/full-codegen-ia32.cc ('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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 } 320 }
321 // Check that the size of the code used for returning is large enough 321 // Check that the size of the code used for returning is large enough
322 // for the debugger's requirements. 322 // for the debugger's requirements.
323 ASSERT(Assembler::kJSReturnSequenceLength <= 323 ASSERT(Assembler::kJSReturnSequenceLength <=
324 masm_->SizeOfCodeGeneratedSince(&check_exit_codesize)); 324 masm_->SizeOfCodeGeneratedSince(&check_exit_codesize));
325 #endif 325 #endif
326 } 326 }
327 } 327 }
328 328
329 329
330 FullCodeGenerator::ConstantOperand FullCodeGenerator::GetConstantOperand(
331 Token::Value op, Expression* left, Expression* right) {
332 ASSERT(ShouldInlineSmiCase(op));
333 return kNoConstants;
334 }
335
336
337 void FullCodeGenerator::EffectContext::Plug(Slot* slot) const { 330 void FullCodeGenerator::EffectContext::Plug(Slot* slot) const {
338 } 331 }
339 332
340 333
341 void FullCodeGenerator::AccumulatorValueContext::Plug(Slot* slot) const { 334 void FullCodeGenerator::AccumulatorValueContext::Plug(Slot* slot) const {
342 MemOperand slot_operand = codegen()->EmitSlotSearch(slot, result_register()); 335 MemOperand slot_operand = codegen()->EmitSlotSearch(slot, result_register());
343 __ movq(result_register(), slot_operand); 336 __ movq(result_register(), slot_operand);
344 } 337 }
345 338
346 339
(...skipping 1225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1572 } 1565 }
1573 } 1566 }
1574 1567
1575 // For property compound assignments we need another deoptimization 1568 // For property compound assignments we need another deoptimization
1576 // point after the property load. 1569 // point after the property load.
1577 if (property != NULL) { 1570 if (property != NULL) {
1578 PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG); 1571 PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG);
1579 } 1572 }
1580 1573
1581 Token::Value op = expr->binary_op(); 1574 Token::Value op = expr->binary_op();
1582 ConstantOperand constant = ShouldInlineSmiCase(op) 1575 __ push(rax); // Left operand goes on the stack.
1583 ? GetConstantOperand(op, expr->target(), expr->value()) 1576 VisitForAccumulatorValue(expr->value());
1584 : kNoConstants;
1585 ASSERT(constant == kRightConstant || constant == kNoConstants);
1586 if (constant == kNoConstants) {
1587 __ push(rax); // Left operand goes on the stack.
1588 VisitForAccumulatorValue(expr->value());
1589 }
1590 1577
1591 OverwriteMode mode = expr->value()->ResultOverwriteAllowed() 1578 OverwriteMode mode = expr->value()->ResultOverwriteAllowed()
1592 ? OVERWRITE_RIGHT 1579 ? OVERWRITE_RIGHT
1593 : NO_OVERWRITE; 1580 : NO_OVERWRITE;
1594 SetSourcePosition(expr->position() + 1); 1581 SetSourcePosition(expr->position() + 1);
1595 AccumulatorValueContext context(this); 1582 AccumulatorValueContext context(this);
1596 if (ShouldInlineSmiCase(op)) { 1583 if (ShouldInlineSmiCase(op)) {
1597 EmitInlineSmiBinaryOp(expr, 1584 EmitInlineSmiBinaryOp(expr,
1598 op, 1585 op,
1599 mode, 1586 mode,
1600 expr->target(), 1587 expr->target(),
1601 expr->value(), 1588 expr->value());
1602 constant);
1603 } else { 1589 } else {
1604 EmitBinaryOp(op, mode); 1590 EmitBinaryOp(op, mode);
1605 } 1591 }
1606 // Deoptimization point in case the binary operation may have side effects. 1592 // Deoptimization point in case the binary operation may have side effects.
1607 PrepareForBailout(expr->binary_operation(), TOS_REG); 1593 PrepareForBailout(expr->binary_operation(), TOS_REG);
1608 } else { 1594 } else {
1609 VisitForAccumulatorValue(expr->value()); 1595 VisitForAccumulatorValue(expr->value());
1610 } 1596 }
1611 1597
1612 // Record source position before possible IC call. 1598 // Record source position before possible IC call.
(...skipping 30 matching lines...) Expand all
1643 SetSourcePosition(prop->position()); 1629 SetSourcePosition(prop->position());
1644 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); 1630 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
1645 EmitCallIC(ic, RelocInfo::CODE_TARGET); 1631 EmitCallIC(ic, RelocInfo::CODE_TARGET);
1646 } 1632 }
1647 1633
1648 1634
1649 void FullCodeGenerator::EmitInlineSmiBinaryOp(Expression* expr, 1635 void FullCodeGenerator::EmitInlineSmiBinaryOp(Expression* expr,
1650 Token::Value op, 1636 Token::Value op,
1651 OverwriteMode mode, 1637 OverwriteMode mode,
1652 Expression* left, 1638 Expression* left,
1653 Expression* right, 1639 Expression* right) {
1654 ConstantOperand constant) {
1655 ASSERT(constant == kNoConstants); // Only handled case.
1656
1657 // Do combined smi check of the operands. Left operand is on the 1640 // Do combined smi check of the operands. Left operand is on the
1658 // stack (popped into rdx). Right operand is in rax but moved into 1641 // stack (popped into rdx). Right operand is in rax but moved into
1659 // rcx to make the shifts easier. 1642 // rcx to make the shifts easier.
1660 NearLabel done, stub_call, smi_case; 1643 NearLabel done, stub_call, smi_case;
1661 __ pop(rdx); 1644 __ pop(rdx);
1662 __ movq(rcx, rax); 1645 __ movq(rcx, rax);
1663 __ or_(rax, rdx); 1646 __ or_(rax, rdx);
1664 JumpPatchSite patch_site(masm_); 1647 JumpPatchSite patch_site(masm_);
1665 patch_site.EmitJumpIfSmi(rax, &smi_case); 1648 patch_site.EmitJumpIfSmi(rax, &smi_case);
1666 1649
(...skipping 2212 matching lines...) Expand 10 before | Expand all | Expand 10 after
3879 __ ret(0); 3862 __ ret(0);
3880 } 3863 }
3881 3864
3882 3865
3883 #undef __ 3866 #undef __
3884 3867
3885 3868
3886 } } // namespace v8::internal 3869 } } // namespace v8::internal
3887 3870
3888 #endif // V8_TARGET_ARCH_X64 3871 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/ia32/full-codegen-ia32.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698