aboutsummaryrefslogtreecommitdiffstats
path: root/pow/ar/ops.go
diff options
context:
space:
mode:
Diffstat (limited to 'pow/ar/ops.go')
-rw-r--r--pow/ar/ops.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/pow/ar/ops.go b/pow/ar/ops.go
new file mode 100644
index 000000000..3a099be08
--- /dev/null
+++ b/pow/ar/ops.go
@@ -0,0 +1,54 @@
+package ar
+
+import "math/big"
+
+const lenops int64 = 9
+
+type OpsFunc func(a, b *big.Int) *big.Int
+
+var ops [lenops]OpsFunc
+
+func init() {
+ ops[0] = Add
+ ops[1] = Mul
+ ops[2] = Mod
+ ops[3] = Xor
+ ops[4] = And
+ ops[5] = Or
+ ops[6] = Sub1
+ ops[7] = XorSub
+ ops[8] = Rsh
+}
+
+func Add(x, y *big.Int) *big.Int {
+ return new(big.Int).Add(x, y)
+}
+func Mul(x, y *big.Int) *big.Int {
+ return new(big.Int).Mul(x, y)
+}
+func Mod(x, y *big.Int) *big.Int {
+ return new(big.Int).Mod(x, y)
+}
+func Xor(x, y *big.Int) *big.Int {
+ return new(big.Int).Xor(x, y)
+}
+func And(x, y *big.Int) *big.Int {
+ return new(big.Int).And(x, y)
+}
+func Or(x, y *big.Int) *big.Int {
+ return new(big.Int).Or(x, y)
+}
+func Sub1(x, y *big.Int) *big.Int {
+ a := big.NewInt(-1)
+ a.Sub(a, x)
+
+ return a
+}
+func XorSub(x, y *big.Int) *big.Int {
+ t := Sub1(x, nil)
+
+ return t.Xor(t, y)
+}
+func Rsh(x, y *big.Int) *big.Int {
+ return new(big.Int).Rsh(x, uint(y.Uint64()%64))
+}