summaryrefslogtreecommitdiff
path: root/deps/v8/src/bigint/bigint-internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/bigint/bigint-internal.h')
-rw-r--r--deps/v8/src/bigint/bigint-internal.h62
1 files changed, 59 insertions, 3 deletions
diff --git a/deps/v8/src/bigint/bigint-internal.h b/deps/v8/src/bigint/bigint-internal.h
index efe63a06a5..41ef9526e5 100644
--- a/deps/v8/src/bigint/bigint-internal.h
+++ b/deps/v8/src/bigint/bigint-internal.h
@@ -5,11 +5,20 @@
#ifndef V8_BIGINT_BIGINT_INTERNAL_H_
#define V8_BIGINT_BIGINT_INTERNAL_H_
+#include <memory>
+
#include "src/bigint/bigint.h"
namespace v8 {
namespace bigint {
+constexpr int kKaratsubaThreshold = 34;
+constexpr int kToomThreshold = 193;
+constexpr int kFftThreshold = 1500;
+constexpr int kFftInnerThreshold = 200;
+
+constexpr int kBurnikelThreshold = 57;
+
class ProcessorImpl : public Processor {
public:
explicit ProcessorImpl(Platform* platform);
@@ -21,7 +30,31 @@ class ProcessorImpl : public Processor {
void MultiplySingle(RWDigits Z, Digits X, digit_t y);
void MultiplySchoolbook(RWDigits Z, Digits X, Digits Y);
- private:
+ void MultiplyKaratsuba(RWDigits Z, Digits X, Digits Y);
+ void KaratsubaStart(RWDigits Z, Digits X, Digits Y, RWDigits scratch, int k);
+ void KaratsubaChunk(RWDigits Z, Digits X, Digits Y, RWDigits scratch);
+ void KaratsubaMain(RWDigits Z, Digits X, Digits Y, RWDigits scratch, int n);
+
+ void Divide(RWDigits Q, Digits A, Digits B);
+ void DivideSingle(RWDigits Q, digit_t* remainder, Digits A, digit_t b);
+ void DivideSchoolbook(RWDigits Q, RWDigits R, Digits A, Digits B);
+ void DivideBurnikelZiegler(RWDigits Q, RWDigits R, Digits A, Digits B);
+
+ void Modulo(RWDigits R, Digits A, Digits B);
+
+#if V8_ADVANCED_BIGINT_ALGORITHMS
+ void MultiplyToomCook(RWDigits Z, Digits X, Digits Y);
+ void Toom3Main(RWDigits Z, Digits X, Digits Y);
+
+ void MultiplyFFT(RWDigits Z, Digits X, Digits Y);
+#endif // V8_ADVANCED_BIGINT_ALGORITHMS
+
+ // {out_length} initially contains the allocated capacity of {out}, and
+ // upon return will be set to the actual length of the result string.
+ void ToString(char* out, int* out_length, Digits X, int radix, bool sign);
+
+ bool should_terminate() { return status_ == Status::kInterrupted; }
+
// Each unit is supposed to represent approximately one CPU {mul} instruction.
// Doesn't need to be accurate; we just want to make sure to check for
// interrupt requests every now and then (roughly every 10-100 ms; often
@@ -39,8 +72,7 @@ class ProcessorImpl : public Processor {
}
}
- bool should_terminate() { return status_ == Status::kInterrupted; }
-
+ private:
uintptr_t work_estimate_{0};
Status status_{Status::kOk};
Platform* platform_;
@@ -59,6 +91,30 @@ class ProcessorImpl : public Processor {
#define DCHECK(cond) (void(0))
#endif
+#define USE(var) ((void)var)
+
+// RAII memory for a Digits array.
+class Storage {
+ public:
+ explicit Storage(int count) : ptr_(new digit_t[count]) {}
+
+ digit_t* get() { return ptr_.get(); }
+
+ private:
+ std::unique_ptr<digit_t[]> ptr_;
+};
+
+// A writable Digits array with attached storage.
+class ScratchDigits : public RWDigits {
+ public:
+ explicit ScratchDigits(int len) : RWDigits(nullptr, len), storage_(len) {
+ digits_ = storage_.get();
+ }
+
+ private:
+ Storage storage_;
+};
+
} // namespace bigint
} // namespace v8