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

Unified Diff: src/codegen-ia32.cc

Issue 21507: Experimental: port bleeding_edge r1276 (a grab bag of optimizations)... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/toiger/
Patch Set: Created 11 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/array.js ('k') | src/date-delay.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/codegen-ia32.cc
===================================================================
--- src/codegen-ia32.cc (revision 1313)
+++ src/codegen-ia32.cc (working copy)
@@ -1190,12 +1190,20 @@
deferred->enter()->Branch(not_zero, &operand, not_taken);
frame_->Spill(operand.reg());
if (op == Token::BIT_AND) {
- __ and_(Operand(operand.reg()), Immediate(value));
+ if (int_value == 0) {
+ __ xor_(Operand(operand.reg()), operand.reg());
+ } else {
+ __ and_(Operand(operand.reg()), Immediate(value));
+ }
} else if (op == Token::BIT_XOR) {
- __ xor_(Operand(operand.reg()), Immediate(value));
+ if (int_value != 0) {
+ __ xor_(Operand(operand.reg()), Immediate(value));
+ }
} else {
ASSERT(op == Token::BIT_OR);
- __ or_(Operand(operand.reg()), Immediate(value));
+ if (int_value != 0) {
+ __ or_(Operand(opernand.reg()), Immediate(value));
Lasse Reichstein 2009/02/19 12:19:37 "opernand" typo?
Kevin Millikin (Chromium) 2009/02/19 12:21:06 Duh. Thanks.
+ }
}
deferred->BindExit(&operand);
frame_->Push(&operand);
@@ -4121,6 +4129,23 @@
Result answer = frame_->CallRuntime(Runtime::kTypeof, 1);
frame_->Push(&answer);
+ } else if (op == Token::VOID) {
+ Expression* expression = node->expression();
+ if (expression && expression->AsLiteral() && (
+ expression->AsLiteral()->IsTrue() ||
+ expression->AsLiteral()->IsFalse() ||
+ expression->AsLiteral()->handle()->IsNumber() ||
+ expression->AsLiteral()->handle()->IsString() ||
+ expression->AsLiteral()->handle()->IsJSRegExp() ||
+ expression->AsLiteral()->IsNull())) {
+ // Omit evaluating the value of the primitive literal.
+ // It will be discarded anyway, and can have no side effect.
+ frame_->Push(Factory::undefined_value());
+ } else {
+ Load(node->expression());
+ frame_->SetElementAt(0, Factory::undefined_value());
+ }
+
} else {
Load(node->expression());
switch (op) {
@@ -4164,11 +4189,6 @@
break;
}
- case Token::VOID: {
- frame_->SetElementAt(0, Factory::undefined_value());
- break;
- }
-
case Token::ADD: {
// Smi check.
JumpTarget continue_label(this);
« no previous file with comments | « src/array.js ('k') | src/date-delay.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698