703de39bfa955cb49ba2b3dcf12d4b0b76b847b8
[trex.git] /
1
2 #include "int128.h"
3 #include "common.h"
4
5 void xor2(int128 *r, const int128 *x)
6 {
7   r->u64[0] ^= x->u64[0];
8   r->u64[1] ^= x->u64[1];
9 }
10
11 void and2(int128 *r, const int128 *x)
12 {
13   r->u64[0] &= x->u64[0];
14   r->u64[1] &= x->u64[1];
15 }
16
17 void or2(int128 *r, const int128 *x)
18 {
19   r->u64[0] |= x->u64[0];
20   r->u64[1] |= x->u64[1];
21 }
22
23 void copy2(int128 *r, const int128 *x)
24 {
25   r->u64[0] = x->u64[0];
26   r->u64[1] = x->u64[1];
27 }
28
29 void shufb(int128 *r, const unsigned char *l)
30 {
31   int128   t;
32   uint8_t *ct;
33   uint8_t *cr;
34
35   copy2(&t, r);
36   cr = r->u8;
37   ct = t.u8;
38   cr[0] = ct[l[0]];
39   cr[1] = ct[l[1]];
40   cr[2] = ct[l[2]];
41   cr[3] = ct[l[3]];
42   cr[4] = ct[l[4]];
43   cr[5] = ct[l[5]];
44   cr[6] = ct[l[6]];
45   cr[7] = ct[l[7]];
46   cr[8] = ct[l[8]];
47   cr[9] = ct[l[9]];
48   cr[10] = ct[l[10]];
49   cr[11] = ct[l[11]];
50   cr[12] = ct[l[12]];
51   cr[13] = ct[l[13]];
52   cr[14] = ct[l[14]];
53   cr[15] = ct[l[15]];
54 }
55
56 void shufd(int128 *r, const int128 *x, const unsigned int c)
57 {
58   int128 t;
59
60   t.u32[0] = x->u32[c >> 0 & 3];
61   t.u32[1] = x->u32[c >> 2 & 3];
62   t.u32[2] = x->u32[c >> 4 & 3];
63   t.u32[3] = x->u32[c >> 6 & 3];
64   copy2(r, &t);
65 }
66
67 void rshift32_littleendian(int128 *r, const unsigned int n)
68 {
69   unsigned char *rp = (unsigned char *)r;
70   uint32 t;
71   t = load32_littleendian(rp);
72   t >>= n;
73   store32_littleendian(rp, t);
74   t = load32_littleendian(rp+4);
75   t >>= n;
76   store32_littleendian(rp+4, t);
77   t = load32_littleendian(rp+8);
78   t >>= n;
79   store32_littleendian(rp+8, t);
80   t = load32_littleendian(rp+12);
81   t >>= n;
82   store32_littleendian(rp+12, t);
83 }
84
85 void rshift64_littleendian(int128 *r, const unsigned int n)
86 {
87   unsigned char *rp = (unsigned char *)r;
88   uint64 t;
89   t = load64_littleendian(rp);
90   t >>= n;
91   store64_littleendian(rp, t);
92   t = load64_littleendian(rp+8);
93   t >>= n;
94   store64_littleendian(rp+8, t);
95 }
96
97 void lshift64_littleendian(int128 *r, const unsigned int n)
98 {
99   unsigned char *rp = (unsigned char *)r;
100   uint64 t;
101   t = load64_littleendian(rp);
102   t <<= n;
103   store64_littleendian(rp, t);
104   t = load64_littleendian(rp+8);
105   t <<= n;
106   store64_littleendian(rp+8, t);
107 }
108
109 void toggle(int128 *r)
110 {
111   r->u64[0] ^= 0xffffffffffffffffULL;
112   r->u64[1] ^= 0xffffffffffffffffULL;
113 }
114
115 void xor_rcon(int128 *r)
116 {
117   unsigned char *rp = (unsigned char *)r;
118   uint32 t;
119   t = load32_littleendian(rp+12);
120   t ^= 0xffffffff;
121   store32_littleendian(rp+12, t);
122 }
123
124 void add_uint32_big(int128 *r, uint32 x)
125 {
126   unsigned char *rp = (unsigned char *)r;
127   uint32 t;
128   t = load32_littleendian(rp+12);
129   t += x;
130   store32_littleendian(rp+12, t);
131 }