From 5ea0364a6aa26e474c617002ba4963e73c2be59b Mon Sep 17 00:00:00 2001 From: "erik.corry@gmail.com" Date: Tue, 15 Mar 2011 21:56:12 +0000 Subject: [PATCH] Fix incorrect assumption on bit-and on ARM Review URL: http://codereview.chromium.org/6696037 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7183 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/codegen-arm.cc | 8 +++++--- test/mjsunit/bitops-info.js | 8 +++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc index e30de0d..364f652 100644 --- a/src/arm/codegen-arm.cc +++ b/src/arm/codegen-arm.cc @@ -1159,7 +1159,7 @@ void DeferredInlineSmiOperation::GenerateNonSmiInput() { } // Check that the *signed* result fits in a smi. Not necessary for AND, SAR // if the shift if more than 0 or SHR if the shit is more than 1. - if (!( (op_ == Token::AND) || + if (!( (op_ == Token::AND && value_ >= 0) || ((op_ == Token::SAR) && (shift_value > 0)) || ((op_ == Token::SHR) && (shift_value > 1)))) { __ add(r3, int32, Operand(0x40000000), SetCC); @@ -1420,8 +1420,10 @@ void CodeGenerator::SmiOperation(Token::Value op, default: UNREACHABLE(); } deferred->BindExit(); - TypeInfo result_type = - (op == Token::BIT_AND) ? TypeInfo::Smi() : TypeInfo::Integer32(); + TypeInfo result_type = TypeInfo::Integer32(); + if (op == Token::BIT_AND && int_value >= 0) { + result_type = TypeInfo::Smi(); + } frame_->EmitPush(tos, result_type); } break; diff --git a/test/mjsunit/bitops-info.js b/test/mjsunit/bitops-info.js index 4660fdf..4b114c5 100644 --- a/test/mjsunit/bitops-info.js +++ b/test/mjsunit/bitops-info.js @@ -37,7 +37,6 @@ function hidden_int32() { return 1600822924; // It's a signed Int32. } - function f() { var x = non_int32(); // Not a constant. var y = hidden_smi(); // Not a constant. @@ -66,6 +65,13 @@ function f() { assertEquals(46512102 & 2600822924, x & y, "10rev"); assertEquals(1600822924 & 2600822924, x & z, "11rev"); + assertEquals((46512102 & -0x20123456) | 1, (y & -0x20123456) | 1, "12"); + assertEquals((1600822924 & -0x20123456) | 1, (z & -0x20123456) | 1, "13"); + assertEquals((2600822924 & -0x20123456) | 1, (x & -0x20123456) | 1, "14"); + assertEquals((46512102 & -0x20123456) | 1, (-0x20123456 & y) | 1, "12rev"); + assertEquals((1600822924 & -0x20123456) | 1, (-0x20123456 & z) | 1, "13rev"); + assertEquals((2600822924 & -0x20123456) | 1, (-0x20123456 & x) | 1, "14rev"); + assertEquals(2600822924 & 2600822924, x & x, "xx"); assertEquals(y, y & y, "yy"); assertEquals(z, z & z, "zz"); -- 2.7.4