From ef2e46d1cc4b2e97ac85458811b722af3dcc6b4a Mon Sep 17 00:00:00 2001 From: "sgjesse@chromium.org" Date: Mon, 22 Mar 2010 14:31:28 +0000 Subject: [PATCH] Use bit fields to calculate compare stub minor key Review URL: http://codereview.chromium.org/1081010 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4208 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/codegen-arm.cc | 12 +++++++----- src/codegen.h | 5 +++++ src/ia32/codegen-ia32.cc | 10 ++++++---- src/x64/codegen-x64.cc | 10 ++++++---- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc index d3e98a3..888138a 100644 --- a/src/arm/codegen-arm.cc +++ b/src/arm/codegen-arm.cc @@ -7159,11 +7159,13 @@ const char* CompareStub::GetName() { int CompareStub::MinorKey() { - // Encode the three parameters in a unique 16 bit value. - ASSERT((static_cast(cc_) >> 26) < (1 << 16)); - int nnn_value = (never_nan_nan_ ? 2 : 0); - if (cc_ != eq) nnn_value = 0; // Avoid duplicate stubs. - return (static_cast(cc_) >> 26) | nnn_value | (strict_ ? 1 : 0); + // Encode the three parameters in a unique 16 bit value. To avoid duplicate + // stubs the never NaN NaN condition is only taken into account if the + // condition is equals. + ASSERT((static_cast(cc_) >> 28) < (1 << 14)); + return ConditionField::encode(static_cast(cc_) >> 28) + | StrictField::encode(strict_) + | NeverNanNanField::encode(cc_ == eq ? never_nan_nan_ : false); } diff --git a/src/codegen.h b/src/codegen.h index 40ed6ce..adab93a 100644 --- a/src/codegen.h +++ b/src/codegen.h @@ -361,6 +361,11 @@ class CompareStub: public CodeStub { // stubs. bool never_nan_nan_; + // Encoding of the minor key CCCCCCCCCCCCCCNS. + class StrictField: public BitField {}; + class NeverNanNanField: public BitField {}; + class ConditionField: public BitField {}; + Major MajorKey() { return Compare; } int MinorKey(); diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc index 67c9cc1..3c7f1eb 100644 --- a/src/ia32/codegen-ia32.cc +++ b/src/ia32/codegen-ia32.cc @@ -11534,11 +11534,13 @@ const char* CompareStub::GetName() { int CompareStub::MinorKey() { - // Encode the three parameters in a unique 16 bit value. + // Encode the three parameters in a unique 16 bit value. To avoid duplicate + // stubs the never NaN NaN condition is only taken into account if the + // condition is equals. ASSERT(static_cast(cc_) < (1 << 14)); - int nnn_value = (never_nan_nan_ ? 2 : 0); - if (cc_ != equal) nnn_value = 0; // Avoid duplicate stubs. - return (static_cast(cc_) << 2) | nnn_value | (strict_ ? 1 : 0); + return ConditionField::encode(static_cast(cc_)) + | StrictField::encode(strict_) + | NeverNanNanField::encode(cc_ == equal ? never_nan_nan_ : false); } diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index a6b0ffc..5956228 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -9105,11 +9105,13 @@ Handle GetBinaryOpStub(int key, BinaryOpIC::TypeInfo type_info) { int CompareStub::MinorKey() { - // Encode the three parameters in a unique 16 bit value. + // Encode the three parameters in a unique 16 bit value. To avoid duplicate + // stubs the never NaN NaN condition is only taken into account if the + // condition is equals. ASSERT(static_cast(cc_) < (1 << 14)); - int nnn_value = (never_nan_nan_ ? 2 : 0); - if (cc_ != equal) nnn_value = 0; // Avoid duplicate stubs. - return (static_cast(cc_) << 2) | nnn_value | (strict_ ? 1 : 0); + return ConditionField::encode(static_cast(cc_)) + | StrictField::encode(strict_) + | NeverNanNanField::encode(cc_ == equal ? never_nan_nan_ : false); } -- 2.7.4