Sfoglia il codice sorgente

improved octa-double mul with cl

Nicolas Winkler 4 anni fa
parent
commit
f6fd417c2c
2 ha cambiato i file con 289 aggiunte e 1 eliminazioni
  1. 64 0
      libmandel/src/opencl/octadouble.cl
  2. 225 1
      libmandel/src/opencl/octadouble.h

+ 64 - 0
libmandel/src/opencl/octadouble.cl

@@ -123,6 +123,70 @@ inline OctaDouble add(const __private OctaDouble* a, const __private OctaDouble*
 
 inline OctaDouble mul(const __private OctaDouble* a, const __private OctaDouble* b)
 {
+    double2 p0 = twoProd(a->s0, b->s0);
+
+    double2 q0 = twoProd(a->s0, b->s1);
+    double2 q1 = twoProd(a->s1, b->s0);
+
+    double2 r0 = twoProd(a->s2, b->s0);
+    double2 r1 = twoProd(a->s1, b->s1);
+    double2 r2 = twoProd(a->s0, b->s2);
+
+    double2 s0 = twoProd(a->s3, b->s0);
+    double2 s1 = twoProd(a->s2, b->s1);
+    double2 s2 = twoProd(a->s1, b->s2);
+    double2 s3 = twoProd(a->s0, b->s3);
+
+    double2 t0 = twoProd(a->s4, b->s0);
+    double2 t1 = twoProd(a->s3, b->s1);
+    double2 t2 = twoProd(a->s2, b->s2);
+    double2 t3 = twoProd(a->s1, b->s3);
+    double2 t4 = twoProd(a->s0, b->s4);
+
+    double2 u0 = twoProd(a->s5, b->s0);
+    double2 u1 = twoProd(a->s4, b->s1);
+    double2 u2 = twoProd(a->s3, b->s2);
+    double2 u3 = twoProd(a->s2, b->s3);
+    double2 u4 = twoProd(a->s1, b->s4);
+    double2 u5 = twoProd(a->s0, b->s5);
+
+    double2 v0 = twoProd(a->s6, b->s0);
+    double2 v1 = twoProd(a->s5, b->s1);
+    double2 v2 = twoProd(a->s4, b->s2);
+    double2 v3 = twoProd(a->s3, b->s3);
+    double2 v4 = twoProd(a->s2, b->s4);
+    double2 v5 = twoProd(a->s1, b->s5);
+    double2 v6 = twoProd(a->s0, b->s6);
+
+    double a1 = p0.s0;
+    double3 a2t12 = threeSum(p0.s1, q0.s0, q1.s0);
+    double3 a3t34 = sixThreeSum(q0.s1, q1.s1, r0.s0, r1.s0, r2.s0, a2t12.s1);
+    double3 a4t56 = nineThreeSum(r0.s1, r1.s1, r2.s1, s0.s0, s1.s0, s2.s0, s3.s0, a3t34.s1, a2t12.s2);
+    double3 x123 = nineThreeSum(s0.s1, s1.s1, s2.s1, s3.s1, t0.s0, t1.s0, t2.s0, t3.s0, t4.s0);
+    double3 a5t78 = sixThreeSum(x123.s0, x123.s1, x123.s2, a4t56.s1, a3t34.s2, 0.0);
+    double3 y123 = nineThreeSum(t0.s1, t1.s1, t2.s1, t3.s1, t4.s1, u0.s0, u1.s0, u2.s0, u3.s0);
+    double3 a6t9a = nineThreeSum(y123.s0, y123.s1, y123.s2, u4.s0, u5.s0, a5t78.s1, a4t56.s2, 0.0, 0.0);
+    double3 z123 = nineThreeSum(u0.s1, u1.s1, u2.s1, u3.s1, u4.s1, u5.s1, v0.s0, v1.s0, v2.s0);
+    double3 a7tbc = nineThreeSum(v3.s0, v4.s0, v5.s0, v6.s0, z123.s0, z123.s1, z123.s2, a6t9a.s1, a6t9a.s2);
+    double a8 = v0.s1 + v1.s1 + v2.s1 + v3.s1 + v4.s1 + v5.s1 + v6.s1 + a7tbc.s1 + a7tbc.s2 +
+        a->s7 * b->s0 + 
+        a->s6 * b->s1 + 
+        a->s5 * b->s2 + 
+        a->s4 * b->s3 + 
+        a->s3 * b->s4 + 
+        a->s2 * b->s5 + 
+        a->s1 * b->s6 + 
+        a->s0 * b->s7;
+
+
+    double2 re0 = quickTwoSum(a1, a2t12.s0);
+    double2 re1 = quickTwoSum(re0.s1, a3t34.s0);
+    double2 re2 = quickTwoSum(re1.s1, a4t56.s0);
+    double2 re3 = quickTwoSum(re2.s1, a5t78.s0);
+    double2 re4 = quickTwoSum(re3.s1, a6t9a.s0);
+    double2 re5 = quickTwoSum(re4.s1, a7tbc.s0);
+    double2 re67 = quickTwoSum(re5.s1, a8);
+    return (OctaDouble)(re0.s0, re1.s0, re2.s0, re3.s0, re4.s0, re5.s0, re67.s0, re67.s1);
 
     double r[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
     for (int i = 0; i < 8; i++) {

+ 225 - 1
libmandel/src/opencl/octadouble.h

@@ -305,6 +305,230 @@ unsigned char octadouble_cl[] = {
   0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x70,
   0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x4f, 0x63, 0x74, 0x61, 0x44,
   0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2a, 0x20, 0x62, 0x29, 0x0a, 0x7b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x70, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
+  0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73,
+  0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x71, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x2c,
+  0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x71, 0x31, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d,
+  0x3e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x30, 0x29, 0x3b,
+  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72,
+  0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x32, 0x2c, 0x20, 0x62, 0x2d,
+  0x3e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x31,
+  0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x32,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61,
+  0x2d, 0x3e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x32, 0x29,
+  0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50,
+  0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x33, 0x2c, 0x20, 0x62,
+  0x2d, 0x3e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20,
+  0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73,
+  0x32, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x73,
+  0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28,
+  0x61, 0x2d, 0x3e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x32,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x32, 0x20, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50,
+  0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x2c, 0x20, 0x62,
+  0x2d, 0x3e, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x30, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e,
+  0x73, 0x34, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x30, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x74, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
+  0x28, 0x61, 0x2d, 0x3e, 0x73, 0x33, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73,
+  0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x74, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f,
+  0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x32, 0x2c, 0x20,
+  0x62, 0x2d, 0x3e, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x74, 0x33, 0x20, 0x3d,
+  0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e,
+  0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x33, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20,
+  0x74, 0x34, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64,
+  0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73,
+  0x34, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x75, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x35, 0x2c,
+  0x20, 0x62, 0x2d, 0x3e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x75, 0x31, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d,
+  0x3e, 0x73, 0x34, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x75, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f,
+  0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x33, 0x2c, 0x20, 0x62, 0x2d, 0x3e,
+  0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x75, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x77,
+  0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x32, 0x2c,
+  0x20, 0x62, 0x2d, 0x3e, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x75, 0x34, 0x20,
+  0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d,
+  0x3e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x34, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32,
+  0x20, 0x75, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f,
+  0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x2d, 0x3e,
+  0x73, 0x35, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x76, 0x30, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x36,
+  0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x76, 0x31,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61,
+  0x2d, 0x3e, 0x73, 0x35, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x76, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72,
+  0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x34, 0x2c, 0x20, 0x62, 0x2d,
+  0x3e, 0x73, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x76, 0x33, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x33,
+  0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x33, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x76, 0x34,
+  0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61,
+  0x2d, 0x3e, 0x73, 0x32, 0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x34, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x32, 0x20, 0x76, 0x35, 0x20, 0x3d, 0x20, 0x74, 0x77, 0x6f, 0x50, 0x72,
+  0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x2d,
+  0x3e, 0x73, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x76, 0x36, 0x20, 0x3d, 0x20, 0x74,
+  0x77, 0x6f, 0x50, 0x72, 0x6f, 0x64, 0x28, 0x61, 0x2d, 0x3e, 0x73, 0x30,
+  0x2c, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x36, 0x29, 0x3b, 0x0a, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x31,
+  0x20, 0x3d, 0x20, 0x70, 0x30, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x32,
+  0x74, 0x31, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x53,
+  0x75, 0x6d, 0x28, 0x70, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x71, 0x30,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x71, 0x31, 0x2e, 0x73, 0x30, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33,
+  0x20, 0x61, 0x33, 0x74, 0x33, 0x34, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x78,
+  0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x71, 0x30, 0x2e,
+  0x73, 0x31, 0x2c, 0x20, 0x71, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72,
+  0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x61, 0x32, 0x74, 0x31,
+  0x32, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20, 0x61, 0x34, 0x74, 0x35, 0x36,
+  0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6e, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65,
+  0x53, 0x75, 0x6d, 0x28, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72,
+  0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x73, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2e, 0x73,
+  0x30, 0x2c, 0x20, 0x73, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x33,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x61, 0x33, 0x74, 0x33, 0x34, 0x2e, 0x73,
+  0x31, 0x2c, 0x20, 0x61, 0x32, 0x74, 0x31, 0x32, 0x2e, 0x73, 0x32, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x33, 0x20, 0x78, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6e,
+  0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x73, 0x30,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20,
+  0x73, 0x32, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x33, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x74, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x31, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x74, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74,
+  0x33, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x74, 0x34, 0x2e, 0x73, 0x30, 0x29,
+  0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+  0x33, 0x20, 0x61, 0x35, 0x74, 0x37, 0x38, 0x20, 0x3d, 0x20, 0x73, 0x69,
+  0x78, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x78, 0x31,
+  0x32, 0x33, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x78, 0x31, 0x32, 0x33, 0x2e,
+  0x73, 0x31, 0x2c, 0x20, 0x78, 0x31, 0x32, 0x33, 0x2e, 0x73, 0x32, 0x2c,
+  0x20, 0x61, 0x34, 0x74, 0x35, 0x36, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x61,
+  0x33, 0x74, 0x33, 0x34, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x30,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x33, 0x20, 0x79, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x6e, 0x69,
+  0x6e, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x74,
+  0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x31, 0x2e, 0x73, 0x31, 0x2c,
+  0x20, 0x74, 0x32, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x74, 0x33, 0x2e, 0x73,
+  0x31, 0x2c, 0x20, 0x74, 0x34, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x75, 0x30,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x75, 0x31, 0x2e, 0x73, 0x30, 0x2c, 0x20,
+  0x75, 0x32, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x75, 0x33, 0x2e, 0x73, 0x30,
+  0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+  0x65, 0x33, 0x20, 0x61, 0x36, 0x74, 0x39, 0x61, 0x20, 0x3d, 0x20, 0x6e,
+  0x69, 0x6e, 0x65, 0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28,
+  0x79, 0x31, 0x32, 0x33, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x79, 0x31, 0x32,
+  0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x79, 0x31, 0x32, 0x33, 0x2e, 0x73,
+  0x32, 0x2c, 0x20, 0x75, 0x34, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x75, 0x35,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x61, 0x35, 0x74, 0x37, 0x38, 0x2e, 0x73,
+  0x31, 0x2c, 0x20, 0x61, 0x34, 0x74, 0x35, 0x36, 0x2e, 0x73, 0x32, 0x2c,
+  0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
+  0x7a, 0x31, 0x32, 0x33, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6e, 0x65, 0x54,
+  0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x75, 0x30, 0x2e, 0x73,
+  0x31, 0x2c, 0x20, 0x75, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x75, 0x32,
+  0x2e, 0x73, 0x31, 0x2c, 0x20, 0x75, 0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20,
+  0x75, 0x34, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x75, 0x35, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x76, 0x30, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x76, 0x31, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x76, 0x32, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x33, 0x20,
+  0x61, 0x37, 0x74, 0x62, 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6e, 0x65,
+  0x54, 0x68, 0x72, 0x65, 0x65, 0x53, 0x75, 0x6d, 0x28, 0x76, 0x33, 0x2e,
+  0x73, 0x30, 0x2c, 0x20, 0x76, 0x34, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x76,
+  0x35, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x76, 0x36, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x7a, 0x31, 0x32, 0x33, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x7a, 0x31,
+  0x32, 0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x7a, 0x31, 0x32, 0x33, 0x2e,
+  0x73, 0x32, 0x2c, 0x20, 0x61, 0x36, 0x74, 0x39, 0x61, 0x2e, 0x73, 0x31,
+  0x2c, 0x20, 0x61, 0x36, 0x74, 0x39, 0x61, 0x2e, 0x73, 0x32, 0x29, 0x3b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+  0x61, 0x38, 0x20, 0x3d, 0x20, 0x76, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x2b,
+  0x20, 0x76, 0x31, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x76, 0x32, 0x2e,
+  0x73, 0x31, 0x20, 0x2b, 0x20, 0x76, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x2b,
+  0x20, 0x76, 0x34, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x76, 0x35, 0x2e,
+  0x73, 0x31, 0x20, 0x2b, 0x20, 0x76, 0x36, 0x2e, 0x73, 0x31, 0x20, 0x2b,
+  0x20, 0x61, 0x37, 0x74, 0x62, 0x63, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20,
+  0x61, 0x37, 0x74, 0x62, 0x63, 0x2e, 0x73, 0x32, 0x20, 0x2b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e, 0x73, 0x37,
+  0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e, 0x73,
+  0x36, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x31, 0x20, 0x2b, 0x20,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d, 0x3e,
+  0x73, 0x35, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x32, 0x20, 0x2b,
+  0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2d,
+  0x3e, 0x73, 0x34, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x33, 0x20,
+  0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61,
+  0x2d, 0x3e, 0x73, 0x33, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x73, 0x34,
+  0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x61, 0x2d, 0x3e, 0x73, 0x32, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e, 0x73,
+  0x35, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x61, 0x2d, 0x3e, 0x73, 0x31, 0x20, 0x2a, 0x20, 0x62, 0x2d, 0x3e,
+  0x73, 0x36, 0x20, 0x2b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x61, 0x2d, 0x3e, 0x73, 0x30, 0x20, 0x2a, 0x20, 0x62, 0x2d,
+  0x3e, 0x73, 0x37, 0x3b, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x30, 0x20, 0x3d,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x61, 0x31, 0x2c, 0x20, 0x61, 0x32, 0x74, 0x31, 0x32, 0x2e, 0x73,
+  0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x71, 0x75,
+  0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72, 0x65,
+  0x30, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x61, 0x33, 0x74, 0x33, 0x34, 0x2e,
+  0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x32, 0x20, 0x3d, 0x20, 0x71,
+  0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28, 0x72,
+  0x65, 0x31, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x61, 0x34, 0x74, 0x35, 0x36,
+  0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x33, 0x20, 0x3d, 0x20,
+  0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d, 0x28,
+  0x72, 0x65, 0x32, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x61, 0x35, 0x74, 0x37,
+  0x38, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x34, 0x20, 0x3d,
+  0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75, 0x6d,
+  0x28, 0x72, 0x65, 0x33, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x61, 0x36, 0x74,
+  0x39, 0x61, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x35, 0x20,
+  0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f, 0x53, 0x75,
+  0x6d, 0x28, 0x72, 0x65, 0x34, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x61, 0x37,
+  0x74, 0x62, 0x63, 0x2e, 0x73, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x32, 0x20, 0x72, 0x65, 0x36,
+  0x37, 0x20, 0x3d, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x54, 0x77, 0x6f,
+  0x53, 0x75, 0x6d, 0x28, 0x72, 0x65, 0x35, 0x2e, 0x73, 0x31, 0x2c, 0x20,
+  0x61, 0x38, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74,
+  0x75, 0x72, 0x6e, 0x20, 0x28, 0x4f, 0x63, 0x74, 0x61, 0x44, 0x6f, 0x75,
+  0x62, 0x6c, 0x65, 0x29, 0x28, 0x72, 0x65, 0x30, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x72, 0x65, 0x31, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x32,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x33, 0x2e, 0x73, 0x30, 0x2c,
+  0x20, 0x72, 0x65, 0x34, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x35,
+  0x2e, 0x73, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x36, 0x37, 0x2e, 0x73, 0x30,
+  0x2c, 0x20, 0x72, 0x65, 0x36, 0x37, 0x2e, 0x73, 0x31, 0x29, 0x3b, 0x0a,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
   0x72, 0x5b, 0x38, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20,
   0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20,
@@ -709,4 +933,4 @@ unsigned char octadouble_cl[] = {
   0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x5d, 0x20, 0x3d,
   0x20, 0x35, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a
 };
-unsigned int octadouble_cl_len = 8503;
+unsigned int octadouble_cl_len = 11191;