diff options
Diffstat (limited to 'deps/v8/src/bigint/bigint-internal.h')
-rw-r--r-- | deps/v8/src/bigint/bigint-internal.h | 62 |
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 |