// Copyright 2021 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/bigint/bigint-internal.h" #include "src/bigint/digit-arithmetic.h" #include "src/bigint/vector-arithmetic.h" namespace v8 { namespace bigint { // Z := X * y, where y is a single digit. void ProcessorImpl::MultiplySingle(RWDigits Z, Digits X, digit_t y) { … } #define BODY … // Z := X * Y. // O(n²) "schoolbook" multiplication algorithm. Optimized to minimize // bounds and overflow checks: rather than looping over X for every digit // of Y (or vice versa), we loop over Z. The {BODY} macro above is what // computes one of Z's digits as a sum of the products of relevant digits // of X and Y. This yields a nearly 2x improvement compared to more obvious // implementations. // This method is *highly* performance sensitive even for the advanced // algorithms, which use this as the base case of their recursive calls. void ProcessorImpl::MultiplySchoolbook(RWDigits Z, Digits X, Digits Y) { … } #undef BODY } // namespace bigint } // namespace v8