boothby

cython m1ri base case

Mar 25th, 2012
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.43 KB | None | 0 0
  1. #  M1RI Base Case.
  2. #
  3. #  This is a standalone demo which implements 64x64 matrix multiplication
  4. #  in a bitsliced representation of GF(3).
  5. #
  6. #  Copyright (c) 2008-2012 Tomas Boothby
  7. #  Distributed under the terms of the GNU General Public License (GPL3)
  8. #
  9. #  NOT FIT FOR ANY USE
  10.  
  11. cdef struct vec3:
  12.     long s
  13.     long u
  14.  
  15. cdef inline void v3_add(vec3 *r,vec3 *a,vec3 *b):
  16.     cdef long t
  17.        
  18.     r.u = b.s ^ a.u
  19.     r.s = b.u ^ a.s
  20.     r.s = r.s & r.u
  21.     r.u = r.u ^ a.s
  22.     t = b.u ^ a.u
  23.     r.u = t | r.u
  24.    
  25. cdef inline void v3_sub(vec3 *r, vec3 *a, vec3 *b):
  26.     cdef long t
  27.    
  28.     r.s = b.u ^ a.u
  29.     r.u = b.s ^ a.s
  30.     r.u = r.u | r.s
  31.     r.s = r.s ^ b.s
  32.     t = b.u ^ a.s
  33.     r.s = t & r.s    
  34.  
  35.  
  36. cdef inline void v3_mul(vec3 *r, vec3 *a, vec3 *b):
  37.     r.u = b.u & a.u
  38.     r.s = b.s ^ a.s
  39.     r.s = r.s & r.u
  40.    
  41.    
  42. cdef inline void v3_iadd(vec3 *r, vec3 *a):
  43.     cdef long t
  44.    
  45.     t = a.u ^ r.s
  46.     r.s = a.s ^ r.u
  47.     r.u = a.u ^ r.u
  48.     r.s = r.s & t
  49.     t = t ^ a.s
  50.     r.u = t | r.u
  51.  
  52.  
  53. cdef inline void v3_isub(vec3 *r, vec3 *a):
  54.     cdef long t
  55.    
  56.     r.u = a.u ^ r.u
  57.     t = r.u | r.s
  58.     t = t ^ a.s
  59.     r.s = a.u ^ r.s
  60.     r.s = r.s & t
  61.     r.u = t | r.u
  62.  
  63. cdef inline void combine4(vec3 *table, vec3 *input):
  64.     cdef vec3 t, a, b, c, d
  65.     t.s = t.u = 0
  66.     a = input[0]
  67.     b = input[1]
  68.     c = input[2]
  69.     d = input[3]
  70.  
  71.     table[0] = t
  72.     table[1] = a
  73.     table[2] = b
  74.     table[4] = c
  75.     table[8] = d
  76.  
  77.     v3_add(&t,&c,&d)
  78.     table[12] = t
  79.    
  80.     v3_add(&t,&b,&c)
  81.     table[6] = t
  82.     v3_iadd(&t,&d)
  83.     table[14] = t
  84.     v3_isub(&t,&c)
  85.     table[10] = t
  86.  
  87.     v3_add(&t,&a,&b)
  88.     table[3] = t
  89.     v3_iadd(&t,&d)
  90.     table[11] = t
  91.     v3_iadd(&t,&c)
  92.     table[15] = t
  93.     v3_isub(&t,&d)
  94.     table[7] = t
  95.     v3_isub(&t,&b)
  96.     table[5] = t
  97.     v3_iadd(&t,&d)
  98.     table[13] = t
  99.     v3_isub(&t,&c)
  100.     table[9] = t
  101.  
  102. cdef inline void combine5(vec3 *table, vec3 *input):
  103.     cdef vec3 e, *t4
  104.     cdef int i
  105.  
  106.     combine4(table, input)
  107.     e = input[4]
  108.     t4 = table+16
  109.     table[16] = e
  110.    
  111.     for i from 0 < i < 16:
  112.         v3_add(t4 + i, table+i, &e)
  113.    
  114. cdef inline void combine6(vec3 *table, vec3 *input):
  115.     cdef vec3 e, *t4
  116.     cdef vec3 f, *t5
  117.     cdef int i
  118.    
  119.     combine4(table, input)
  120.     e = input[4]
  121.     t4 = table+16
  122.     table[16] = e
  123.  
  124.     f = input[5]
  125.     t5 = table+32
  126.     table[32] = f
  127.    
  128.     for i from 0 < i < 16:
  129.         v3_add(t4 + i, table+i, &e)
  130.  
  131.     for i from 0 < i < 32:
  132.         v3_add(t5 + i, table+i, &f)
  133.  
  134. cdef void mul_64(vec3 *R, vec3 *A, vec3 *B):
  135.     cdef int i
  136.     cdef vec3 t1, t2, r1, r2, a
  137.     cdef long v1, v2
  138.  
  139.     cdef vec3 tables6[4][64]
  140.     cdef vec3 tables5[8][32]
  141.     for i from 0 <= i < 4:
  142.         combine6(tables6[i], B + 0 + 6*i)
  143.     for i from 0 <= i < 8:
  144.         combine5(tables5[i], B + 24 + 5*i)
  145.     for i from 0 <= i < 64:
  146.         a = A[i]
  147.         v2 = a.s
  148.         v1 = a.u ^ v2
  149.         r1 = tables6[0][v1&63];                    v1 >>= 6;
  150.         r2 = tables6[0][v2&63];                    v2 >>= 6;
  151.         t1 = tables6[1][v1&63]; v3_iadd(&r1, &t1); v1 >>= 6;
  152.         t2 = tables6[1][v2&63]; v3_iadd(&r2, &t2); v2 >>= 6;
  153.         t1 = tables6[2][v1&63]; v3_iadd(&r1, &t1); v1 >>= 6;
  154.         t2 = tables6[2][v2&63]; v3_iadd(&r2, &t2); v2 >>= 6;
  155.         t1 = tables6[3][v1&63]; v3_iadd(&r1, &t1); v1 >>= 6;
  156.         t2 = tables6[3][v2&63]; v3_iadd(&r2, &t2); v2 >>= 6;
  157.         t1 = tables5[0][v1&31]; v3_iadd(&r1, &t1); v1 >>= 5;
  158.         t2 = tables5[0][v2&31]; v3_iadd(&r2, &t2); v2 >>= 5;
  159.         t1 = tables5[1][v1&31]; v3_iadd(&r1, &t1); v1 >>= 5;
  160.         t2 = tables5[1][v2&31]; v3_iadd(&r2, &t2); v2 >>= 5;
  161.         t1 = tables5[2][v1&31]; v3_iadd(&r1, &t1); v1 >>= 5;
  162.         t2 = tables5[2][v2&31]; v3_iadd(&r2, &t2); v2 >>= 5;
  163.         t1 = tables5[3][v1&31]; v3_iadd(&r1, &t1); v1 >>= 5;
  164.         t2 = tables5[3][v2&31]; v3_iadd(&r2, &t2); v2 >>= 5;
  165.         t1 = tables5[4][v1&31]; v3_iadd(&r1, &t1); v1 >>= 5;
  166.         t2 = tables5[4][v2&31]; v3_iadd(&r2, &t2); v2 >>= 5;
  167.         t1 = tables5[5][v1&31]; v3_iadd(&r1, &t1); v1 >>= 5;
  168.         t2 = tables5[5][v2&31]; v3_iadd(&r2, &t2); v2 >>= 5;
  169.         t1 = tables5[6][v1&31]; v3_iadd(&r1, &t1); v1 >>= 5;
  170.         t2 = tables5[6][v2&31]; v3_iadd(&r2, &t2); v2 >>= 5;
  171.         t1 = tables5[7][v1&31]; v3_iadd(&r1, &t1);
  172.         t2 = tables5[7][v2&31]; v3_iadd(&r2, &t2);
  173.  
  174.         v3_isub(&r1, &r2)
  175.         R[i] = r1
Advertisement
Add Comment
Please, Sign In to add comment