From 74b4ad0e69b0ab79a985275285c7b90b48f0056a Mon Sep 17 00:00:00 2001 From: "floitschV8@gmail.com" Date: Wed, 17 Mar 2010 15:57:26 +0000 Subject: [PATCH] Fix arm compilation. DiyFp multiplications are now in a separate procedure. Review URL: http://codereview.chromium.org/971006 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4171 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/SConscript | 1 + src/diy_fp.cc | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/diy_fp.h | 21 +------------------- tools/gyp/v8.gyp | 1 + 4 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 src/diy_fp.cc diff --git a/src/SConscript b/src/SConscript index 4e474f4..cae4627 100755 --- a/src/SConscript +++ b/src/SConscript @@ -56,6 +56,7 @@ SOURCES = { debug-agent.cc debug.cc disassembler.cc + diy_fp.cc execution.cc factory.cc flags.cc diff --git a/src/diy_fp.cc b/src/diy_fp.cc new file mode 100644 index 0000000..0a81005 --- /dev/null +++ b/src/diy_fp.cc @@ -0,0 +1,58 @@ +// Copyright 2010 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "v8.h" + +#include "diy_fp.h" + +namespace v8 { +namespace internal { + +void DiyFp::Multiply(const DiyFp& other) { + // Simply "emulates" a 128 bit multiplication. + // However: the resulting number only contains 64 bits. The least + // significant 64 bits are only used for rounding the most significant 64 + // bits. + const uint64_t kM32 = 0xFFFFFFFFu; + uint64_t a = f_ >> 32; + uint64_t b = f_ & kM32; + uint64_t c = other.f_ >> 32; + uint64_t d = other.f_ & kM32; + uint64_t ac = a * c; + uint64_t bc = b * c; + uint64_t ad = a * d; + uint64_t bd = b * d; + uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32); + // By adding 1U << 31 to tmp we round the final result. + // Halfway cases will be round up. + tmp += 1U << 31; + uint64_t result_f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); + e_ += other.e_ + 64; + f_ = result_f; +} + +} } // namespace v8::internal diff --git a/src/diy_fp.h b/src/diy_fp.h index 9cd7003..cfe05ef 100644 --- a/src/diy_fp.h +++ b/src/diy_fp.h @@ -64,26 +64,7 @@ class DiyFp { // this = this * other. - void Multiply(const DiyFp& other) { - // Simply "emulates" a 128 bit multiplication. - // However: the resulting number only contains 64 bits. The least - // significant 64 bits are only used for rounding the most significant 64 - // bits. - const uint64_t kM32 = 0xFFFFFFFFu; - uint64_t a = f_ >> 32; - uint64_t b = f_ & kM32; - uint64_t c = other.f_ >> 32; - uint64_t d = other.f_ & kM32; - uint64_t ac = a * c; - uint64_t bc = b * c; - uint64_t ad = a * d; - uint64_t bd = b * d; - uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32); - tmp += 1U << 31; // round - uint64_t result_f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); - e_ += other.e_ + 64; - f_ = result_f; - } + void Multiply(const DiyFp& other); // returns a * b; static DiyFp Times(const DiyFp& a, const DiyFp& b) { diff --git a/tools/gyp/v8.gyp b/tools/gyp/v8.gyp index a0cc3e3..b7b23e9 100644 --- a/tools/gyp/v8.gyp +++ b/tools/gyp/v8.gyp @@ -266,6 +266,7 @@ '../../src/disassembler.cc', '../../src/disassembler.h', '../../src/dtoa-config.c', + '../../src/diy_fp.cc', '../../src/diy_fp.h', '../../src/double.h', '../../src/execution.cc', -- 2.7.4