source: trunk/lib/idisa128.hpp @ 1511

Last change on this file since 1511 was 1511, checked in by ksherdy, 8 years ago

Prefer typedef over #define.

File size: 121.0 KB
Line 
1#ifndef _IDISA_SSE2_H
2#define _IDISA_SSE2_H
3#include <emmintrin.h>
4typedef __m128i BitBlock;
5
6template <int fw>
7class simd
8{
9public:
10        static inline BitBlock max(BitBlock arg1, BitBlock arg2);
11        static inline BitBlock mult(BitBlock arg1, BitBlock arg2);
12        static inline BitBlock gt(BitBlock arg1, BitBlock arg2);
13        static inline BitBlock umult(BitBlock arg1, BitBlock arg2);
14        static inline BitBlock ult(BitBlock arg1, BitBlock arg2);
15        template <int sh> static inline BitBlock srli(BitBlock arg1);
16        static inline BitBlock ctz(BitBlock arg1);
17        static inline BitBlock sll(BitBlock arg1, BitBlock shift_mask);
18        static inline BitBlock eq(BitBlock arg1, BitBlock arg2);
19        static inline BitBlock popcount(BitBlock arg1);
20        static inline BitBlock sra(BitBlock arg1, BitBlock shift_mask);
21        static inline BitBlock neg(BitBlock arg1);
22        static inline BitBlock himask();
23        template <int sh> static inline BitBlock slli(BitBlock arg1);
24        static inline BitBlock ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3);
25        static inline BitBlock sub(BitBlock arg1, BitBlock arg2);
26        static inline BitBlock add_hl(BitBlock arg1);
27        static inline BitBlock srl(BitBlock arg1, BitBlock shift_mask);
28        static inline BitBlock sub_hl(BitBlock arg1);
29        static inline BitBlock umin(BitBlock arg1, BitBlock arg2);
30        template <int val> static inline BitBlock constant();
31        static inline BitBlock min(BitBlock arg1, BitBlock arg2);
32        static inline BitBlock lomask();
33        static inline BitBlock umax(BitBlock arg1, BitBlock arg2);
34        static inline BitBlock abs(BitBlock arg1);
35        static inline BitBlock xor_hl(BitBlock arg1);
36        template <int sh> static inline BitBlock srai(BitBlock arg1);
37        static inline BitBlock lt(BitBlock arg1, BitBlock arg2);
38        static inline BitBlock add(BitBlock arg1, BitBlock arg2);
39        static inline BitBlock ugt(BitBlock arg1, BitBlock arg2);
40};
41
42template <int fw>
43class hsimd
44{
45public:
46        static inline BitBlock umin_hl(BitBlock arg1, BitBlock arg2);
47        static inline BitBlock add_hl(BitBlock arg1, BitBlock arg2);
48        static inline BitBlock packss(BitBlock arg1, BitBlock arg2);
49        static inline int signmask(BitBlock arg1);
50        static inline BitBlock packh(BitBlock arg1, BitBlock arg2);
51        static inline BitBlock packl(BitBlock arg1, BitBlock arg2);
52        static inline BitBlock min_hl(BitBlock arg1, BitBlock arg2);
53        static inline BitBlock packus(BitBlock arg1, BitBlock arg2);
54};
55
56template <int fw>
57class esimd
58{
59public:
60        static inline void merge(BitBlock arg1, BitBlock arg2, BitBlock &u, BitBlock &v);
61        static inline BitBlock mergel(BitBlock arg1, BitBlock arg2);
62        static inline BitBlock signextendh(BitBlock arg1);
63        static inline BitBlock mergeh(BitBlock arg1, BitBlock arg2);
64        static inline BitBlock multl(BitBlock arg1, BitBlock arg2);
65        static inline BitBlock multh(BitBlock arg1, BitBlock arg2);
66        static inline BitBlock zeroextendh(BitBlock arg1);
67        static inline BitBlock zeroextendl(BitBlock arg1);
68        static inline BitBlock signextendl(BitBlock arg1);
69};
70
71template <int fw>
72class mvmd
73{
74public:
75        template <int msk> static inline BitBlock shufflei(BitBlock arg1);
76        template <int sh> static inline BitBlock dsrli(BitBlock arg1, BitBlock arg2);
77        static inline BitBlock fill(int val1);
78        static inline BitBlock shuffle(BitBlock arg1, BitBlock arg2);
79        template <int pos> static inline BitBlock splat(BitBlock arg1);
80        template <int sh> static inline BitBlock slli(BitBlock arg1);
81        static inline BitBlock fill4(int val1, int val2, int val3, int val4);
82        template <int sh> static inline BitBlock srli(BitBlock arg1);
83        static inline BitBlock fill2(int val1, int val2);
84        template <int sh> static inline BitBlock dslli(BitBlock arg1, BitBlock arg2);
85        static inline BitBlock fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8);
86        static inline BitBlock fill16(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8, int val9, int val10, int val11, int val12, int val13, int val14, int val15, int val16);
87};
88
89template<class BB>
90class bitblock
91{
92public:
93        static inline BB load_unaligned(BB* arg1);
94        static inline void store_aligned(BB* arg1, BB arg2);
95        static inline bool all(BB arg1);
96        static inline bool any(BB arg1);
97        static inline BB load_aligned(BB* arg1);
98        static inline void store_unaligned(BB* arg1, BB arg2);
99};
100
101//Declaration Part
102inline BitBlock simd_nor(BitBlock arg1, BitBlock arg2);
103inline BitBlock simd_not(BitBlock arg1);
104inline BitBlock simd_andc(BitBlock arg1, BitBlock arg2);
105inline BitBlock simd_or(BitBlock arg1, BitBlock arg2);
106inline BitBlock simd_and(BitBlock arg1, BitBlock arg2);
107inline BitBlock simd_xor(BitBlock arg1, BitBlock arg2);
108template <> inline BitBlock simd<1>::max(BitBlock arg1, BitBlock arg2);
109template <> inline BitBlock simd<2>::max(BitBlock arg1, BitBlock arg2);
110template <> inline BitBlock simd<4>::max(BitBlock arg1, BitBlock arg2);
111template <> inline BitBlock simd<8>::max(BitBlock arg1, BitBlock arg2);
112template <> inline BitBlock simd<16>::max(BitBlock arg1, BitBlock arg2);
113template <> inline BitBlock simd<32>::max(BitBlock arg1, BitBlock arg2);
114template <> inline BitBlock simd<64>::max(BitBlock arg1, BitBlock arg2);
115template <> inline BitBlock simd<128>::max(BitBlock arg1, BitBlock arg2);
116template <> inline BitBlock simd<1>::mult(BitBlock arg1, BitBlock arg2);
117template <> inline BitBlock simd<2>::mult(BitBlock arg1, BitBlock arg2);
118template <> inline BitBlock simd<4>::mult(BitBlock arg1, BitBlock arg2);
119template <> inline BitBlock simd<8>::mult(BitBlock arg1, BitBlock arg2);
120template <> inline BitBlock simd<16>::mult(BitBlock arg1, BitBlock arg2);
121template <> inline BitBlock simd<32>::mult(BitBlock arg1, BitBlock arg2);
122template <> inline BitBlock simd<64>::mult(BitBlock arg1, BitBlock arg2);
123template <> inline BitBlock simd<128>::mult(BitBlock arg1, BitBlock arg2);
124template <> inline BitBlock simd<1>::gt(BitBlock arg1, BitBlock arg2);
125template <> inline BitBlock simd<2>::gt(BitBlock arg1, BitBlock arg2);
126template <> inline BitBlock simd<4>::gt(BitBlock arg1, BitBlock arg2);
127template <> inline BitBlock simd<8>::gt(BitBlock arg1, BitBlock arg2);
128template <> inline BitBlock simd<16>::gt(BitBlock arg1, BitBlock arg2);
129template <> inline BitBlock simd<32>::gt(BitBlock arg1, BitBlock arg2);
130template <> inline BitBlock simd<64>::gt(BitBlock arg1, BitBlock arg2);
131template <> inline BitBlock simd<128>::gt(BitBlock arg1, BitBlock arg2);
132template <> inline BitBlock simd<1>::umult(BitBlock arg1, BitBlock arg2);
133template <> inline BitBlock simd<2>::umult(BitBlock arg1, BitBlock arg2);
134template <> inline BitBlock simd<4>::umult(BitBlock arg1, BitBlock arg2);
135template <> inline BitBlock simd<8>::umult(BitBlock arg1, BitBlock arg2);
136template <> inline BitBlock simd<16>::umult(BitBlock arg1, BitBlock arg2);
137template <> inline BitBlock simd<32>::umult(BitBlock arg1, BitBlock arg2);
138template <> inline BitBlock simd<64>::umult(BitBlock arg1, BitBlock arg2);
139template <> inline BitBlock simd<1>::ult(BitBlock arg1, BitBlock arg2);
140template <> inline BitBlock simd<2>::ult(BitBlock arg1, BitBlock arg2);
141template <> inline BitBlock simd<4>::ult(BitBlock arg1, BitBlock arg2);
142template <> inline BitBlock simd<8>::ult(BitBlock arg1, BitBlock arg2);
143template <> inline BitBlock simd<16>::ult(BitBlock arg1, BitBlock arg2);
144template <> inline BitBlock simd<32>::ult(BitBlock arg1, BitBlock arg2);
145template <> inline BitBlock simd<64>::ult(BitBlock arg1, BitBlock arg2);
146template <> inline BitBlock simd<128>::ult(BitBlock arg1, BitBlock arg2);
147template <> inline BitBlock simd<1>::lt(BitBlock arg1, BitBlock arg2);
148template <> inline BitBlock simd<2>::lt(BitBlock arg1, BitBlock arg2);
149template <> inline BitBlock simd<4>::lt(BitBlock arg1, BitBlock arg2);
150template <> inline BitBlock simd<8>::lt(BitBlock arg1, BitBlock arg2);
151template <> inline BitBlock simd<16>::lt(BitBlock arg1, BitBlock arg2);
152template <> inline BitBlock simd<32>::lt(BitBlock arg1, BitBlock arg2);
153template <> inline BitBlock simd<64>::lt(BitBlock arg1, BitBlock arg2);
154template <> inline BitBlock simd<128>::lt(BitBlock arg1, BitBlock arg2);
155template <> template <int sh> inline BitBlock simd<2>::srli(BitBlock arg1);
156template <> template <int sh> inline BitBlock simd<4>::srli(BitBlock arg1);
157template <> template <int sh> inline BitBlock simd<8>::srli(BitBlock arg1);
158template <> template <int sh> inline BitBlock simd<16>::srli(BitBlock arg1);
159template <> template <int sh> inline BitBlock simd<32>::srli(BitBlock arg1);
160template <> template <int sh> inline BitBlock simd<64>::srli(BitBlock arg1);
161template <> template <int sh> inline BitBlock simd<128>::srli(BitBlock arg1);
162template <> inline BitBlock simd<1>::ctz(BitBlock arg1);
163template <> inline BitBlock simd<2>::ctz(BitBlock arg1);
164template <> inline BitBlock simd<4>::ctz(BitBlock arg1);
165template <> inline BitBlock simd<8>::ctz(BitBlock arg1);
166template <> inline BitBlock simd<16>::ctz(BitBlock arg1);
167template <> inline BitBlock simd<32>::ctz(BitBlock arg1);
168template <> inline BitBlock simd<64>::ctz(BitBlock arg1);
169template <> inline BitBlock simd<128>::ctz(BitBlock arg1);
170template <> inline BitBlock simd<64>::sll(BitBlock arg1, BitBlock shift_mask);
171template <> inline BitBlock simd<128>::sll(BitBlock arg1, BitBlock shift_mask);
172template <> inline BitBlock simd<1>::ugt(BitBlock arg1, BitBlock arg2);
173template <> inline BitBlock simd<2>::ugt(BitBlock arg1, BitBlock arg2);
174template <> inline BitBlock simd<4>::ugt(BitBlock arg1, BitBlock arg2);
175template <> inline BitBlock simd<8>::ugt(BitBlock arg1, BitBlock arg2);
176template <> inline BitBlock simd<16>::ugt(BitBlock arg1, BitBlock arg2);
177template <> inline BitBlock simd<32>::ugt(BitBlock arg1, BitBlock arg2);
178template <> inline BitBlock simd<64>::ugt(BitBlock arg1, BitBlock arg2);
179template <> inline BitBlock simd<128>::ugt(BitBlock arg1, BitBlock arg2);
180template <> inline BitBlock simd<2>::xor_hl(BitBlock arg1);
181template <> inline BitBlock simd<4>::xor_hl(BitBlock arg1);
182template <> inline BitBlock simd<8>::xor_hl(BitBlock arg1);
183template <> inline BitBlock simd<16>::xor_hl(BitBlock arg1);
184template <> inline BitBlock simd<32>::xor_hl(BitBlock arg1);
185template <> inline BitBlock simd<64>::xor_hl(BitBlock arg1);
186template <> inline BitBlock simd<128>::xor_hl(BitBlock arg1);
187template <> inline BitBlock simd<1>::popcount(BitBlock arg1);
188template <> inline BitBlock simd<2>::popcount(BitBlock arg1);
189template <> inline BitBlock simd<4>::popcount(BitBlock arg1);
190template <> inline BitBlock simd<8>::popcount(BitBlock arg1);
191template <> inline BitBlock simd<16>::popcount(BitBlock arg1);
192template <> inline BitBlock simd<32>::popcount(BitBlock arg1);
193template <> inline BitBlock simd<64>::popcount(BitBlock arg1);
194template <> inline BitBlock simd<128>::popcount(BitBlock arg1);
195template <> inline BitBlock simd<1>::neg(BitBlock arg1);
196template <> inline BitBlock simd<2>::neg(BitBlock arg1);
197template <> inline BitBlock simd<4>::neg(BitBlock arg1);
198template <> inline BitBlock simd<8>::neg(BitBlock arg1);
199template <> inline BitBlock simd<16>::neg(BitBlock arg1);
200template <> inline BitBlock simd<32>::neg(BitBlock arg1);
201template <> inline BitBlock simd<64>::neg(BitBlock arg1);
202template <> inline BitBlock simd<128>::neg(BitBlock arg1);
203template <> template <int sh> inline BitBlock simd<2>::slli(BitBlock arg1);
204template <> template <int sh> inline BitBlock simd<4>::slli(BitBlock arg1);
205template <> template <int sh> inline BitBlock simd<8>::slli(BitBlock arg1);
206template <> template <int sh> inline BitBlock simd<16>::slli(BitBlock arg1);
207template <> template <int sh> inline BitBlock simd<32>::slli(BitBlock arg1);
208template <> template <int sh> inline BitBlock simd<64>::slli(BitBlock arg1);
209template <> template <int sh> inline BitBlock simd<128>::slli(BitBlock arg1);
210template <> inline BitBlock simd<1>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3);
211template <> inline BitBlock simd<2>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3);
212template <> inline BitBlock simd<4>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3);
213template <> inline BitBlock simd<8>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3);
214template <> inline BitBlock simd<16>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3);
215template <> inline BitBlock simd<32>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3);
216template <> inline BitBlock simd<64>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3);
217template <> inline BitBlock simd<128>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3);
218template <> inline BitBlock simd<1>::sub(BitBlock arg1, BitBlock arg2);
219template <> inline BitBlock simd<2>::sub(BitBlock arg1, BitBlock arg2);
220template <> inline BitBlock simd<4>::sub(BitBlock arg1, BitBlock arg2);
221template <> inline BitBlock simd<8>::sub(BitBlock arg1, BitBlock arg2);
222template <> inline BitBlock simd<16>::sub(BitBlock arg1, BitBlock arg2);
223template <> inline BitBlock simd<32>::sub(BitBlock arg1, BitBlock arg2);
224template <> inline BitBlock simd<64>::sub(BitBlock arg1, BitBlock arg2);
225template <> inline BitBlock simd<128>::sub(BitBlock arg1, BitBlock arg2);
226template <> inline BitBlock simd<2>::add_hl(BitBlock arg1);
227template <> inline BitBlock simd<4>::add_hl(BitBlock arg1);
228template <> inline BitBlock simd<8>::add_hl(BitBlock arg1);
229template <> inline BitBlock simd<16>::add_hl(BitBlock arg1);
230template <> inline BitBlock simd<32>::add_hl(BitBlock arg1);
231template <> inline BitBlock simd<64>::add_hl(BitBlock arg1);
232template <> inline BitBlock simd<128>::add_hl(BitBlock arg1);
233template <> inline BitBlock simd<64>::srl(BitBlock arg1, BitBlock shift_mask);
234template <> inline BitBlock simd<128>::srl(BitBlock arg1, BitBlock shift_mask);
235template <> inline BitBlock simd<2>::lomask();
236template <> inline BitBlock simd<4>::lomask();
237template <> inline BitBlock simd<8>::lomask();
238template <> inline BitBlock simd<16>::lomask();
239template <> inline BitBlock simd<32>::lomask();
240template <> inline BitBlock simd<64>::lomask();
241template <> inline BitBlock simd<128>::lomask();
242template <> template <int val> inline BitBlock simd<1>::constant();
243template <> template <int val> inline BitBlock simd<2>::constant();
244template <> template <int val> inline BitBlock simd<4>::constant();
245template <> template <int val> inline BitBlock simd<8>::constant();
246template <> template <int val> inline BitBlock simd<16>::constant();
247template <> template <int val> inline BitBlock simd<32>::constant();
248template <> template <int val> inline BitBlock simd<64>::constant();
249template <> template <int val> inline BitBlock simd<128>::constant();
250template <> inline BitBlock simd<1>::min(BitBlock arg1, BitBlock arg2);
251template <> inline BitBlock simd<2>::min(BitBlock arg1, BitBlock arg2);
252template <> inline BitBlock simd<4>::min(BitBlock arg1, BitBlock arg2);
253template <> inline BitBlock simd<8>::min(BitBlock arg1, BitBlock arg2);
254template <> inline BitBlock simd<16>::min(BitBlock arg1, BitBlock arg2);
255template <> inline BitBlock simd<32>::min(BitBlock arg1, BitBlock arg2);
256template <> inline BitBlock simd<64>::min(BitBlock arg1, BitBlock arg2);
257template <> inline BitBlock simd<128>::min(BitBlock arg1, BitBlock arg2);
258template <> inline BitBlock simd<1>::umin(BitBlock arg1, BitBlock arg2);
259template <> inline BitBlock simd<2>::umin(BitBlock arg1, BitBlock arg2);
260template <> inline BitBlock simd<4>::umin(BitBlock arg1, BitBlock arg2);
261template <> inline BitBlock simd<8>::umin(BitBlock arg1, BitBlock arg2);
262template <> inline BitBlock simd<16>::umin(BitBlock arg1, BitBlock arg2);
263template <> inline BitBlock simd<32>::umin(BitBlock arg1, BitBlock arg2);
264template <> inline BitBlock simd<64>::umin(BitBlock arg1, BitBlock arg2);
265template <> inline BitBlock simd<128>::umin(BitBlock arg1, BitBlock arg2);
266template <> inline BitBlock simd<1>::umax(BitBlock arg1, BitBlock arg2);
267template <> inline BitBlock simd<2>::umax(BitBlock arg1, BitBlock arg2);
268template <> inline BitBlock simd<4>::umax(BitBlock arg1, BitBlock arg2);
269template <> inline BitBlock simd<8>::umax(BitBlock arg1, BitBlock arg2);
270template <> inline BitBlock simd<16>::umax(BitBlock arg1, BitBlock arg2);
271template <> inline BitBlock simd<32>::umax(BitBlock arg1, BitBlock arg2);
272template <> inline BitBlock simd<64>::umax(BitBlock arg1, BitBlock arg2);
273template <> inline BitBlock simd<128>::umax(BitBlock arg1, BitBlock arg2);
274template <> inline BitBlock simd<1>::eq(BitBlock arg1, BitBlock arg2);
275template <> inline BitBlock simd<2>::eq(BitBlock arg1, BitBlock arg2);
276template <> inline BitBlock simd<4>::eq(BitBlock arg1, BitBlock arg2);
277template <> inline BitBlock simd<8>::eq(BitBlock arg1, BitBlock arg2);
278template <> inline BitBlock simd<16>::eq(BitBlock arg1, BitBlock arg2);
279template <> inline BitBlock simd<32>::eq(BitBlock arg1, BitBlock arg2);
280template <> inline BitBlock simd<64>::eq(BitBlock arg1, BitBlock arg2);
281template <> inline BitBlock simd<128>::eq(BitBlock arg1, BitBlock arg2);
282template <> template <int sh> inline BitBlock simd<2>::srai(BitBlock arg1);
283template <> template <int sh> inline BitBlock simd<4>::srai(BitBlock arg1);
284template <> template <int sh> inline BitBlock simd<8>::srai(BitBlock arg1);
285template <> template <int sh> inline BitBlock simd<16>::srai(BitBlock arg1);
286template <> template <int sh> inline BitBlock simd<32>::srai(BitBlock arg1);
287template <> template <int sh> inline BitBlock simd<64>::srai(BitBlock arg1);
288template <> template <int sh> inline BitBlock simd<128>::srai(BitBlock arg1);
289template <> inline BitBlock simd<2>::himask();
290template <> inline BitBlock simd<4>::himask();
291template <> inline BitBlock simd<8>::himask();
292template <> inline BitBlock simd<16>::himask();
293template <> inline BitBlock simd<32>::himask();
294template <> inline BitBlock simd<64>::himask();
295template <> inline BitBlock simd<128>::himask();
296template <> inline BitBlock simd<1>::add(BitBlock arg1, BitBlock arg2);
297template <> inline BitBlock simd<2>::add(BitBlock arg1, BitBlock arg2);
298template <> inline BitBlock simd<4>::add(BitBlock arg1, BitBlock arg2);
299template <> inline BitBlock simd<8>::add(BitBlock arg1, BitBlock arg2);
300template <> inline BitBlock simd<16>::add(BitBlock arg1, BitBlock arg2);
301template <> inline BitBlock simd<32>::add(BitBlock arg1, BitBlock arg2);
302template <> inline BitBlock simd<64>::add(BitBlock arg1, BitBlock arg2);
303template <> inline BitBlock simd<128>::add(BitBlock arg1, BitBlock arg2);
304template <> inline BitBlock simd<1>::abs(BitBlock arg1);
305template <> inline BitBlock simd<2>::abs(BitBlock arg1);
306template <> inline BitBlock simd<4>::abs(BitBlock arg1);
307template <> inline BitBlock simd<8>::abs(BitBlock arg1);
308template <> inline BitBlock simd<16>::abs(BitBlock arg1);
309template <> inline BitBlock simd<32>::abs(BitBlock arg1);
310template <> inline BitBlock simd<64>::abs(BitBlock arg1);
311template <> inline BitBlock simd<128>::abs(BitBlock arg1);
312template <> inline BitBlock hsimd<2>::umin_hl(BitBlock arg1, BitBlock arg2);
313template <> inline BitBlock hsimd<4>::umin_hl(BitBlock arg1, BitBlock arg2);
314template <> inline BitBlock hsimd<8>::umin_hl(BitBlock arg1, BitBlock arg2);
315template <> inline BitBlock hsimd<16>::umin_hl(BitBlock arg1, BitBlock arg2);
316template <> inline BitBlock hsimd<32>::umin_hl(BitBlock arg1, BitBlock arg2);
317template <> inline BitBlock hsimd<64>::umin_hl(BitBlock arg1, BitBlock arg2);
318template <> inline BitBlock hsimd<128>::umin_hl(BitBlock arg1, BitBlock arg2);
319template <> inline BitBlock hsimd<2>::add_hl(BitBlock arg1, BitBlock arg2);
320template <> inline BitBlock hsimd<4>::add_hl(BitBlock arg1, BitBlock arg2);
321template <> inline BitBlock hsimd<8>::add_hl(BitBlock arg1, BitBlock arg2);
322template <> inline BitBlock hsimd<16>::add_hl(BitBlock arg1, BitBlock arg2);
323template <> inline BitBlock hsimd<32>::add_hl(BitBlock arg1, BitBlock arg2);
324template <> inline BitBlock hsimd<64>::add_hl(BitBlock arg1, BitBlock arg2);
325template <> inline BitBlock hsimd<128>::add_hl(BitBlock arg1, BitBlock arg2);
326template <> inline BitBlock hsimd<2>::packss(BitBlock arg1, BitBlock arg2);
327template <> inline BitBlock hsimd<4>::packss(BitBlock arg1, BitBlock arg2);
328template <> inline BitBlock hsimd<8>::packss(BitBlock arg1, BitBlock arg2);
329template <> inline BitBlock hsimd<16>::packss(BitBlock arg1, BitBlock arg2);
330template <> inline BitBlock hsimd<32>::packss(BitBlock arg1, BitBlock arg2);
331template <> inline BitBlock hsimd<64>::packss(BitBlock arg1, BitBlock arg2);
332template <> inline BitBlock hsimd<128>::packss(BitBlock arg1, BitBlock arg2);
333template <> inline int hsimd<4>::signmask(BitBlock arg1);
334template <> inline int hsimd<8>::signmask(BitBlock arg1);
335template <> inline int hsimd<16>::signmask(BitBlock arg1);
336template <> inline int hsimd<32>::signmask(BitBlock arg1);
337template <> inline int hsimd<64>::signmask(BitBlock arg1);
338template <> inline int hsimd<128>::signmask(BitBlock arg1);
339template <> inline BitBlock hsimd<2>::packl(BitBlock arg1, BitBlock arg2);
340template <> inline BitBlock hsimd<4>::packl(BitBlock arg1, BitBlock arg2);
341template <> inline BitBlock hsimd<8>::packl(BitBlock arg1, BitBlock arg2);
342template <> inline BitBlock hsimd<16>::packl(BitBlock arg1, BitBlock arg2);
343template <> inline BitBlock hsimd<32>::packl(BitBlock arg1, BitBlock arg2);
344template <> inline BitBlock hsimd<64>::packl(BitBlock arg1, BitBlock arg2);
345template <> inline BitBlock hsimd<128>::packl(BitBlock arg1, BitBlock arg2);
346template <> inline BitBlock hsimd<2>::packh(BitBlock arg1, BitBlock arg2);
347template <> inline BitBlock hsimd<4>::packh(BitBlock arg1, BitBlock arg2);
348template <> inline BitBlock hsimd<8>::packh(BitBlock arg1, BitBlock arg2);
349template <> inline BitBlock hsimd<16>::packh(BitBlock arg1, BitBlock arg2);
350template <> inline BitBlock hsimd<32>::packh(BitBlock arg1, BitBlock arg2);
351template <> inline BitBlock hsimd<64>::packh(BitBlock arg1, BitBlock arg2);
352template <> inline BitBlock hsimd<128>::packh(BitBlock arg1, BitBlock arg2);
353template <> inline BitBlock hsimd<2>::min_hl(BitBlock arg1, BitBlock arg2);
354template <> inline BitBlock hsimd<4>::min_hl(BitBlock arg1, BitBlock arg2);
355template <> inline BitBlock hsimd<8>::min_hl(BitBlock arg1, BitBlock arg2);
356template <> inline BitBlock hsimd<16>::min_hl(BitBlock arg1, BitBlock arg2);
357template <> inline BitBlock hsimd<32>::min_hl(BitBlock arg1, BitBlock arg2);
358template <> inline BitBlock hsimd<64>::min_hl(BitBlock arg1, BitBlock arg2);
359template <> inline BitBlock hsimd<128>::min_hl(BitBlock arg1, BitBlock arg2);
360template <> inline BitBlock hsimd<2>::packus(BitBlock arg1, BitBlock arg2);
361template <> inline BitBlock hsimd<4>::packus(BitBlock arg1, BitBlock arg2);
362template <> inline BitBlock hsimd<8>::packus(BitBlock arg1, BitBlock arg2);
363template <> inline BitBlock hsimd<16>::packus(BitBlock arg1, BitBlock arg2);
364template <> inline BitBlock hsimd<32>::packus(BitBlock arg1, BitBlock arg2);
365template <> inline BitBlock hsimd<64>::packus(BitBlock arg1, BitBlock arg2);
366template <> inline BitBlock hsimd<128>::packus(BitBlock arg1, BitBlock arg2);
367template <> inline BitBlock esimd<1>::mergel(BitBlock arg1, BitBlock arg2);
368template <> inline BitBlock esimd<2>::mergel(BitBlock arg1, BitBlock arg2);
369template <> inline BitBlock esimd<4>::mergel(BitBlock arg1, BitBlock arg2);
370template <> inline BitBlock esimd<8>::mergel(BitBlock arg1, BitBlock arg2);
371template <> inline BitBlock esimd<16>::mergel(BitBlock arg1, BitBlock arg2);
372template <> inline BitBlock esimd<32>::mergel(BitBlock arg1, BitBlock arg2);
373template <> inline BitBlock esimd<64>::mergel(BitBlock arg1, BitBlock arg2);
374template <> inline BitBlock esimd<1>::mergeh(BitBlock arg1, BitBlock arg2);
375template <> inline BitBlock esimd<2>::mergeh(BitBlock arg1, BitBlock arg2);
376template <> inline BitBlock esimd<4>::mergeh(BitBlock arg1, BitBlock arg2);
377template <> inline BitBlock esimd<8>::mergeh(BitBlock arg1, BitBlock arg2);
378template <> inline BitBlock esimd<16>::mergeh(BitBlock arg1, BitBlock arg2);
379template <> inline BitBlock esimd<32>::mergeh(BitBlock arg1, BitBlock arg2);
380template <> inline BitBlock esimd<64>::mergeh(BitBlock arg1, BitBlock arg2);
381template <> inline BitBlock esimd<1>::zeroextendh(BitBlock arg1);
382template <> inline BitBlock esimd<2>::zeroextendh(BitBlock arg1);
383template <> inline BitBlock esimd<4>::zeroextendh(BitBlock arg1);
384template <> inline BitBlock esimd<8>::zeroextendh(BitBlock arg1);
385template <> inline BitBlock esimd<16>::zeroextendh(BitBlock arg1);
386template <> inline BitBlock esimd<32>::zeroextendh(BitBlock arg1);
387template <> inline BitBlock esimd<64>::zeroextendh(BitBlock arg1);
388template <> inline BitBlock esimd<1>::zeroextendl(BitBlock arg1);
389template <> inline BitBlock esimd<2>::zeroextendl(BitBlock arg1);
390template <> inline BitBlock esimd<4>::zeroextendl(BitBlock arg1);
391template <> inline BitBlock esimd<8>::zeroextendl(BitBlock arg1);
392template <> inline BitBlock esimd<16>::zeroextendl(BitBlock arg1);
393template <> inline BitBlock esimd<32>::zeroextendl(BitBlock arg1);
394template <> inline BitBlock esimd<64>::zeroextendl(BitBlock arg1);
395template <> inline BitBlock esimd<1>::signextendh(BitBlock arg1);
396template <> inline BitBlock esimd<2>::signextendh(BitBlock arg1);
397template <> inline BitBlock esimd<4>::signextendh(BitBlock arg1);
398template <> inline BitBlock esimd<8>::signextendh(BitBlock arg1);
399template <> inline BitBlock esimd<16>::signextendh(BitBlock arg1);
400template <> inline BitBlock esimd<32>::signextendh(BitBlock arg1);
401template <> inline BitBlock esimd<64>::signextendh(BitBlock arg1);
402template <> inline BitBlock esimd<1>::signextendl(BitBlock arg1);
403template <> inline BitBlock esimd<2>::signextendl(BitBlock arg1);
404template <> inline BitBlock esimd<4>::signextendl(BitBlock arg1);
405template <> inline BitBlock esimd<8>::signextendl(BitBlock arg1);
406template <> inline BitBlock esimd<16>::signextendl(BitBlock arg1);
407template <> inline BitBlock esimd<32>::signextendl(BitBlock arg1);
408template <> inline BitBlock esimd<64>::signextendl(BitBlock arg1);
409template <> template <int msk> inline BitBlock mvmd<16>::shufflei(BitBlock arg1);
410template <> template <int msk> inline BitBlock mvmd<32>::shufflei(BitBlock arg1);
411template <> template <int msk> inline BitBlock mvmd<64>::shufflei(BitBlock arg1);
412template <> template <int sh> inline BitBlock mvmd<2>::dsrli(BitBlock arg1, BitBlock arg2);
413template <> template <int sh> inline BitBlock mvmd<4>::dsrli(BitBlock arg1, BitBlock arg2);
414template <> template <int sh> inline BitBlock mvmd<8>::dsrli(BitBlock arg1, BitBlock arg2);
415template <> template <int sh> inline BitBlock mvmd<16>::dsrli(BitBlock arg1, BitBlock arg2);
416template <> template <int sh> inline BitBlock mvmd<32>::dsrli(BitBlock arg1, BitBlock arg2);
417template <> template <int sh> inline BitBlock mvmd<64>::dsrli(BitBlock arg1, BitBlock arg2);
418template <> template <int sh> inline BitBlock mvmd<128>::dsrli(BitBlock arg1, BitBlock arg2);
419template <> inline BitBlock mvmd<1>::fill(int val1);
420template <> inline BitBlock mvmd<2>::fill(int val1);
421template <> inline BitBlock mvmd<4>::fill(int val1);
422template <> inline BitBlock mvmd<8>::fill(int val1);
423template <> inline BitBlock mvmd<16>::fill(int val1);
424template <> inline BitBlock mvmd<32>::fill(int val1);
425template <> inline BitBlock mvmd<64>::fill(int val1);
426template <> inline BitBlock mvmd<128>::fill(int val1);
427template <> template <int pos> inline BitBlock mvmd<1>::splat(BitBlock arg1);
428template <> template <int pos> inline BitBlock mvmd<2>::splat(BitBlock arg1);
429template <> template <int pos> inline BitBlock mvmd<4>::splat(BitBlock arg1);
430template <> template <int pos> inline BitBlock mvmd<8>::splat(BitBlock arg1);
431template <> template <int pos> inline BitBlock mvmd<16>::splat(BitBlock arg1);
432template <> template <int pos> inline BitBlock mvmd<32>::splat(BitBlock arg1);
433template <> template <int pos> inline BitBlock mvmd<64>::splat(BitBlock arg1);
434template <> template <int pos> inline BitBlock mvmd<128>::splat(BitBlock arg1);
435template <> inline BitBlock mvmd<1>::fill16(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8, int val9, int val10, int val11, int val12, int val13, int val14, int val15, int val16);
436template <> inline BitBlock mvmd<2>::fill16(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8, int val9, int val10, int val11, int val12, int val13, int val14, int val15, int val16);
437template <> inline BitBlock mvmd<4>::fill16(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8, int val9, int val10, int val11, int val12, int val13, int val14, int val15, int val16);
438template <> inline BitBlock mvmd<8>::fill16(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8, int val9, int val10, int val11, int val12, int val13, int val14, int val15, int val16);
439template <> template <int sh> inline BitBlock mvmd<2>::slli(BitBlock arg1);
440template <> template <int sh> inline BitBlock mvmd<4>::slli(BitBlock arg1);
441template <> template <int sh> inline BitBlock mvmd<8>::slli(BitBlock arg1);
442template <> template <int sh> inline BitBlock mvmd<16>::slli(BitBlock arg1);
443template <> template <int sh> inline BitBlock mvmd<32>::slli(BitBlock arg1);
444template <> template <int sh> inline BitBlock mvmd<64>::slli(BitBlock arg1);
445template <> template <int sh> inline BitBlock mvmd<128>::slli(BitBlock arg1);
446template <> inline BitBlock mvmd<1>::fill4(int val1, int val2, int val3, int val4);
447template <> inline BitBlock mvmd<2>::fill4(int val1, int val2, int val3, int val4);
448template <> inline BitBlock mvmd<4>::fill4(int val1, int val2, int val3, int val4);
449template <> inline BitBlock mvmd<8>::fill4(int val1, int val2, int val3, int val4);
450template <> inline BitBlock mvmd<16>::fill4(int val1, int val2, int val3, int val4);
451template <> inline BitBlock mvmd<32>::fill4(int val1, int val2, int val3, int val4);
452template <> template <int sh> inline BitBlock mvmd<2>::srli(BitBlock arg1);
453template <> template <int sh> inline BitBlock mvmd<4>::srli(BitBlock arg1);
454template <> template <int sh> inline BitBlock mvmd<8>::srli(BitBlock arg1);
455template <> template <int sh> inline BitBlock mvmd<16>::srli(BitBlock arg1);
456template <> template <int sh> inline BitBlock mvmd<32>::srli(BitBlock arg1);
457template <> template <int sh> inline BitBlock mvmd<64>::srli(BitBlock arg1);
458template <> template <int sh> inline BitBlock mvmd<128>::srli(BitBlock arg1);
459template <> inline BitBlock mvmd<1>::fill2(int val1, int val2);
460template <> inline BitBlock mvmd<2>::fill2(int val1, int val2);
461template <> inline BitBlock mvmd<4>::fill2(int val1, int val2);
462template <> inline BitBlock mvmd<8>::fill2(int val1, int val2);
463template <> inline BitBlock mvmd<16>::fill2(int val1, int val2);
464template <> inline BitBlock mvmd<32>::fill2(int val1, int val2);
465template <> inline BitBlock mvmd<64>::fill2(int val1, int val2);
466template <> template <int sh> inline BitBlock mvmd<2>::dslli(BitBlock arg1, BitBlock arg2);
467template <> template <int sh> inline BitBlock mvmd<4>::dslli(BitBlock arg1, BitBlock arg2);
468template <> template <int sh> inline BitBlock mvmd<8>::dslli(BitBlock arg1, BitBlock arg2);
469template <> template <int sh> inline BitBlock mvmd<16>::dslli(BitBlock arg1, BitBlock arg2);
470template <> template <int sh> inline BitBlock mvmd<32>::dslli(BitBlock arg1, BitBlock arg2);
471template <> template <int sh> inline BitBlock mvmd<64>::dslli(BitBlock arg1, BitBlock arg2);
472template <> template <int sh> inline BitBlock mvmd<128>::dslli(BitBlock arg1, BitBlock arg2);
473template <> inline BitBlock mvmd<1>::fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8);
474template <> inline BitBlock mvmd<2>::fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8);
475template <> inline BitBlock mvmd<4>::fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8);
476template <> inline BitBlock mvmd<8>::fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8);
477template <> inline BitBlock mvmd<16>::fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8);
478
479//Implementation Part
480
481#define shufflemask4(s1, s2, s3, s4) ((s1<<6) | (s2<<4) | (s3<<2) | s4)
482
483#define shufflemask4_from_shufflemask2(msk) (msk==3 ? 238 : (msk==2 ? 228 : (msk==1 ? 78 : 68)))
484
485#define shufflemask8_to_shufflemask4(msk) ((msk&3) | (((msk>>3)&3)<<2) | (((msk>>6)&3)<<4) | (((msk>>9)&3)<<6) | (((msk>>12)&3)<<8) | (((msk>>15)&3)<<10) | (((msk>>18)&3)<<12) | (((msk>>21)&3)<<14))
486//The total number of operations is 2
487inline BitBlock simd_nor(BitBlock arg1, BitBlock arg2)
488{
489        return simd_not(simd_or(arg1, arg2));
490}
491
492//The total number of operations is 1
493inline BitBlock simd_not(BitBlock arg1)
494{
495        return simd_xor(arg1, simd<32>::constant<-1>());
496}
497
498//The total number of operations is 1
499inline BitBlock simd_andc(BitBlock arg1, BitBlock arg2)
500{
501        return _mm_andnot_si128(arg2, arg1);
502}
503
504//The total number of operations is 1
505inline BitBlock simd_or(BitBlock arg1, BitBlock arg2)
506{
507        return _mm_or_si128(arg1, arg2);
508}
509
510//The total number of operations is 1
511inline BitBlock simd_and(BitBlock arg1, BitBlock arg2)
512{
513        return _mm_and_si128(arg1, arg2);
514}
515
516//The total number of operations is 1
517inline BitBlock simd_xor(BitBlock arg1, BitBlock arg2)
518{
519        return _mm_xor_si128(arg1, arg2);
520}
521
522//The total number of operations is 49
523template <> inline BitBlock simd<1>::max(BitBlock arg1, BitBlock arg2)
524{
525        return simd<1>::ifh(simd<(2)>::himask(), simd<(2)>::max(simd_and(simd<(2)>::himask(), arg1), simd_and(simd<(2)>::himask(), arg2)), simd<(2)>::srli<1>(simd<(2)>::max(simd<(2)>::slli<1>(arg1), simd<(2)>::slli<1>(arg2))));
526}
527
528//The total number of operations is 19
529template <> inline BitBlock simd<2>::max(BitBlock arg1, BitBlock arg2)
530{
531        return simd<1>::ifh(simd<2>::himask(), simd_and(arg1, arg2), simd_or(simd_and(arg2, simd<128>::srli<1>(simd_or(arg1, simd_not(arg2)))), simd_and(arg1, simd<128>::srli<1>(simd_or(simd_not(arg1), arg2)))));
532}
533
534//The total number of operations is 16
535template <> inline BitBlock simd<4>::max(BitBlock arg1, BitBlock arg2)
536{
537        return simd<1>::ifh(simd<4>::gt(arg1, arg2), arg1, arg2);
538}
539
540//The total number of operations is 4
541template <> inline BitBlock simd<8>::max(BitBlock arg1, BitBlock arg2)
542{
543        return simd<1>::ifh(simd<8>::gt(arg1, arg2), arg1, arg2);
544}
545
546//The total number of operations is 1
547template <> inline BitBlock simd<16>::max(BitBlock arg1, BitBlock arg2)
548{
549        return _mm_max_epi16(arg1, arg2);
550}
551
552//The total number of operations is 4
553template <> inline BitBlock simd<32>::max(BitBlock arg1, BitBlock arg2)
554{
555        return simd<1>::ifh(simd<32>::gt(arg1, arg2), arg1, arg2);
556}
557
558//The total number of operations is 27
559template <> inline BitBlock simd<64>::max(BitBlock arg1, BitBlock arg2)
560{
561        return simd<1>::ifh(simd<64>::gt(arg1, arg2), arg1, arg2);
562}
563
564//The total number of operations is 87
565template <> inline BitBlock simd<128>::max(BitBlock arg1, BitBlock arg2)
566{
567        return simd<1>::ifh(simd<128>::gt(arg1, arg2), arg1, arg2);
568}
569
570//The total number of operations is 57
571template <> inline BitBlock simd<1>::mult(BitBlock arg1, BitBlock arg2)
572{
573        BitBlock loMask = simd<(2)>::lomask();
574        BitBlock tmpAns1 = simd<(2)>::mult(simd_and(loMask, arg1), simd_and(loMask, arg2));
575        BitBlock tmpAns2 = simd<(2)>::mult(simd<(2)>::srli<1>(arg1), simd<(2)>::srli<1>(arg2));
576        return simd<1>::ifh(loMask, tmpAns1, simd<(2)>::slli<1>(tmpAns2));
577}
578
579//The total number of operations is 23
580template <> inline BitBlock simd<2>::mult(BitBlock arg1, BitBlock arg2)
581{
582        BitBlock tmp1 = simd<128>::slli<1>(arg1);
583        BitBlock tmp2 = simd<128>::slli<1>(arg2);
584        return simd<1>::ifh(simd<2>::himask(), simd_or(simd_and(tmp1, simd_and(arg2, simd_or(simd_not(arg1), simd_not(tmp2)))), simd_and(arg1, simd_and(tmp2, simd_or(simd_not(tmp1), simd_not(arg2))))), simd_and(arg1, arg2));
585}
586
587//The total number of operations is 31
588template <> inline BitBlock simd<4>::mult(BitBlock arg1, BitBlock arg2)
589{
590        BitBlock loMask = simd<(8)>::lomask();
591        BitBlock tmpAns1 = simd<(8)>::mult(simd_and(loMask, arg1), simd_and(loMask, arg2));
592        BitBlock tmpAns2 = simd<(8)>::mult(simd<(8)>::srli<4>(arg1), simd<(8)>::srli<4>(arg2));
593        return simd<1>::ifh(loMask, tmpAns1, simd<(8)>::slli<4>(tmpAns2));
594}
595
596//The total number of operations is 10
597template <> inline BitBlock simd<8>::mult(BitBlock arg1, BitBlock arg2)
598{
599        BitBlock loMask = simd<(16)>::lomask();
600        BitBlock tmpAns1 = simd<(16)>::mult(simd_and(loMask, arg1), simd_and(loMask, arg2));
601        BitBlock tmpAns2 = simd<(16)>::mult(simd<(16)>::srli<8>(arg1), simd<(16)>::srli<8>(arg2));
602        return simd<1>::ifh(loMask, tmpAns1, simd<(16)>::slli<8>(tmpAns2));
603}
604
605//The total number of operations is 1
606template <> inline BitBlock simd<16>::mult(BitBlock arg1, BitBlock arg2)
607{
608        return _mm_mullo_epi16(arg1, arg2);
609}
610
611//The total number of operations is 30
612template <> inline BitBlock simd<32>::mult(BitBlock arg1, BitBlock arg2)
613{
614        BitBlock loMask = simd<(64)>::lomask();
615        BitBlock tmpAns1 = simd<(64)>::mult(simd_and(loMask, arg1), simd_and(loMask, arg2));
616        BitBlock tmpAns2 = simd<(64)>::mult(simd<(64)>::srli<32>(arg1), simd<(64)>::srli<32>(arg2));
617        return simd<1>::ifh(loMask, tmpAns1, simd<(64)>::slli<32>(tmpAns2));
618}
619
620//The total number of operations is 11
621template <> inline BitBlock simd<64>::mult(BitBlock arg1, BitBlock arg2)
622{
623        BitBlock loMask = simd<64>::lomask();
624        BitBlock arg1_low = simd_and(arg1, loMask);
625        BitBlock arg1_high = simd<64>::srli<(32)>(arg1);
626        BitBlock arg2_low = simd_and(arg2, loMask);
627        BitBlock arg2_high = simd<64>::srli<(32)>(arg2);
628        BitBlock tmpAns1 = simd<(32)>::umult(arg1_low, arg2_low);
629        BitBlock tmpAns2 = simd<64>::slli<(32)>(simd<(32)>::umult(arg1_low, arg2_high));
630        BitBlock tmpAns3 = simd<64>::slli<(32)>(simd<(32)>::umult(arg1_high, arg2_low));
631        return simd<64>::add(tmpAns1, simd<64>::add(tmpAns2, tmpAns3));
632}
633
634//The total number of operations is 249
635template <> inline BitBlock simd<128>::mult(BitBlock arg1, BitBlock arg2)
636{
637        BitBlock loMask = simd<128>::lomask();
638        BitBlock arg1_low = simd_and(arg1, loMask);
639        BitBlock arg1_high = simd<128>::srli<(64)>(arg1);
640        BitBlock arg2_low = simd_and(arg2, loMask);
641        BitBlock arg2_high = simd<128>::srli<(64)>(arg2);
642        BitBlock tmpAns1 = simd<(64)>::umult(arg1_low, arg2_low);
643        BitBlock tmpAns2 = simd<128>::slli<(64)>(simd<(64)>::umult(arg1_low, arg2_high));
644        BitBlock tmpAns3 = simd<128>::slli<(64)>(simd<(64)>::umult(arg1_high, arg2_low));
645        return simd<128>::add(tmpAns1, simd<128>::add(tmpAns2, tmpAns3));
646}
647
648//The total number of operations is 47
649template <> inline BitBlock simd<1>::gt(BitBlock arg1, BitBlock arg2)
650{
651        return simd<1>::ifh(simd<(2)>::himask(), simd<(2)>::gt(simd_and(simd<(2)>::himask(), arg1), simd_and(simd<(2)>::himask(), arg2)), simd<(2)>::srli<1>(simd<(2)>::gt(simd<(2)>::slli<1>(arg1), simd<(2)>::slli<1>(arg2))));
652}
653
654//The total number of operations is 18
655template <> inline BitBlock simd<2>::gt(BitBlock arg1, BitBlock arg2)
656{
657        BitBlock tmp = simd_not(arg1);
658        BitBlock tmpAns = simd_or(simd_and(tmp, arg2), simd_and(simd<128>::slli<1>(simd_and(arg1, simd_not(arg2))), simd_or(tmp, arg2)));
659        return simd<1>::ifh(simd<2>::himask(), tmpAns, simd<128>::srli<1>(tmpAns));
660}
661
662//The total number of operations is 13
663template <> inline BitBlock simd<4>::gt(BitBlock arg1, BitBlock arg2)
664{
665        return simd<1>::ifh(simd<(8)>::himask(), simd<(8)>::gt(simd_and(simd<(8)>::himask(), arg1), simd_and(simd<(8)>::himask(), arg2)), simd<(8)>::srli<4>(simd<(8)>::gt(simd<(8)>::slli<4>(arg1), simd<(8)>::slli<4>(arg2))));
666}
667
668//The total number of operations is 1
669template <> inline BitBlock simd<8>::gt(BitBlock arg1, BitBlock arg2)
670{
671        return _mm_cmpgt_epi8(arg1, arg2);
672}
673
674//The total number of operations is 1
675template <> inline BitBlock simd<16>::gt(BitBlock arg1, BitBlock arg2)
676{
677        return _mm_cmpgt_epi16(arg1, arg2);
678}
679
680//The total number of operations is 1
681template <> inline BitBlock simd<32>::gt(BitBlock arg1, BitBlock arg2)
682{
683        return _mm_cmpgt_epi32(arg1, arg2);
684}
685
686//The total number of operations is 24
687template <> inline BitBlock simd<64>::gt(BitBlock arg1, BitBlock arg2)
688{
689        BitBlock hiAns = simd<(32)>::gt(arg1, arg2);
690        BitBlock loAns = simd<(32)>::ugt(arg1, arg2);
691        BitBlock mask = simd_and(loAns, simd<64>::srli<(32)>(simd<(32)>::eq(arg1, arg2)));
692        mask = simd_or(mask, simd<64>::slli<(32)>(mask));
693        return simd_or(simd<64>::srai<(32)>(hiAns), mask);
694}
695
696//The total number of operations is 84
697template <> inline BitBlock simd<128>::gt(BitBlock arg1, BitBlock arg2)
698{
699        BitBlock hiAns = simd<(64)>::gt(arg1, arg2);
700        BitBlock loAns = simd<(64)>::ugt(arg1, arg2);
701        BitBlock mask = simd_and(loAns, simd<128>::srli<(64)>(simd<(64)>::eq(arg1, arg2)));
702        mask = simd_or(mask, simd<128>::slli<(64)>(mask));
703        return simd_or(simd<128>::srai<(64)>(hiAns), mask);
704}
705
706//The total number of operations is 289
707template <> inline BitBlock simd<1>::umult(BitBlock arg1, BitBlock arg2)
708{
709        BitBlock loMask = simd<(2)>::lomask();
710        BitBlock tmpAns1 = simd<(2)>::umult(simd_and(loMask, arg1), simd_and(loMask, arg2));
711        BitBlock tmpAns2 = simd<(2)>::umult(simd_and(loMask, simd<(4)>::srli<(2)>(arg1)), simd_and(loMask, simd<(4)>::srli<(2)>(arg2)));
712        return simd_or(tmpAns1, simd<(4)>::slli<(2)>(tmpAns2));
713}
714
715//The total number of operations is 139
716template <> inline BitBlock simd<2>::umult(BitBlock arg1, BitBlock arg2)
717{
718        BitBlock loMask = simd<(4)>::lomask();
719        BitBlock tmpAns1 = simd<(4)>::umult(simd_and(loMask, arg1), simd_and(loMask, arg2));
720        BitBlock tmpAns2 = simd<(4)>::umult(simd_and(loMask, simd<(8)>::srli<(4)>(arg1)), simd_and(loMask, simd<(8)>::srli<(4)>(arg2)));
721        return simd_or(tmpAns1, simd<(8)>::slli<(4)>(tmpAns2));
722}
723
724//The total number of operations is 64
725template <> inline BitBlock simd<4>::umult(BitBlock arg1, BitBlock arg2)
726{
727        BitBlock loMask = simd<(8)>::lomask();
728        BitBlock tmpAns1 = simd<(8)>::umult(simd_and(loMask, arg1), simd_and(loMask, arg2));
729        BitBlock tmpAns2 = simd<(8)>::umult(simd_and(loMask, simd<(16)>::srli<(8)>(arg1)), simd_and(loMask, simd<(16)>::srli<(8)>(arg2)));
730        return simd_or(tmpAns1, simd<(16)>::slli<(8)>(tmpAns2));
731}
732
733//The total number of operations is 28
734template <> inline BitBlock simd<8>::umult(BitBlock arg1, BitBlock arg2)
735{
736        BitBlock loMask = simd<(16)>::lomask();
737        BitBlock tmpAns1 = simd<(16)>::umult(simd_and(loMask, arg1), simd_and(loMask, arg2));
738        BitBlock tmpAns2 = simd<(16)>::umult(simd_and(loMask, simd<(32)>::srli<(16)>(arg1)), simd_and(loMask, simd<(32)>::srli<(16)>(arg2)));
739        return simd_or(tmpAns1, simd<(32)>::slli<(16)>(tmpAns2));
740}
741
742//The total number of operations is 10
743template <> inline BitBlock simd<16>::umult(BitBlock arg1, BitBlock arg2)
744{
745        BitBlock loMask = simd<(32)>::lomask();
746        BitBlock tmpAns1 = simd<(32)>::umult(simd_and(loMask, arg1), simd_and(loMask, arg2));
747        BitBlock tmpAns2 = simd<(32)>::umult(simd_and(loMask, simd<(64)>::srli<(32)>(arg1)), simd_and(loMask, simd<(64)>::srli<(32)>(arg2)));
748        return simd_or(tmpAns1, simd<(64)>::slli<(32)>(tmpAns2));
749}
750
751//The total number of operations is 1
752template <> inline BitBlock simd<32>::umult(BitBlock arg1, BitBlock arg2)
753{
754        return _mm_mul_epu32(arg1, arg2);
755}
756
757//The total number of operations is 67
758template <> inline BitBlock simd<64>::umult(BitBlock arg1, BitBlock arg2)
759{
760        BitBlock loMask1 = simd<(128)>::lomask();
761        BitBlock arg11 = simd_and(arg1, loMask1);
762        BitBlock arg22 = simd_and(arg2, loMask1);
763        BitBlock loMask2 = simd<64>::lomask();
764        BitBlock arg1_low = simd_and(arg11, loMask2);
765        BitBlock arg1_high = simd<64>::srli<(32)>(arg11);
766        BitBlock arg2_low = simd_and(arg22, loMask2);
767        BitBlock arg2_high = simd<64>::srli<(32)>(arg22);
768        BitBlock tmpAns1 = simd<(32)>::umult(arg1_low, arg2_low);
769        BitBlock tmpAns2 = simd<(128)>::slli<(32)>(simd<(32)>::umult(arg1_low, arg2_high));
770        BitBlock tmpAns3 = simd<(128)>::slli<(32)>(simd<(32)>::umult(arg1_high, arg2_low));
771        BitBlock tmpAns4 = simd<(128)>::slli<64>(simd<(32)>::umult(arg1_high, arg2_high));
772        return simd<(128)>::add(tmpAns1, simd<(128)>::add(tmpAns2, simd<(128)>::add(tmpAns3, tmpAns4)));
773}
774
775//The total number of operations is 41
776template <> inline BitBlock simd<1>::ult(BitBlock arg1, BitBlock arg2)
777{
778        return simd_or(simd_and(simd<(2)>::himask(), simd<(2)>::ult(simd_and(simd<(2)>::himask(), arg1), simd_and(simd<(2)>::himask(), arg2))), simd_and(simd<(2)>::lomask(), simd<(2)>::ult(simd_and(simd<(2)>::lomask(), arg1), simd_and(simd<(2)>::lomask(), arg2))));
779}
780
781//The total number of operations is 17
782template <> inline BitBlock simd<2>::ult(BitBlock arg1, BitBlock arg2)
783{
784        BitBlock tmp = simd_not(arg1);
785        BitBlock tmpAns = simd_or(simd_and(tmp, arg2), simd_and(simd<128>::slli<1>(simd_and(tmp, arg2)), simd_or(tmp, arg2)));
786        return simd<1>::ifh(simd<2>::himask(), tmpAns, simd<128>::srli<1>(tmpAns));
787}
788
789//The total number of operations is 33
790template <> inline BitBlock simd<4>::ult(BitBlock arg1, BitBlock arg2)
791{
792        return simd_and(simd<4>::srai<(3)>(simd_or(simd_and(simd_not(arg1), arg2), simd_and(simd_not(simd_xor(arg1, arg2)), simd<4>::sub(arg1, arg2)))), simd_not(simd<4>::eq(arg1, arg2)));
793}
794
795//The total number of operations is 15
796template <> inline BitBlock simd<8>::ult(BitBlock arg1, BitBlock arg2)
797{
798        return simd_and(simd<8>::srai<(7)>(simd_or(simd_and(simd_not(arg1), arg2), simd_and(simd_not(simd_xor(arg1, arg2)), simd<8>::sub(arg1, arg2)))), simd_not(simd<8>::eq(arg1, arg2)));
799}
800
801//The total number of operations is 11
802template <> inline BitBlock simd<16>::ult(BitBlock arg1, BitBlock arg2)
803{
804        return simd_and(simd<16>::srai<(15)>(simd_or(simd_and(simd_not(arg1), arg2), simd_and(simd_not(simd_xor(arg1, arg2)), simd<16>::sub(arg1, arg2)))), simd_not(simd<16>::eq(arg1, arg2)));
805}
806
807//The total number of operations is 11
808template <> inline BitBlock simd<32>::ult(BitBlock arg1, BitBlock arg2)
809{
810        return simd_and(simd<32>::srai<(31)>(simd_or(simd_and(simd_not(arg1), arg2), simd_and(simd_not(simd_xor(arg1, arg2)), simd<32>::sub(arg1, arg2)))), simd_not(simd<32>::eq(arg1, arg2)));
811}
812
813//The total number of operations is 19
814template <> inline BitBlock simd<64>::ult(BitBlock arg1, BitBlock arg2)
815{
816        return simd_and(simd<64>::srai<(63)>(simd_or(simd_and(simd_not(arg1), arg2), simd_and(simd_not(simd_xor(arg1, arg2)), simd<64>::sub(arg1, arg2)))), simd_not(simd<64>::eq(arg1, arg2)));
817}
818
819//The total number of operations is 59
820template <> inline BitBlock simd<128>::ult(BitBlock arg1, BitBlock arg2)
821{
822        BitBlock tmpAns = simd<(64)>::ult(arg1, arg2);
823        BitBlock mask = simd_and(tmpAns, simd<128>::srli<(64)>(simd<(64)>::eq(arg1, arg2)));
824        mask = simd_or(mask, simd<128>::slli<(64)>(mask));
825        return simd_or(simd<128>::srai<(64)>(tmpAns), mask);
826}
827
828//The total number of operations is 47
829template <> inline BitBlock simd<1>::lt(BitBlock arg1, BitBlock arg2)
830{
831        return simd<1>::ifh(simd<(2)>::himask(), simd<(2)>::lt(simd_and(simd<(2)>::himask(), arg1), simd_and(simd<(2)>::himask(), arg2)), simd<(2)>::srli<1>(simd<(2)>::lt(simd<(2)>::slli<1>(arg1), simd<(2)>::slli<1>(arg2))));
832}
833
834//The total number of operations is 18
835template <> inline BitBlock simd<2>::lt(BitBlock arg1, BitBlock arg2)
836{
837        BitBlock tmp = simd_not(arg2);
838        BitBlock tmpAns = simd_or(simd_and(arg1, tmp), simd_and(simd<128>::slli<1>(simd_and(simd_not(arg1), arg2)), simd_or(arg1, tmp)));
839        return simd<1>::ifh(simd<2>::himask(), tmpAns, simd<128>::srli<1>(tmpAns));
840}
841
842//The total number of operations is 21
843template <> inline BitBlock simd<4>::lt(BitBlock arg1, BitBlock arg2)
844{
845        return simd<1>::ifh(simd<(8)>::himask(), simd<(8)>::lt(simd_and(simd<(8)>::himask(), arg1), simd_and(simd<(8)>::himask(), arg2)), simd<(8)>::srli<4>(simd<(8)>::lt(simd<(8)>::slli<4>(arg1), simd<(8)>::slli<4>(arg2))));
846}
847
848//The total number of operations is 5
849template <> inline BitBlock simd<8>::lt(BitBlock arg1, BitBlock arg2)
850{
851        return simd_and(simd_not(simd<8>::gt(arg1, arg2)), simd_not(simd<8>::eq(arg1, arg2)));
852}
853
854//The total number of operations is 5
855template <> inline BitBlock simd<16>::lt(BitBlock arg1, BitBlock arg2)
856{
857        return simd_and(simd_not(simd<16>::gt(arg1, arg2)), simd_not(simd<16>::eq(arg1, arg2)));
858}
859
860//The total number of operations is 5
861template <> inline BitBlock simd<32>::lt(BitBlock arg1, BitBlock arg2)
862{
863        return simd_and(simd_not(simd<32>::gt(arg1, arg2)), simd_not(simd<32>::eq(arg1, arg2)));
864}
865
866//The total number of operations is 27
867template <> inline BitBlock simd<64>::lt(BitBlock arg1, BitBlock arg2)
868{
869        BitBlock hiAns = simd<(32)>::lt(arg1, arg2);
870        BitBlock loAns = simd<(32)>::ult(arg1, arg2);
871        BitBlock mask = simd_and(loAns, simd<64>::srli<(32)>(simd<(32)>::eq(arg1, arg2)));
872        mask = simd_or(mask, simd<64>::slli<(32)>(mask));
873        return simd_or(simd<64>::srai<(32)>(hiAns), mask);
874}
875
876//The total number of operations is 86
877template <> inline BitBlock simd<128>::lt(BitBlock arg1, BitBlock arg2)
878{
879        BitBlock hiAns = simd<(64)>::lt(arg1, arg2);
880        BitBlock loAns = simd<(64)>::ult(arg1, arg2);
881        BitBlock mask = simd_and(loAns, simd<128>::srli<(64)>(simd<(64)>::eq(arg1, arg2)));
882        mask = simd_or(mask, simd<128>::slli<(64)>(mask));
883        return simd_or(simd<128>::srai<(64)>(hiAns), mask);
884}
885
886//The total number of operations is 2
887template <> template <int sh> inline BitBlock simd<2>::srli(BitBlock arg1)
888{
889        return simd_and(simd<32>::srli<sh>(arg1), simd<2>::constant<((3)>>sh)>());
890}
891
892//The total number of operations is 2
893template <> template <int sh> inline BitBlock simd<4>::srli(BitBlock arg1)
894{
895        return simd_and(simd<32>::srli<sh>(arg1), simd<4>::constant<((15)>>sh)>());
896}
897
898//The total number of operations is 2
899template <> template <int sh> inline BitBlock simd<8>::srli(BitBlock arg1)
900{
901        return simd_and(simd<32>::srli<sh>(arg1), simd<8>::constant<((255)>>sh)>());
902}
903
904//The total number of operations is 1
905template <> template <int sh> inline BitBlock simd<16>::srli(BitBlock arg1)
906{
907        return _mm_srli_epi16(arg1, sh);
908}
909
910//The total number of operations is 1
911template <> template <int sh> inline BitBlock simd<32>::srli(BitBlock arg1)
912{
913        return _mm_srli_epi32(arg1, sh);
914}
915
916//The total number of operations is 1
917template <> template <int sh> inline BitBlock simd<64>::srli(BitBlock arg1)
918{
919        return _mm_srli_epi64(arg1, sh);
920}
921
922//The total number of operations is 4
923template <> template <int sh> inline BitBlock simd<128>::srli(BitBlock arg1)
924{
925        return (((sh%8) == 0) ? _mm_srli_si128(arg1, (sh/8)) : ((sh >= 64) ? simd<64>::srli<(sh-64)>(_mm_srli_si128(arg1, 8)) : simd_or(simd<64>::srli<sh>(arg1), _mm_srli_si128(simd<64>::slli<(64-sh)>(arg1), 8))));
926}
927
928//The total number of operations is 1
929template <> inline BitBlock simd<1>::ctz(BitBlock arg1)
930{
931        return simd_not(arg1);
932}
933
934//The total number of operations is 14
935template <> inline BitBlock simd<2>::ctz(BitBlock arg1)
936{
937        BitBlock tmp = simd_not(arg1);
938        return simd<1>::ifh(simd<2>::himask(), simd_and(tmp, simd<128>::slli<1>(tmp)), simd_and(simd<128>::srli<1>(arg1), tmp));
939}
940
941//The total number of operations is 14
942template <> inline BitBlock simd<4>::ctz(BitBlock arg1)
943{
944        return simd<4>::popcount(simd_andc(simd<4>::sub(arg1, simd<4>::constant<1>()), arg1));
945}
946
947//The total number of operations is 13
948template <> inline BitBlock simd<8>::ctz(BitBlock arg1)
949{
950        return simd<8>::popcount(simd_andc(simd<8>::sub(arg1, simd<8>::constant<1>()), arg1));
951}
952
953//The total number of operations is 16
954template <> inline BitBlock simd<16>::ctz(BitBlock arg1)
955{
956        return simd<16>::popcount(simd_andc(simd<16>::sub(arg1, simd<16>::constant<1>()), arg1));
957}
958
959//The total number of operations is 19
960template <> inline BitBlock simd<32>::ctz(BitBlock arg1)
961{
962        return simd<32>::popcount(simd_andc(simd<32>::sub(arg1, simd<32>::constant<1>()), arg1));
963}
964
965//The total number of operations is 14
966template <> inline BitBlock simd<64>::ctz(BitBlock arg1)
967{
968        return simd<64>::popcount(simd_andc(simd<64>::sub(arg1, simd<64>::constant<1>()), arg1));
969}
970
971//The total number of operations is 34
972template <> inline BitBlock simd<128>::ctz(BitBlock arg1)
973{
974        return simd<128>::popcount(simd_andc(simd<128>::sub(arg1, simd<128>::constant<1>()), arg1));
975}
976
977//The total number of operations is 7
978template <> inline BitBlock simd<64>::sll(BitBlock arg1, BitBlock shift_mask)
979{
980        return simd<1>::ifh(simd<128>::himask(), _mm_sll_epi64(arg1, _mm_srli_si128(shift_mask, 8)), _mm_sll_epi64(arg1, simd_andc(shift_mask, simd<128>::himask())));
981}
982
983//The total number of operations is 11
984template <> inline BitBlock simd<128>::sll(BitBlock arg1, BitBlock shift_mask)
985{
986        return simd_or(_mm_sll_epi64(arg1, shift_mask), simd_or(_mm_slli_si128(_mm_sll_epi64(arg1, simd<32>::sub(shift_mask, _mm_cvtsi32_si128(64))), 8), _mm_slli_si128(_mm_srl_epi64(arg1, simd<32>::sub(_mm_cvtsi32_si128(64), shift_mask)), 8)));
987}
988
989//The total number of operations is 41
990template <> inline BitBlock simd<1>::ugt(BitBlock arg1, BitBlock arg2)
991{
992        return simd_or(simd_and(simd<(2)>::himask(), simd<(2)>::ugt(simd_and(simd<(2)>::himask(), arg1), simd_and(simd<(2)>::himask(), arg2))), simd_and(simd<(2)>::lomask(), simd<(2)>::ugt(simd_and(simd<(2)>::lomask(), arg1), simd_and(simd<(2)>::lomask(), arg2))));
993}
994
995//The total number of operations is 17
996template <> inline BitBlock simd<2>::ugt(BitBlock arg1, BitBlock arg2)
997{
998        BitBlock tmp = simd_not(arg2);
999        BitBlock tmpAns = simd_or(simd_and(arg1, tmp), simd_and(simd<128>::slli<1>(simd_and(arg1, tmp)), simd_or(arg1, tmp)));
1000        return simd<1>::ifh(simd<2>::himask(), tmpAns, simd<128>::srli<1>(tmpAns));
1001}
1002
1003//The total number of operations is 34
1004template <> inline BitBlock simd<4>::ugt(BitBlock arg1, BitBlock arg2)
1005{
1006        return simd_and(simd<4>::srai<(3)>(simd_or(simd_and(arg1, simd_not(arg2)), simd_and(simd_not(simd_xor(arg1, arg2)), simd_not(simd<4>::sub(arg1, arg2))))), simd_not(simd<4>::eq(arg1, arg2)));
1007}
1008
1009//The total number of operations is 16
1010template <> inline BitBlock simd<8>::ugt(BitBlock arg1, BitBlock arg2)
1011{
1012        return simd_and(simd<8>::srai<(7)>(simd_or(simd_and(arg1, simd_not(arg2)), simd_and(simd_not(simd_xor(arg1, arg2)), simd_not(simd<8>::sub(arg1, arg2))))), simd_not(simd<8>::eq(arg1, arg2)));
1013}
1014
1015//The total number of operations is 12
1016template <> inline BitBlock simd<16>::ugt(BitBlock arg1, BitBlock arg2)
1017{
1018        return simd_and(simd<16>::srai<(15)>(simd_or(simd_and(arg1, simd_not(arg2)), simd_and(simd_not(simd_xor(arg1, arg2)), simd_not(simd<16>::sub(arg1, arg2))))), simd_not(simd<16>::eq(arg1, arg2)));
1019}
1020
1021//The total number of operations is 12
1022template <> inline BitBlock simd<32>::ugt(BitBlock arg1, BitBlock arg2)
1023{
1024        return simd_and(simd<32>::srai<(31)>(simd_or(simd_and(arg1, simd_not(arg2)), simd_and(simd_not(simd_xor(arg1, arg2)), simd_not(simd<32>::sub(arg1, arg2))))), simd_not(simd<32>::eq(arg1, arg2)));
1025}
1026
1027//The total number of operations is 20
1028template <> inline BitBlock simd<64>::ugt(BitBlock arg1, BitBlock arg2)
1029{
1030        return simd_and(simd<64>::srai<(63)>(simd_or(simd_and(arg1, simd_not(arg2)), simd_and(simd_not(simd_xor(arg1, arg2)), simd_not(simd<64>::sub(arg1, arg2))))), simd_not(simd<64>::eq(arg1, arg2)));
1031}
1032
1033//The total number of operations is 60
1034template <> inline BitBlock simd<128>::ugt(BitBlock arg1, BitBlock arg2)
1035{
1036        BitBlock tmpAns = simd<(64)>::ugt(arg1, arg2);
1037        BitBlock mask = simd_and(tmpAns, simd<128>::srli<(64)>(simd<(64)>::eq(arg1, arg2)));
1038        mask = simd_or(mask, simd<128>::slli<(64)>(mask));
1039        return simd_or(simd<128>::srai<(64)>(tmpAns), mask);
1040}
1041
1042//The total number of operations is 4
1043template <> inline BitBlock simd<2>::xor_hl(BitBlock arg1)
1044{
1045        return simd_xor(simd<2>::srli<(1)>(arg1), simd_and(arg1, simd<2>::lomask()));
1046}
1047
1048//The total number of operations is 4
1049template <> inline BitBlock simd<4>::xor_hl(BitBlock arg1)
1050{
1051        return simd_xor(simd<4>::srli<(2)>(arg1), simd_and(arg1, simd<4>::lomask()));
1052}
1053
1054//The total number of operations is 4
1055template <> inline BitBlock simd<8>::xor_hl(BitBlock arg1)
1056{
1057        return simd_xor(simd<8>::srli<(4)>(arg1), simd_and(arg1, simd<8>::lomask()));
1058}
1059
1060//The total number of operations is 3
1061template <> inline BitBlock simd<16>::xor_hl(BitBlock arg1)
1062{
1063        return simd_xor(simd<16>::srli<(8)>(arg1), simd_and(arg1, simd<16>::lomask()));
1064}
1065
1066//The total number of operations is 3
1067template <> inline BitBlock simd<32>::xor_hl(BitBlock arg1)
1068{
1069        return simd_xor(simd<32>::srli<(16)>(arg1), simd_and(arg1, simd<32>::lomask()));
1070}
1071
1072//The total number of operations is 3
1073template <> inline BitBlock simd<64>::xor_hl(BitBlock arg1)
1074{
1075        return simd_xor(simd<64>::srli<(32)>(arg1), simd_and(arg1, simd<64>::lomask()));
1076}
1077
1078//The total number of operations is 6
1079template <> inline BitBlock simd<128>::xor_hl(BitBlock arg1)
1080{
1081        return simd_xor(simd<128>::srli<(64)>(arg1), simd_and(arg1, simd<128>::lomask()));
1082}
1083
1084//The total number of operations is 0
1085template <> inline BitBlock simd<1>::popcount(BitBlock arg1)
1086{
1087        return arg1;
1088}
1089
1090//The total number of operations is 3
1091template <> inline BitBlock simd<2>::popcount(BitBlock arg1)
1092{
1093        return simd<2>::add_hl(simd<(1)>::popcount(arg1));
1094}
1095
1096//The total number of operations is 7
1097template <> inline BitBlock simd<4>::popcount(BitBlock arg1)
1098{
1099        return simd<4>::add_hl(simd<(2)>::popcount(arg1));
1100}
1101
1102//The total number of operations is 11
1103template <> inline BitBlock simd<8>::popcount(BitBlock arg1)
1104{
1105        return simd<8>::add_hl(simd<(4)>::popcount(arg1));
1106}
1107
1108//The total number of operations is 14
1109template <> inline BitBlock simd<16>::popcount(BitBlock arg1)
1110{
1111        return simd<16>::add_hl(simd<(8)>::popcount(arg1));
1112}
1113
1114//The total number of operations is 17
1115template <> inline BitBlock simd<32>::popcount(BitBlock arg1)
1116{
1117        return simd<32>::add_hl(simd<(16)>::popcount(arg1));
1118}
1119
1120//The total number of operations is 12
1121template <> inline BitBlock simd<64>::popcount(BitBlock arg1)
1122{
1123        return _mm_sad_epu8(simd<8>::popcount(arg1), simd<8>::constant<0>());
1124}
1125
1126//The total number of operations is 18
1127template <> inline BitBlock simd<128>::popcount(BitBlock arg1)
1128{
1129        BitBlock tmpAns = simd<64>::popcount(arg1);
1130        return simd<64>::add(simd_and(tmpAns, simd<128>::lomask()), simd<128>::srli<(64)>(tmpAns));
1131}
1132
1133//The total number of operations is 26
1134template <> inline BitBlock simd<1>::neg(BitBlock arg1)
1135{
1136        return simd<1>::sub(simd<1>::constant<0>(), arg1);
1137}
1138
1139//The total number of operations is 8
1140template <> inline BitBlock simd<2>::neg(BitBlock arg1)
1141{
1142        return simd<1>::ifh(simd<2>::himask(), simd_xor(arg1, simd<128>::slli<1>(arg1)), arg1);
1143}
1144
1145//The total number of operations is 6
1146template <> inline BitBlock simd<4>::neg(BitBlock arg1)
1147{
1148        return simd<4>::sub(simd<4>::constant<0>(), arg1);
1149}
1150
1151//The total number of operations is 1
1152template <> inline BitBlock simd<8>::neg(BitBlock arg1)
1153{
1154        return simd<8>::sub(simd<8>::constant<0>(), arg1);
1155}
1156
1157//The total number of operations is 1
1158template <> inline BitBlock simd<16>::neg(BitBlock arg1)
1159{
1160        return simd<16>::sub(simd<16>::constant<0>(), arg1);
1161}
1162
1163//The total number of operations is 1
1164template <> inline BitBlock simd<32>::neg(BitBlock arg1)
1165{
1166        return simd<32>::sub(simd<32>::constant<0>(), arg1);
1167}
1168
1169//The total number of operations is 1
1170template <> inline BitBlock simd<64>::neg(BitBlock arg1)
1171{
1172        return simd<64>::sub(simd<64>::constant<0>(), arg1);
1173}
1174
1175//The total number of operations is 15
1176template <> inline BitBlock simd<128>::neg(BitBlock arg1)
1177{
1178        return simd<128>::sub(simd<128>::constant<0>(), arg1);
1179}
1180
1181//The total number of operations is 2
1182template <> template <int sh> inline BitBlock simd<2>::slli(BitBlock arg1)
1183{
1184        return simd_and(simd<32>::slli<sh>(arg1), simd<2>::constant<(((3)<<sh)&(3))>());
1185}
1186
1187//The total number of operations is 2
1188template <> template <int sh> inline BitBlock simd<4>::slli(BitBlock arg1)
1189{
1190        return simd_and(simd<32>::slli<sh>(arg1), simd<4>::constant<(((15)<<sh)&(15))>());
1191}
1192
1193//The total number of operations is 2
1194template <> template <int sh> inline BitBlock simd<8>::slli(BitBlock arg1)
1195{
1196        return simd_and(simd<32>::slli<sh>(arg1), simd<8>::constant<(((255)<<sh)&(255))>());
1197}
1198
1199//The total number of operations is 1
1200template <> template <int sh> inline BitBlock simd<16>::slli(BitBlock arg1)
1201{
1202        return _mm_slli_epi16(arg1, sh);
1203}
1204
1205//The total number of operations is 1
1206template <> template <int sh> inline BitBlock simd<32>::slli(BitBlock arg1)
1207{
1208        return _mm_slli_epi32(arg1, sh);
1209}
1210
1211//The total number of operations is 1
1212template <> template <int sh> inline BitBlock simd<64>::slli(BitBlock arg1)
1213{
1214        return _mm_slli_epi64(arg1, sh);
1215}
1216
1217//The total number of operations is 4
1218template <> template <int sh> inline BitBlock simd<128>::slli(BitBlock arg1)
1219{
1220        return (((sh%8) == 0) ? _mm_slli_si128(arg1, (sh/8)) : ((sh >= 64) ? simd<64>::slli<(sh-64)>(_mm_slli_si128(arg1, 8)) : simd_or(simd<64>::slli<sh>(arg1), _mm_slli_si128(simd<64>::srli<(64-sh)>(arg1), 8))));
1221}
1222
1223//The total number of operations is 3
1224template <> inline BitBlock simd<1>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3)
1225{
1226        return simd_or(simd_and(arg2, arg1), simd_andc(arg3, arg1));
1227}
1228
1229//The total number of operations is 8
1230template <> inline BitBlock simd<2>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3)
1231{
1232        return simd<(1)>::ifh(simd<1>::ifh(simd<2>::himask(), arg1, simd<2>::srli<(1)>(arg1)), arg2, arg3);
1233}
1234
1235//The total number of operations is 13
1236template <> inline BitBlock simd<4>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3)
1237{
1238        return simd<(2)>::ifh(simd<1>::ifh(simd<4>::himask(), arg1, simd<4>::srli<(2)>(arg1)), arg2, arg3);
1239}
1240
1241//The total number of operations is 4
1242template <> inline BitBlock simd<8>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3)
1243{
1244        return simd<1>::ifh(simd<8>::gt(simd<8>::constant<0>(), arg1), arg2, arg3);
1245}
1246
1247//The total number of operations is 4
1248template <> inline BitBlock simd<16>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3)
1249{
1250        return simd<1>::ifh(simd<16>::gt(simd<16>::constant<0>(), arg1), arg2, arg3);
1251}
1252
1253//The total number of operations is 4
1254template <> inline BitBlock simd<32>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3)
1255{
1256        return simd<1>::ifh(simd<32>::gt(simd<32>::constant<0>(), arg1), arg2, arg3);
1257}
1258
1259//The total number of operations is 8
1260template <> inline BitBlock simd<64>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3)
1261{
1262        return simd<(32)>::ifh(simd<1>::ifh(simd<64>::himask(), arg1, simd<64>::srli<(32)>(arg1)), arg2, arg3);
1263}
1264
1265//The total number of operations is 15
1266template <> inline BitBlock simd<128>::ifh(BitBlock arg1, BitBlock arg2, BitBlock arg3)
1267{
1268        return simd<(64)>::ifh(simd<1>::ifh(simd<128>::himask(), arg1, simd<128>::srli<(64)>(arg1)), arg2, arg3);
1269}
1270
1271//The total number of operations is 26
1272template <> inline BitBlock simd<1>::sub(BitBlock arg1, BitBlock arg2)
1273{
1274        return simd<1>::ifh(simd<(2)>::himask(), simd<(2)>::sub(arg1, simd_and(simd<(2)>::himask(), arg2)), simd<(2)>::sub(arg1, arg2));
1275}
1276
1277//The total number of operations is 11
1278template <> inline BitBlock simd<2>::sub(BitBlock arg1, BitBlock arg2)
1279{
1280        BitBlock tmp = simd_xor(arg1, arg2);
1281        return simd<1>::ifh(simd<2>::himask(), simd_xor(tmp, simd<128>::slli<1>(simd_and(simd_not(arg1), arg2))), tmp);
1282}
1283
1284//The total number of operations is 6
1285template <> inline BitBlock simd<4>::sub(BitBlock arg1, BitBlock arg2)
1286{
1287        return simd<1>::ifh(simd<(8)>::himask(), simd<(8)>::sub(arg1, simd_and(simd<(8)>::himask(), arg2)), simd<(8)>::sub(arg1, arg2));
1288}
1289
1290//The total number of operations is 1
1291template <> inline BitBlock simd<8>::sub(BitBlock arg1, BitBlock arg2)
1292{
1293        return _mm_sub_epi8(arg1, arg2);
1294}
1295
1296//The total number of operations is 1
1297template <> inline BitBlock simd<16>::sub(BitBlock arg1, BitBlock arg2)
1298{
1299        return _mm_sub_epi16(arg1, arg2);
1300}
1301
1302//The total number of operations is 1
1303template <> inline BitBlock simd<32>::sub(BitBlock arg1, BitBlock arg2)
1304{
1305        return _mm_sub_epi32(arg1, arg2);
1306}
1307
1308//The total number of operations is 1
1309template <> inline BitBlock simd<64>::sub(BitBlock arg1, BitBlock arg2)
1310{
1311        return _mm_sub_epi64(arg1, arg2);
1312}
1313
1314//The total number of operations is 15
1315template <> inline BitBlock simd<128>::sub(BitBlock arg1, BitBlock arg2)
1316{
1317        BitBlock ans = simd<(64)>::sub(arg1, arg2);
1318        BitBlock borrowMask = simd_or(simd_andc(arg2, arg1), simd_and(simd_not(simd_xor(arg1, arg2)), ans));
1319        BitBlock loMask = simd<128>::lomask();
1320        BitBlock borrow = simd<128>::slli<1>(simd_and(borrowMask, loMask));
1321        return simd<1>::ifh(loMask, ans, simd<(64)>::sub(ans, borrow));
1322}
1323
1324//The total number of operations is 3
1325template <> inline BitBlock simd<2>::add_hl(BitBlock arg1)
1326{
1327        return simd<16>::sub(arg1, simd_and(simd<2>::lomask(), simd<16>::srli<1>(arg1)));
1328}
1329
1330//The total number of operations is 4
1331template <> inline BitBlock simd<4>::add_hl(BitBlock arg1)
1332{
1333        return simd<(8)>::add(simd<4>::srli<(2)>(arg1), simd_and(arg1, simd<4>::lomask()));
1334}
1335
1336//The total number of operations is 4
1337template <> inline BitBlock simd<8>::add_hl(BitBlock arg1)
1338{
1339        return simd<(16)>::add(simd<8>::srli<(4)>(arg1), simd_and(arg1, simd<8>::lomask()));
1340}
1341
1342//The total number of operations is 3
1343template <> inline BitBlock simd<16>::add_hl(BitBlock arg1)
1344{
1345        return simd<(32)>::add(simd<16>::srli<(8)>(arg1), simd_and(arg1, simd<16>::lomask()));
1346}
1347
1348//The total number of operations is 3
1349template <> inline BitBlock simd<32>::add_hl(BitBlock arg1)
1350{
1351        return simd<(64)>::add(simd<32>::srli<(16)>(arg1), simd_and(arg1, simd<32>::lomask()));
1352}
1353
1354//The total number of operations is 3
1355template <> inline BitBlock simd<64>::add_hl(BitBlock arg1)
1356{
1357        return simd<64>::add(simd<64>::srli<(32)>(arg1), simd_and(arg1, simd<64>::lomask()));
1358}
1359
1360//The total number of operations is 20
1361template <> inline BitBlock simd<128>::add_hl(BitBlock arg1)
1362{
1363        return simd<128>::add(simd<128>::srli<(64)>(arg1), simd_and(arg1, simd<128>::lomask()));
1364}
1365
1366//The total number of operations is 7
1367template <> inline BitBlock simd<64>::srl(BitBlock arg1, BitBlock shift_mask)
1368{
1369        return simd<1>::ifh(simd<128>::himask(), _mm_srl_epi64(arg1, _mm_srli_si128(shift_mask, 8)), _mm_srl_epi64(arg1, simd_andc(shift_mask, simd<128>::himask())));
1370}
1371
1372//The total number of operations is 11
1373template <> inline BitBlock simd<128>::srl(BitBlock arg1, BitBlock shift_mask)
1374{
1375        return simd_or(_mm_srl_epi64(arg1, shift_mask), simd_or(_mm_srli_si128(_mm_srl_epi64(arg1, simd<32>::sub(shift_mask, _mm_cvtsi32_si128(64))), 8), _mm_srli_si128(_mm_sll_epi64(arg1, simd<32>::sub(_mm_cvtsi32_si128(64), shift_mask)), 8)));
1376}
1377
1378//The total number of operations is 0
1379template <> inline BitBlock simd<2>::lomask()
1380{
1381        return simd<2>::constant<(1)>();
1382}
1383
1384//The total number of operations is 0
1385template <> inline BitBlock simd<4>::lomask()
1386{
1387        return simd<4>::constant<(3)>();
1388}
1389
1390//The total number of operations is 0
1391template <> inline BitBlock simd<8>::lomask()
1392{
1393        return simd<8>::constant<(15)>();
1394}
1395
1396//The total number of operations is 0
1397template <> inline BitBlock simd<16>::lomask()
1398{
1399        return simd<16>::constant<(255)>();
1400}
1401
1402//The total number of operations is 0
1403template <> inline BitBlock simd<32>::lomask()
1404{
1405        return simd<32>::constant<(65535)>();
1406}
1407
1408//The total number of operations is 0
1409template <> inline BitBlock simd<64>::lomask()
1410{
1411        return _mm_set_epi32(0, -1, 0, -1);
1412}
1413
1414//The total number of operations is 0
1415template <> inline BitBlock simd<128>::lomask()
1416{
1417        return _mm_set_epi32(0, 0, -1, -1);
1418}
1419
1420//The total number of operations is 0
1421template <> template <int val> inline BitBlock simd<1>::constant()
1422{
1423        return simd<32>::constant<val>();
1424}
1425
1426//The total number of operations is 0
1427template <> template <int val> inline BitBlock simd<2>::constant()
1428{
1429        return ((val < 0) ? simd<(4)>::constant<((val<<2)|(val^(-4)))>() : simd<(4)>::constant<((val<<2)|val)>());
1430}
1431
1432//The total number of operations is 0
1433template <> template <int val> inline BitBlock simd<4>::constant()
1434{
1435        return ((val < 0) ? simd<(8)>::constant<((val<<4)|(val^(-16)))>() : simd<(8)>::constant<((val<<4)|val)>());
1436}
1437
1438//The total number of operations is 0
1439template <> template <int val> inline BitBlock simd<8>::constant()
1440{
1441        return _mm_set1_epi8(val);
1442}
1443
1444//The total number of operations is 0
1445template <> template <int val> inline BitBlock simd<16>::constant()
1446{
1447        return _mm_set1_epi16(val);
1448}
1449
1450//The total number of operations is 0
1451template <> template <int val> inline BitBlock simd<32>::constant()
1452{
1453        return _mm_set1_epi32(val);
1454}
1455
1456//The total number of operations is 0
1457template <> template <int val> inline BitBlock simd<64>::constant()
1458{
1459        return ((val >= 0) ? _mm_set_epi32(0, val, 0, val) : _mm_set_epi32(-1, val, -1, val));
1460}
1461
1462//The total number of operations is 0
1463template <> template <int val> inline BitBlock simd<128>::constant()
1464{
1465        return ((val >= 0) ? _mm_set_epi32(0, 0, 0, val) : _mm_set_epi32(-1, -1, -1, val));
1466}
1467
1468//The total number of operations is 50
1469template <> inline BitBlock simd<1>::min(BitBlock arg1, BitBlock arg2)
1470{
1471        return simd<1>::ifh(simd<1>::lt(arg1, arg2), arg1, arg2);
1472}
1473
1474//The total number of operations is 20
1475template <> inline BitBlock simd<2>::min(BitBlock arg1, BitBlock arg2)
1476{
1477        BitBlock tmp1 = simd<128>::srli<1>(arg1);
1478        BitBlock tmp2 = simd<128>::srli<1>(arg2);
1479        return simd<1>::ifh(simd<2>::himask(), simd_or(arg1, arg2), simd_or(simd_and(arg1, simd_and(tmp1, simd_not(tmp2))), simd_and(arg2, simd_or(simd_and(simd_not(tmp1), tmp2), arg1))));
1480}
1481
1482//The total number of operations is 16
1483template <> inline BitBlock simd<4>::min(BitBlock arg1, BitBlock arg2)
1484{
1485        return simd<1>::ifh(simd<4>::gt(arg1, arg2), arg2, arg1);
1486}
1487
1488//The total number of operations is 4
1489template <> inline BitBlock simd<8>::min(BitBlock arg1, BitBlock arg2)
1490{
1491        return simd<1>::ifh(simd<8>::gt(arg1, arg2), arg2, arg1);
1492}
1493
1494//The total number of operations is 1
1495template <> inline BitBlock simd<16>::min(BitBlock arg1, BitBlock arg2)
1496{
1497        return _mm_min_epi16(arg1, arg2);
1498}
1499
1500//The total number of operations is 4
1501template <> inline BitBlock simd<32>::min(BitBlock arg1, BitBlock arg2)
1502{
1503        return simd<1>::ifh(simd<32>::gt(arg1, arg2), arg2, arg1);
1504}
1505
1506//The total number of operations is 27
1507template <> inline BitBlock simd<64>::min(BitBlock arg1, BitBlock arg2)
1508{
1509        return simd<1>::ifh(simd<64>::gt(arg1, arg2), arg2, arg1);
1510}
1511
1512//The total number of operations is 87
1513template <> inline BitBlock simd<128>::min(BitBlock arg1, BitBlock arg2)
1514{
1515        return simd<1>::ifh(simd<128>::gt(arg1, arg2), arg2, arg1);
1516}
1517
1518//The total number of operations is 36
1519template <> inline BitBlock simd<1>::umin(BitBlock arg1, BitBlock arg2)
1520{
1521        return simd_or(simd_and(simd<(2)>::himask(), simd<(2)>::umin(arg1, arg2)), simd<(2)>::umin(simd_and(simd<(2)>::lomask(), arg1), simd_and(simd<(2)>::lomask(), arg2)));
1522}
1523
1524//The total number of operations is 16
1525template <> inline BitBlock simd<2>::umin(BitBlock arg1, BitBlock arg2)
1526{
1527        return simd_or(simd_and(simd<(4)>::himask(), simd<(4)>::umin(arg1, arg2)), simd<(4)>::umin(simd_and(simd<(4)>::lomask(), arg1), simd_and(simd<(4)>::lomask(), arg2)));
1528}
1529
1530//The total number of operations is 6
1531template <> inline BitBlock simd<4>::umin(BitBlock arg1, BitBlock arg2)
1532{
1533        return simd_or(simd_and(simd<(8)>::himask(), simd<(8)>::umin(arg1, arg2)), simd<(8)>::umin(simd_and(simd<(8)>::lomask(), arg1), simd_and(simd<(8)>::lomask(), arg2)));
1534}
1535
1536//The total number of operations is 1
1537template <> inline BitBlock simd<8>::umin(BitBlock arg1, BitBlock arg2)
1538{
1539        return _mm_min_epu8(arg1, arg2);
1540}
1541
1542//The total number of operations is 14
1543template <> inline BitBlock simd<16>::umin(BitBlock arg1, BitBlock arg2)
1544{
1545        BitBlock tmpAns = simd<(8)>::umin(arg1, arg2);
1546        BitBlock eqMask1 = simd<16>::srli<(8)>(simd<(8)>::eq(tmpAns, arg1));
1547        BitBlock eqMask2 = simd<16>::srli<(8)>(simd<(8)>::eq(tmpAns, arg2));
1548        return simd<1>::ifh(simd<16>::himask(), tmpAns, simd<1>::ifh(eqMask1, simd<1>::ifh(eqMask2, tmpAns, arg1), arg2));
1549}
1550
1551//The total number of operations is 27
1552template <> inline BitBlock simd<32>::umin(BitBlock arg1, BitBlock arg2)
1553{
1554        BitBlock tmpAns = simd<(16)>::umin(arg1, arg2);
1555        BitBlock eqMask1 = simd<32>::srli<(16)>(simd<(16)>::eq(tmpAns, arg1));
1556        BitBlock eqMask2 = simd<32>::srli<(16)>(simd<(16)>::eq(tmpAns, arg2));
1557        return simd<1>::ifh(simd<32>::himask(), tmpAns, simd<1>::ifh(eqMask1, simd<1>::ifh(eqMask2, tmpAns, arg1), arg2));
1558}
1559
1560//The total number of operations is 40
1561template <> inline BitBlock simd<64>::umin(BitBlock arg1, BitBlock arg2)
1562{
1563        BitBlock tmpAns = simd<(32)>::umin(arg1, arg2);
1564        BitBlock eqMask1 = simd<64>::srli<(32)>(simd<(32)>::eq(tmpAns, arg1));
1565        BitBlock eqMask2 = simd<64>::srli<(32)>(simd<(32)>::eq(tmpAns, arg2));
1566        return simd<1>::ifh(simd<64>::himask(), tmpAns, simd<1>::ifh(eqMask1, simd<1>::ifh(eqMask2, tmpAns, arg1), arg2));
1567}
1568
1569//The total number of operations is 67
1570template <> inline BitBlock simd<128>::umin(BitBlock arg1, BitBlock arg2)
1571{
1572        BitBlock tmpAns = simd<(64)>::umin(arg1, arg2);
1573        BitBlock eqMask1 = simd<128>::srli<(64)>(simd<(64)>::eq(tmpAns, arg1));
1574        BitBlock eqMask2 = simd<128>::srli<(64)>(simd<(64)>::eq(tmpAns, arg2));
1575        return simd<1>::ifh(simd<128>::himask(), tmpAns, simd<1>::ifh(eqMask1, simd<1>::ifh(eqMask2, tmpAns, arg1), arg2));
1576}
1577
1578//The total number of operations is 36
1579template <> inline BitBlock simd<1>::umax(BitBlock arg1, BitBlock arg2)
1580{
1581        return simd_or(simd_and(simd<(2)>::himask(), simd<(2)>::umax(arg1, arg2)), simd<(2)>::umax(simd_and(simd<(2)>::lomask(), arg1), simd_and(simd<(2)>::lomask(), arg2)));
1582}
1583
1584//The total number of operations is 16
1585template <> inline BitBlock simd<2>::umax(BitBlock arg1, BitBlock arg2)
1586{
1587        return simd_or(simd_and(simd<(4)>::himask(), simd<(4)>::umax(arg1, arg2)), simd<(4)>::umax(simd_and(simd<(4)>::lomask(), arg1), simd_and(simd<(4)>::lomask(), arg2)));
1588}
1589
1590//The total number of operations is 6
1591template <> inline BitBlock simd<4>::umax(BitBlock arg1, BitBlock arg2)
1592{
1593        return simd_or(simd_and(simd<(8)>::himask(), simd<(8)>::umax(arg1, arg2)), simd<(8)>::umax(simd_and(simd<(8)>::lomask(), arg1), simd_and(simd<(8)>::lomask(), arg2)));
1594}
1595
1596//The total number of operations is 1
1597template <> inline BitBlock simd<8>::umax(BitBlock arg1, BitBlock arg2)
1598{
1599        return _mm_max_epu8(arg1, arg2);
1600}
1601
1602//The total number of operations is 14
1603template <> inline BitBlock simd<16>::umax(BitBlock arg1, BitBlock arg2)
1604{
1605        BitBlock tmpAns = simd<(8)>::umax(arg1, arg2);
1606        BitBlock eqMask1 = simd<16>::srli<(8)>(simd<(8)>::eq(tmpAns, arg1));
1607        BitBlock eqMask2 = simd<16>::srli<(8)>(simd<(8)>::eq(tmpAns, arg2));
1608        return simd<1>::ifh(simd<16>::himask(), tmpAns, simd<1>::ifh(eqMask1, simd<1>::ifh(eqMask2, tmpAns, arg1), arg2));
1609}
1610
1611//The total number of operations is 27
1612template <> inline BitBlock simd<32>::umax(BitBlock arg1, BitBlock arg2)
1613{
1614        BitBlock tmpAns = simd<(16)>::umax(arg1, arg2);
1615        BitBlock eqMask1 = simd<32>::srli<(16)>(simd<(16)>::eq(tmpAns, arg1));
1616        BitBlock eqMask2 = simd<32>::srli<(16)>(simd<(16)>::eq(tmpAns, arg2));
1617        return simd<1>::ifh(simd<32>::himask(), tmpAns, simd<1>::ifh(eqMask1, simd<1>::ifh(eqMask2, tmpAns, arg1), arg2));
1618}
1619
1620//The total number of operations is 40
1621template <> inline BitBlock simd<64>::umax(BitBlock arg1, BitBlock arg2)
1622{
1623        BitBlock tmpAns = simd<(32)>::umax(arg1, arg2);
1624        BitBlock eqMask1 = simd<64>::srli<(32)>(simd<(32)>::eq(tmpAns, arg1));
1625        BitBlock eqMask2 = simd<64>::srli<(32)>(simd<(32)>::eq(tmpAns, arg2));
1626        return simd<1>::ifh(simd<64>::himask(), tmpAns, simd<1>::ifh(eqMask1, simd<1>::ifh(eqMask2, tmpAns, arg1), arg2));
1627}
1628
1629//The total number of operations is 67
1630template <> inline BitBlock simd<128>::umax(BitBlock arg1, BitBlock arg2)
1631{
1632        BitBlock tmpAns = simd<(64)>::umax(arg1, arg2);
1633        BitBlock eqMask1 = simd<128>::srli<(64)>(simd<(64)>::eq(tmpAns, arg1));
1634        BitBlock eqMask2 = simd<128>::srli<(64)>(simd<(64)>::eq(tmpAns, arg2));
1635        return simd<1>::ifh(simd<128>::himask(), tmpAns, simd<1>::ifh(eqMask1, simd<1>::ifh(eqMask2, tmpAns, arg1), arg2));
1636}
1637
1638//The total number of operations is 37
1639template <> inline BitBlock simd<1>::eq(BitBlock arg1, BitBlock arg2)
1640{
1641        return simd_or(simd_and(simd<(2)>::himask(), simd<(2)>::eq(simd_and(simd<(2)>::himask(), arg1), simd_and(simd<(2)>::himask(), arg2))), simd_and(simd<(2)>::lomask(), simd<(2)>::eq(simd_and(simd<(2)>::lomask(), arg1), simd_and(simd<(2)>::lomask(), arg2))));
1642}
1643
1644//The total number of operations is 15
1645template <> inline BitBlock simd<2>::eq(BitBlock arg1, BitBlock arg2)
1646{
1647        BitBlock tmp = simd_xor(arg1, arg2);
1648        BitBlock tmpAns = simd_and(simd_not(simd<128>::slli<1>(tmp)), simd_not(tmp));
1649        return simd<1>::ifh(simd<2>::himask(), tmpAns, simd<128>::srli<1>(tmpAns));
1650}
1651
1652//The total number of operations is 9
1653template <> inline BitBlock simd<4>::eq(BitBlock arg1, BitBlock arg2)
1654{
1655        return simd_or(simd_and(simd<(8)>::himask(), simd<(8)>::eq(simd_and(simd<(8)>::himask(), arg1), simd_and(simd<(8)>::himask(), arg2))), simd_and(simd<(8)>::lomask(), simd<(8)>::eq(simd_and(simd<(8)>::lomask(), arg1), simd_and(simd<(8)>::lomask(), arg2))));
1656}
1657
1658//The total number of operations is 1
1659template <> inline BitBlock simd<8>::eq(BitBlock arg1, BitBlock arg2)
1660{
1661        return _mm_cmpeq_epi8(arg1, arg2);
1662}
1663
1664//The total number of operations is 1
1665template <> inline BitBlock simd<16>::eq(BitBlock arg1, BitBlock arg2)
1666{
1667        return _mm_cmpeq_epi16(arg1, arg2);
1668}
1669
1670//The total number of operations is 1
1671template <> inline BitBlock simd<32>::eq(BitBlock arg1, BitBlock arg2)
1672{
1673        return _mm_cmpeq_epi32(arg1, arg2);
1674}
1675
1676//The total number of operations is 5
1677template <> inline BitBlock simd<64>::eq(BitBlock arg1, BitBlock arg2)
1678{
1679        BitBlock tmpAns = simd<(32)>::eq(arg1, arg2);
1680        BitBlock loMask = simd_and(tmpAns, simd<64>::srli<(32)>(tmpAns));
1681        BitBlock hiMask = simd<64>::slli<(32)>(loMask);
1682        return simd_or(loMask, hiMask);
1683}
1684
1685//The total number of operations is 15
1686template <> inline BitBlock simd<128>::eq(BitBlock arg1, BitBlock arg2)
1687{
1688        BitBlock tmpAns = simd<(64)>::eq(arg1, arg2);
1689        BitBlock loMask = simd_and(tmpAns, simd<128>::srli<(64)>(tmpAns));
1690        BitBlock hiMask = simd<128>::slli<(64)>(loMask);
1691        return simd_or(loMask, hiMask);
1692}
1693
1694//The total number of operations is 4
1695template <> template <int sh> inline BitBlock simd<2>::srai(BitBlock arg1)
1696{
1697        return ((sh == 0) ? arg1 : simd_or(simd_and(simd<2>::himask(), arg1), simd<2>::srli<1>(arg1)));
1698}
1699
1700//The total number of operations is 10
1701template <> template <int sh> inline BitBlock simd<4>::srai(BitBlock arg1)
1702{
1703        BitBlock tmp = simd<4>::srli<((sh >= 4) ? (3) : ((sh < 0) ? 0 : sh))>(arg1);
1704        return simd_or(tmp, simd<4>::sub(simd<4>::constant<0>(), simd_and(simd<4>::constant<(1<<((4-((sh >= 4) ? (3) : ((sh < 0) ? 0 : sh)))-1))>(), tmp)));
1705}
1706
1707//The total number of operations is 5
1708template <> template <int sh> inline BitBlock simd<8>::srai(BitBlock arg1)
1709{
1710        BitBlock tmp = simd<8>::srli<((sh >= 8) ? (7) : ((sh < 0) ? 0 : sh))>(arg1);
1711        return simd_or(tmp, simd<8>::sub(simd<8>::constant<0>(), simd_and(simd<8>::constant<(1<<((8-((sh >= 8) ? (7) : ((sh < 0) ? 0 : sh)))-1))>(), tmp)));
1712}
1713
1714//The total number of operations is 1
1715template <> template <int sh> inline BitBlock simd<16>::srai(BitBlock arg1)
1716{
1717        return _mm_srai_epi16(arg1, sh);
1718}
1719
1720//The total number of operations is 1
1721template <> template <int sh> inline BitBlock simd<32>::srai(BitBlock arg1)
1722{
1723        return _mm_srai_epi32(arg1, sh);
1724}
1725
1726//The total number of operations is 5
1727template <> template <int sh> inline BitBlock simd<64>::srai(BitBlock arg1)
1728{
1729        BitBlock tmp = simd<64>::srli<((sh >= 64) ? (63) : ((sh < 0) ? 0 : sh))>(arg1);
1730        return simd_or(tmp, simd<64>::sub(simd<64>::constant<0>(), simd_and(simd<64>::slli<((64-((sh >= 64) ? (63) : ((sh < 0) ? 0 : sh)))-1)>(simd<64>::constant<1>()), tmp)));
1731}
1732
1733//The total number of operations is 24
1734template <> template <int sh> inline BitBlock simd<128>::srai(BitBlock arg1)
1735{
1736        return simd_or(simd_and(simd<128>::himask(), simd<(64)>::srai<sh>(arg1)), simd<1>::ifh(simd<32>::gt(simd<32>::constant<sh>(), simd<32>::constant<(64)>()), simd<(64)>::srai<(sh-(64))>(simd<128>::srli<(64)>(arg1)), simd<128>::srli<sh>(arg1)));
1737}
1738
1739//The total number of operations is 0
1740template <> inline BitBlock simd<2>::himask()
1741{
1742        return simd<2>::constant<(2)>();
1743}
1744
1745//The total number of operations is 0
1746template <> inline BitBlock simd<4>::himask()
1747{
1748        return simd<4>::constant<(12)>();
1749}
1750
1751//The total number of operations is 0
1752template <> inline BitBlock simd<8>::himask()
1753{
1754        return simd<8>::constant<(240)>();
1755}
1756
1757//The total number of operations is 0
1758template <> inline BitBlock simd<16>::himask()
1759{
1760        return simd<16>::constant<(65280)>();
1761}
1762
1763//The total number of operations is 0
1764template <> inline BitBlock simd<32>::himask()
1765{
1766        return simd<32>::constant<-65536>();
1767}
1768
1769//The total number of operations is 0
1770template <> inline BitBlock simd<64>::himask()
1771{
1772        return _mm_set_epi32(-1, 0, -1, 0);
1773}
1774
1775//The total number of operations is 0
1776template <> inline BitBlock simd<128>::himask()
1777{
1778        return _mm_set_epi32(-1, -1, 0, 0);
1779}
1780
1781//The total number of operations is 24
1782template <> inline BitBlock simd<1>::add(BitBlock arg1, BitBlock arg2)
1783{
1784        return simd<1>::ifh(simd<(2)>::himask(), simd<(2)>::add(arg1, simd_and(simd<(2)>::himask(), arg2)), simd<(2)>::add(arg1, arg2));
1785}
1786
1787//The total number of operations is 10
1788template <> inline BitBlock simd<2>::add(BitBlock arg1, BitBlock arg2)
1789{
1790        BitBlock tmp = simd_xor(arg1, arg2);
1791        return simd<1>::ifh(simd<2>::himask(), simd_xor(tmp, simd<128>::slli<1>(simd_and(arg1, arg2))), tmp);
1792}
1793
1794//The total number of operations is 6
1795template <> inline BitBlock simd<4>::add(BitBlock arg1, BitBlock arg2)
1796{
1797        return simd<1>::ifh(simd<(8)>::himask(), simd<(8)>::add(arg1, simd_and(simd<(8)>::himask(), arg2)), simd<(8)>::add(arg1, arg2));
1798}
1799
1800//The total number of operations is 1
1801template <> inline BitBlock simd<8>::add(BitBlock arg1, BitBlock arg2)
1802{
1803        return _mm_add_epi8(arg1, arg2);
1804}
1805
1806//The total number of operations is 1
1807template <> inline BitBlock simd<16>::add(BitBlock arg1, BitBlock arg2)
1808{
1809        return _mm_add_epi16(arg1, arg2);
1810}
1811
1812//The total number of operations is 1
1813template <> inline BitBlock simd<32>::add(BitBlock arg1, BitBlock arg2)
1814{
1815        return _mm_add_epi32(arg1, arg2);
1816}
1817
1818//The total number of operations is 1
1819template <> inline BitBlock simd<64>::add(BitBlock arg1, BitBlock arg2)
1820{
1821        return _mm_add_epi64(arg1, arg2);
1822}
1823
1824//The total number of operations is 15
1825template <> inline BitBlock simd<128>::add(BitBlock arg1, BitBlock arg2)
1826{
1827        BitBlock ans = simd<(64)>::add(arg1, arg2);
1828        BitBlock carryMask = simd_or(simd_and(arg1, arg2), simd_and(simd_xor(arg1, arg2), simd_not(ans)));
1829        BitBlock loMask = simd<128>::lomask();
1830        BitBlock carry = simd<128>::slli<1>(simd_and(carryMask, loMask));
1831        return simd<1>::ifh(loMask, ans, simd<(64)>::add(ans, carry));
1832}
1833
1834//The total number of operations is 76
1835template <> inline BitBlock simd<1>::abs(BitBlock arg1)
1836{
1837        BitBlock gtMask = simd<1>::gt(arg1, simd<1>::constant<0>());
1838        return simd<1>::ifh(gtMask, arg1, simd<1>::sub(gtMask, arg1));
1839}
1840
1841//The total number of operations is 9
1842template <> inline BitBlock simd<2>::abs(BitBlock arg1)
1843{
1844        return simd<1>::ifh(simd<2>::himask(), simd_and(arg1, simd<128>::slli<1>(simd_not(arg1))), arg1);
1845}
1846
1847//The total number of operations is 22
1848template <> inline BitBlock simd<4>::abs(BitBlock arg1)
1849{
1850        BitBlock gtMask = simd<4>::gt(arg1, simd<4>::constant<0>());
1851        return simd<1>::ifh(gtMask, arg1, simd<4>::sub(gtMask, arg1));
1852}
1853
1854//The total number of operations is 5
1855template <> inline BitBlock simd<8>::abs(BitBlock arg1)
1856{
1857        BitBlock gtMask = simd<8>::gt(arg1, simd<8>::constant<0>());
1858        return simd<1>::ifh(gtMask, arg1, simd<8>::sub(gtMask, arg1));
1859}
1860
1861//The total number of operations is 5
1862template <> inline BitBlock simd<16>::abs(BitBlock arg1)
1863{
1864        BitBlock gtMask = simd<16>::gt(arg1, simd<16>::constant<0>());
1865        return simd<1>::ifh(gtMask, arg1, simd<16>::sub(gtMask, arg1));
1866}
1867
1868//The total number of operations is 5
1869template <> inline BitBlock simd<32>::abs(BitBlock arg1)
1870{
1871        BitBlock gtMask = simd<32>::gt(arg1, simd<32>::constant<0>());
1872        return simd<1>::ifh(gtMask, arg1, simd<32>::sub(gtMask, arg1));
1873}
1874
1875//The total number of operations is 17
1876template <> inline BitBlock simd<64>::abs(BitBlock arg1)
1877{
1878        BitBlock eqMask = simd<64>::eq(simd<1>::ifh(simd<64>::himask(), simd<(32)>::abs(arg1), arg1), arg1);
1879        return simd<1>::ifh(eqMask, arg1, simd<64>::sub(eqMask, arg1));
1880}
1881
1882//The total number of operations is 53
1883template <> inline BitBlock simd<128>::abs(BitBlock arg1)
1884{
1885        BitBlock eqMask = simd<128>::eq(simd<1>::ifh(simd<128>::himask(), simd<(64)>::abs(arg1), arg1), arg1);
1886        return simd<1>::ifh(eqMask, arg1, simd<128>::sub(eqMask, arg1));
1887}
1888
1889//The total number of operations is 128
1890template <> inline BitBlock hsimd<2>::umin_hl(BitBlock arg1, BitBlock arg2)
1891{
1892        return simd<(1)>::umin(hsimd<2>::packh(arg1, arg2), hsimd<2>::packl(arg1, arg2));
1893}
1894
1895//The total number of operations is 80
1896template <> inline BitBlock hsimd<4>::umin_hl(BitBlock arg1, BitBlock arg2)
1897{
1898        return simd<(2)>::umin(hsimd<4>::packh(arg1, arg2), hsimd<4>::packl(arg1, arg2));
1899}
1900
1901//The total number of operations is 42
1902template <> inline BitBlock hsimd<8>::umin_hl(BitBlock arg1, BitBlock arg2)
1903{
1904        return simd<(4)>::umin(hsimd<8>::packh(arg1, arg2), hsimd<8>::packl(arg1, arg2));
1905}
1906
1907//The total number of operations is 7
1908template <> inline BitBlock hsimd<16>::umin_hl(BitBlock arg1, BitBlock arg2)
1909{
1910        return simd<(8)>::umin(hsimd<16>::packh(arg1, arg2), hsimd<16>::packl(arg1, arg2));
1911}
1912
1913//The total number of operations is 54
1914template <> inline BitBlock hsimd<32>::umin_hl(BitBlock arg1, BitBlock arg2)
1915{
1916        return simd<(16)>::umin(hsimd<32>::packh(arg1, arg2), hsimd<32>::packl(arg1, arg2));
1917}
1918
1919//The total number of operations is 39
1920template <> inline BitBlock hsimd<64>::umin_hl(BitBlock arg1, BitBlock arg2)
1921{
1922        return simd<(32)>::umin(hsimd<64>::packh(arg1, arg2), hsimd<64>::packl(arg1, arg2));
1923}
1924
1925//The total number of operations is 54
1926template <> inline BitBlock hsimd<128>::umin_hl(BitBlock arg1, BitBlock arg2)
1927{
1928        return simd<(64)>::umin(hsimd<128>::packh(arg1, arg2), hsimd<128>::packl(arg1, arg2));
1929}
1930
1931//The total number of operations is 116
1932template <> inline BitBlock hsimd<2>::add_hl(BitBlock arg1, BitBlock arg2)
1933{
1934        return simd<(1)>::add(hsimd<2>::packh(arg1, arg2), hsimd<2>::packl(arg1, arg2));
1935}
1936
1937//The total number of operations is 74
1938template <> inline BitBlock hsimd<4>::add_hl(BitBlock arg1, BitBlock arg2)
1939{
1940        return simd<(2)>::add(hsimd<4>::packh(arg1, arg2), hsimd<4>::packl(arg1, arg2));
1941}
1942
1943//The total number of operations is 42
1944template <> inline BitBlock hsimd<8>::add_hl(BitBlock arg1, BitBlock arg2)
1945{
1946        return simd<(4)>::add(hsimd<8>::packh(arg1, arg2), hsimd<8>::packl(arg1, arg2));
1947}
1948
1949//The total number of operations is 7
1950template <> inline BitBlock hsimd<16>::add_hl(BitBlock arg1, BitBlock arg2)
1951{
1952        return simd<(8)>::add(hsimd<16>::packh(arg1, arg2), hsimd<16>::packl(arg1, arg2));
1953}
1954
1955//The total number of operations is 41
1956template <> inline BitBlock hsimd<32>::add_hl(BitBlock arg1, BitBlock arg2)
1957{
1958        return simd<(16)>::add(hsimd<32>::packh(arg1, arg2), hsimd<32>::packl(arg1, arg2));
1959}
1960
1961//The total number of operations is 13
1962template <> inline BitBlock hsimd<64>::add_hl(BitBlock arg1, BitBlock arg2)
1963{
1964        return simd<(32)>::add(hsimd<64>::packh(arg1, arg2), hsimd<64>::packl(arg1, arg2));
1965}
1966
1967//The total number of operations is 15
1968template <> inline BitBlock hsimd<128>::add_hl(BitBlock arg1, BitBlock arg2)
1969{
1970        return simd<(64)>::add(hsimd<128>::packh(arg1, arg2), hsimd<128>::packl(arg1, arg2));
1971}
1972
1973//The total number of operations is 132
1974template <> inline BitBlock hsimd<2>::packss(BitBlock arg1, BitBlock arg2)
1975{
1976        BitBlock hiBound = simd<2>::srli<1>(simd<2>::lomask());
1977        BitBlock loBound = simd_not(hiBound);
1978        return hsimd<2>::packl(simd<1>::ifh(simd<2>::gt(arg1, hiBound), hiBound, simd<1>::ifh(simd<2>::gt(arg1, loBound), arg1, loBound)), simd<1>::ifh(simd<2>::gt(arg2, hiBound), hiBound, simd<1>::ifh(simd<2>::gt(arg2, loBound), arg2, loBound)));
1979}
1980
1981//The total number of operations is 98
1982template <> inline BitBlock hsimd<4>::packss(BitBlock arg1, BitBlock arg2)
1983{
1984        BitBlock hiBound = simd<4>::srli<1>(simd<4>::lomask());
1985        BitBlock loBound = simd_not(hiBound);
1986        return hsimd<4>::packl(simd<1>::ifh(simd<4>::gt(arg1, hiBound), hiBound, simd<1>::ifh(simd<4>::gt(arg1, loBound), arg1, loBound)), simd<1>::ifh(simd<4>::gt(arg2, hiBound), hiBound, simd<1>::ifh(simd<4>::gt(arg2, loBound), arg2, loBound)));
1987}
1988
1989//The total number of operations is 36
1990template <> inline BitBlock hsimd<8>::packss(BitBlock arg1, BitBlock arg2)
1991{
1992        BitBlock hiBound = simd<8>::srli<1>(simd<8>::lomask());
1993        BitBlock loBound = simd_not(hiBound);
1994        return hsimd<8>::packl(simd<1>::ifh(simd<8>::gt(arg1, hiBound), hiBound, simd<1>::ifh(simd<8>::gt(arg1, loBound), arg1, loBound)), simd<1>::ifh(simd<8>::gt(arg2, hiBound), hiBound, simd<1>::ifh(simd<8>::gt(arg2, loBound), arg2, loBound)));
1995}
1996
1997//The total number of operations is 1
1998template <> inline BitBlock hsimd<16>::packss(BitBlock arg1, BitBlock arg2)
1999{
2000        return _mm_packs_epi16(arg2, arg1);
2001}
2002
2003//The total number of operations is 1
2004template <> inline BitBlock hsimd<32>::packss(BitBlock arg1, BitBlock arg2)
2005{
2006        return _mm_packs_epi32(arg2, arg1);
2007}
2008
2009//The total number of operations is 115
2010template <> inline BitBlock hsimd<64>::packss(BitBlock arg1, BitBlock arg2)
2011{
2012        BitBlock hiBound = simd<64>::srli<1>(simd<64>::lomask());
2013        BitBlock loBound = simd_not(hiBound);
2014        return hsimd<64>::packl(simd<1>::ifh(simd<64>::gt(arg1, hiBound), hiBound, simd<1>::ifh(simd<64>::gt(arg1, loBound), arg1, loBound)), simd<1>::ifh(simd<64>::gt(arg2, hiBound), hiBound, simd<1>::ifh(simd<64>::gt(arg2, loBound), arg2, loBound)));
2015}
2016
2017//The total number of operations is 360
2018template <> inline BitBlock hsimd<128>::packss(BitBlock arg1, BitBlock arg2)
2019{
2020        BitBlock hiBound = simd<128>::srli<1>(simd<128>::lomask());
2021        BitBlock loBound = simd_not(hiBound);
2022        return hsimd<128>::packl(simd<1>::ifh(simd<128>::gt(arg1, hiBound), hiBound, simd<1>::ifh(simd<128>::gt(arg1, loBound), arg1, loBound)), simd<1>::ifh(simd<128>::gt(arg2, hiBound), hiBound, simd<1>::ifh(simd<128>::gt(arg2, loBound), arg2, loBound)));
2023}
2024
2025//The total number of operations is 24
2026template <> inline int hsimd<4>::signmask(BitBlock arg1)
2027{
2028        int tmpAns1 = hsimd<(8)>::signmask(esimd<4>::mergeh(arg1, simd<4>::constant<0>()));
2029        int tmpAns2 = hsimd<(8)>::signmask(esimd<4>::mergel(arg1, simd<4>::constant<0>()));
2030        return ((tmpAns1<<(16))+tmpAns2);
2031}
2032
2033//The total number of operations is 1
2034template <> inline int hsimd<8>::signmask(BitBlock arg1)
2035{
2036        return _mm_movemask_epi8(arg1);
2037}
2038
2039//The total number of operations is 4
2040template <> inline int hsimd<16>::signmask(BitBlock arg1)
2041{
2042        return hsimd<(8)>::signmask(hsimd<16>::packh(simd<16>::constant<0>(), arg1));
2043}
2044
2045//The total number of operations is 25
2046template <> inline int hsimd<32>::signmask(BitBlock arg1)
2047{
2048        return hsimd<(16)>::signmask(hsimd<32>::packh(simd<32>::constant<0>(), arg1));
2049}
2050
2051//The total number of operations is 32
2052template <> inline int hsimd<64>::signmask(BitBlock arg1)
2053{
2054        return hsimd<(32)>::signmask(hsimd<64>::packh(simd<64>::constant<0>(), arg1));
2055}
2056
2057//The total number of operations is 39
2058template <> inline int hsimd<128>::signmask(BitBlock arg1)
2059{
2060        return hsimd<(64)>::signmask(hsimd<128>::packh(simd<128>::constant<0>(), arg1));
2061}
2062
2063//The total number of operations is 45
2064template <> inline BitBlock hsimd<2>::packl(BitBlock arg1, BitBlock arg2)
2065{
2066        return hsimd<(4)>::packl(simd<1>::ifh(simd<2>::himask(), simd<128>::srli<(1)>(arg1), arg1), simd<1>::ifh(simd<2>::himask(), simd<128>::srli<(1)>(arg2), arg2));
2067}
2068
2069//The total number of operations is 31
2070template <> inline BitBlock hsimd<4>::packl(BitBlock arg1, BitBlock arg2)
2071{
2072        return hsimd<(8)>::packl(simd<1>::ifh(simd<4>::himask(), simd<128>::srli<(2)>(arg1), arg1), simd<1>::ifh(simd<4>::himask(), simd<128>::srli<(2)>(arg2), arg2));
2073}
2074
2075//The total number of operations is 17
2076template <> inline BitBlock hsimd<8>::packl(BitBlock arg1, BitBlock arg2)
2077{
2078        return hsimd<(16)>::packl(simd<1>::ifh(simd<8>::himask(), simd<128>::srli<(4)>(arg1), arg1), simd<1>::ifh(simd<8>::himask(), simd<128>::srli<(4)>(arg2), arg2));
2079}
2080
2081//The total number of operations is 3
2082template <> inline BitBlock hsimd<16>::packl(BitBlock arg1, BitBlock arg2)
2083{
2084        return hsimd<16>::packus(simd_and(arg1, simd<16>::lomask()), simd_and(arg2, simd<16>::lomask()));
2085}
2086
2087//The total number of operations is 19
2088template <> inline BitBlock hsimd<32>::packl(BitBlock arg1, BitBlock arg2)
2089{
2090        return hsimd<(64)>::packl(simd<1>::ifh(simd<32>::himask(), simd<128>::srli<(16)>(arg1), arg1), simd<1>::ifh(simd<32>::himask(), simd<128>::srli<(16)>(arg2), arg2));
2091}
2092
2093//The total number of operations is 5
2094template <> inline BitBlock hsimd<64>::packl(BitBlock arg1, BitBlock arg2)
2095{
2096        return simd_or(mvmd<32>::shufflei<shufflemask4(2, 0, 3, 3)>(simd_andc(arg1, simd<64>::himask())), mvmd<32>::shufflei<shufflemask4(3, 3, 2, 0)>(simd_andc(arg2, simd<64>::himask())));
2097}
2098
2099//The total number of operations is 7
2100template <> inline BitBlock hsimd<128>::packl(BitBlock arg1, BitBlock arg2)
2101{
2102        return simd<1>::ifh(simd<128>::himask(), simd<128>::slli<(64)>(arg1), arg2);
2103}
2104
2105//The total number of operations is 47
2106template <> inline BitBlock hsimd<2>::packh(BitBlock arg1, BitBlock arg2)
2107{
2108        return hsimd<2>::packl(simd<64>::srli<(1)>(arg1), simd<64>::srli<(1)>(arg2));
2109}
2110
2111//The total number of operations is 33
2112template <> inline BitBlock hsimd<4>::packh(BitBlock arg1, BitBlock arg2)
2113{
2114        return hsimd<4>::packl(simd<64>::srli<(2)>(arg1), simd<64>::srli<(2)>(arg2));
2115}
2116
2117//The total number of operations is 19
2118template <> inline BitBlock hsimd<8>::packh(BitBlock arg1, BitBlock arg2)
2119{
2120        return hsimd<8>::packl(simd<64>::srli<(4)>(arg1), simd<64>::srli<(4)>(arg2));
2121}
2122
2123//The total number of operations is 3
2124template <> inline BitBlock hsimd<16>::packh(BitBlock arg1, BitBlock arg2)
2125{
2126        return hsimd<16>::packus(simd<16>::srli<(8)>(arg1), simd<16>::srli<(8)>(arg2));
2127}
2128
2129//The total number of operations is 21
2130template <> inline BitBlock hsimd<32>::packh(BitBlock arg1, BitBlock arg2)
2131{
2132        return hsimd<32>::packl(simd<64>::srli<(16)>(arg1), simd<64>::srli<(16)>(arg2));
2133}
2134
2135//The total number of operations is 7
2136template <> inline BitBlock hsimd<64>::packh(BitBlock arg1, BitBlock arg2)
2137{
2138        return hsimd<64>::packl(simd<64>::srli<(32)>(arg1), simd<64>::srli<(32)>(arg2));
2139}
2140
2141//The total number of operations is 7
2142template <> inline BitBlock hsimd<128>::packh(BitBlock arg1, BitBlock arg2)
2143{
2144        return simd<1>::ifh(simd<128>::himask(), arg1, simd<128>::srli<(64)>(arg2));
2145}
2146
2147//The total number of operations is 142
2148template <> inline BitBlock hsimd<2>::min_hl(BitBlock arg1, BitBlock arg2)
2149{
2150        return simd<(1)>::min(hsimd<2>::packh(arg1, arg2), hsimd<2>::packl(arg1, arg2));
2151}
2152
2153//The total number of operations is 84
2154template <> inline BitBlock hsimd<4>::min_hl(BitBlock arg1, BitBlock arg2)
2155{
2156        return simd<(2)>::min(hsimd<4>::packh(arg1, arg2), hsimd<4>::packl(arg1, arg2));
2157}
2158
2159//The total number of operations is 52
2160template <> inline BitBlock hsimd<8>::min_hl(BitBlock arg1, BitBlock arg2)
2161{
2162        return simd<(4)>::min(hsimd<8>::packh(arg1, arg2), hsimd<8>::packl(arg1, arg2));
2163}
2164
2165//The total number of operations is 10
2166template <> inline BitBlock hsimd<16>::min_hl(BitBlock arg1, BitBlock arg2)
2167{
2168        return simd<(8)>::min(hsimd<16>::packh(arg1, arg2), hsimd<16>::packl(arg1, arg2));
2169}
2170
2171//The total number of operations is 41
2172template <> inline BitBlock hsimd<32>::min_hl(BitBlock arg1, BitBlock arg2)
2173{
2174        return simd<(16)>::min(hsimd<32>::packh(arg1, arg2), hsimd<32>::packl(arg1, arg2));
2175}
2176
2177//The total number of operations is 16
2178template <> inline BitBlock hsimd<64>::min_hl(BitBlock arg1, BitBlock arg2)
2179{
2180        return simd<(32)>::min(hsimd<64>::packh(arg1, arg2), hsimd<64>::packl(arg1, arg2));
2181}
2182
2183//The total number of operations is 41
2184template <> inline BitBlock hsimd<128>::min_hl(BitBlock arg1, BitBlock arg2)
2185{
2186        return simd<(64)>::min(hsimd<128>::packh(arg1, arg2), hsimd<128>::packl(arg1, arg2));
2187}
2188
2189//The total number of operations is 99
2190template <> inline BitBlock hsimd<2>::packus(BitBlock arg1, BitBlock arg2)
2191{
2192        BitBlock arg11 = simd<2>::ifh(arg1, simd<2>::constant<0>(), arg1);
2193        BitBlock arg12 = simd_and(simd<2>::lomask(), arg11);
2194        BitBlock arg21 = simd<2>::ifh(arg2, simd<2>::constant<0>(), arg2);
2195        BitBlock arg22 = simd_and(simd<2>::lomask(), arg21);
2196        return hsimd<2>::packl(simd<1>::ifh(simd<2>::eq(arg12, arg11), arg12, simd<2>::lomask()), simd<1>::ifh(simd<2>::eq(arg22, arg21), arg22, simd<2>::lomask()));
2197}
2198
2199//The total number of operations is 83
2200template <> inline BitBlock hsimd<4>::packus(BitBlock arg1, BitBlock arg2)
2201{
2202        BitBlock arg11 = simd<4>::ifh(arg1, simd<4>::constant<0>(), arg1);
2203        BitBlock arg12 = simd_and(simd<4>::lomask(), arg11);
2204        BitBlock arg21 = simd<4>::ifh(arg2, simd<4>::constant<0>(), arg2);
2205        BitBlock arg22 = simd_and(simd<4>::lomask(), arg21);
2206        return hsimd<4>::packl(simd<1>::ifh(simd<4>::eq(arg12, arg11), arg12, simd<4>::lomask()), simd<1>::ifh(simd<4>::eq(arg22, arg21), arg22, simd<4>::lomask()));
2207}
2208
2209//The total number of operations is 35
2210template <> inline BitBlock hsimd<8>::packus(BitBlock arg1, BitBlock arg2)
2211{
2212        BitBlock arg11 = simd<8>::ifh(arg1, simd<8>::constant<0>(), arg1);
2213        BitBlock arg12 = simd_and(simd<8>::lomask(), arg11);
2214        BitBlock arg21 = simd<8>::ifh(arg2, simd<8>::constant<0>(), arg2);
2215        BitBlock arg22 = simd_and(simd<8>::lomask(), arg21);
2216        return hsimd<8>::packl(simd<1>::ifh(simd<8>::eq(arg12, arg11), arg12, simd<8>::lomask()), simd<1>::ifh(simd<8>::eq(arg22, arg21), arg22, simd<8>::lomask()));
2217}
2218
2219//The total number of operations is 1
2220template <> inline BitBlock hsimd<16>::packus(BitBlock arg1, BitBlock arg2)
2221{
2222        return _mm_packus_epi16(arg2, arg1);
2223}
2224
2225//The total number of operations is 37
2226template <> inline BitBlock hsimd<32>::packus(BitBlock arg1, BitBlock arg2)
2227{
2228        BitBlock arg11 = simd<32>::ifh(arg1, simd<32>::constant<0>(), arg1);
2229        BitBlock arg12 = simd_and(simd<32>::lomask(), arg11);
2230        BitBlock arg21 = simd<32>::ifh(arg2, simd<32>::constant<0>(), arg2);
2231        BitBlock arg22 = simd_and(simd<32>::lomask(), arg21);
2232        return hsimd<32>::packl(simd<1>::ifh(simd<32>::eq(arg12, arg11), arg12, simd<32>::lomask()), simd<1>::ifh(simd<32>::eq(arg22, arg21), arg22, simd<32>::lomask()));
2233}
2234
2235//The total number of operations is 18
2236template <> inline BitBlock hsimd<64>::packus(BitBlock arg1, BitBlock arg2)
2237{
2238        BitBlock hiPart = hsimd<64>::packh(arg1, arg2);
2239        return simd<(32)>::ifh(hiPart, simd<(32)>::constant<0>(), simd_or(simd<(32)>::gt(hiPart, simd<(32)>::constant<0>()), hsimd<64>::packl(arg1, arg2)));
2240}
2241
2242//The total number of operations is 47
2243template <> inline BitBlock hsimd<128>::packus(BitBlock arg1, BitBlock arg2)
2244{
2245        BitBlock hiPart = hsimd<128>::packh(arg1, arg2);
2246        return simd<(64)>::ifh(hiPart, simd<(64)>::constant<0>(), simd_or(simd<(64)>::gt(hiPart, simd<(64)>::constant<0>()), hsimd<128>::packl(arg1, arg2)));
2247}
2248
2249//The total number of operations is 31
2250template <> inline BitBlock esimd<1>::mergel(BitBlock arg1, BitBlock arg2)
2251{
2252        return esimd<(2)>::mergel(simd<1>::ifh(simd<(2)>::himask(), arg1, simd<(2)>::srli<1>(arg2)), simd<1>::ifh(simd<(2)>::himask(), simd<(2)>::slli<1>(arg1), arg2));
2253}
2254
2255//The total number of operations is 21
2256template <> inline BitBlock esimd<2>::mergel(BitBlock arg1, BitBlock arg2)
2257{
2258        return esimd<(4)>::mergel(simd<1>::ifh(simd<(4)>::himask(), arg1, simd<(4)>::srli<2>(arg2)), simd<1>::ifh(simd<(4)>::himask(), simd<(4)>::slli<2>(arg1), arg2));
2259}
2260
2261//The total number of operations is 11
2262template <> inline BitBlock esimd<4>::mergel(BitBlock arg1, BitBlock arg2)
2263{
2264        return esimd<(8)>::mergel(simd<1>::ifh(simd<(8)>::himask(), arg1, simd<(8)>::srli<4>(arg2)), simd<1>::ifh(simd<(8)>::himask(), simd<(8)>::slli<4>(arg1), arg2));
2265}
2266
2267//The total number of operations is 1
2268template <> inline BitBlock esimd<8>::mergel(BitBlock arg1, BitBlock arg2)
2269{
2270        return _mm_unpacklo_epi8(arg2, arg1);
2271}
2272
2273//The total number of operations is 1
2274template <> inline BitBlock esimd<16>::mergel(BitBlock arg1, BitBlock arg2)
2275{
2276        return _mm_unpacklo_epi16(arg2, arg1);
2277}
2278
2279//The total number of operations is 1
2280template <> inline BitBlock esimd<32>::mergel(BitBlock arg1, BitBlock arg2)
2281{
2282        return _mm_unpacklo_epi32(arg2, arg1);
2283}
2284
2285//The total number of operations is 1
2286template <> inline BitBlock esimd<64>::mergel(BitBlock arg1, BitBlock arg2)
2287{
2288        return _mm_unpacklo_epi64(arg2, arg1);
2289}
2290
2291//The total number of operations is 31
2292template <> inline BitBlock esimd<1>::mergeh(BitBlock arg1, BitBlock arg2)
2293{
2294        return esimd<(2)>::mergeh(simd<1>::ifh(simd<(2)>::himask(), arg1, simd<(2)>::srli<1>(arg2)), simd<1>::ifh(simd<(2)>::himask(), simd<(2)>::slli<1>(arg1), arg2));
2295}
2296
2297//The total number of operations is 21
2298template <> inline BitBlock esimd<2>::mergeh(BitBlock arg1, BitBlock arg2)
2299{
2300        return esimd<(4)>::mergeh(simd<1>::ifh(simd<(4)>::himask(), arg1, simd<(4)>::srli<2>(arg2)), simd<1>::ifh(simd<(4)>::himask(), simd<(4)>::slli<2>(arg1), arg2));
2301}
2302
2303//The total number of operations is 11
2304template <> inline BitBlock esimd<4>::mergeh(BitBlock arg1, BitBlock arg2)
2305{
2306        return esimd<(8)>::mergeh(simd<1>::ifh(simd<(8)>::himask(), arg1, simd<(8)>::srli<4>(arg2)), simd<1>::ifh(simd<(8)>::himask(), simd<(8)>::slli<4>(arg1), arg2));
2307}
2308
2309//The total number of operations is 1
2310template <> inline BitBlock esimd<8>::mergeh(BitBlock arg1, BitBlock arg2)
2311{
2312        return _mm_unpackhi_epi8(arg2, arg1);
2313}
2314
2315//The total number of operations is 1
2316template <> inline BitBlock esimd<16>::mergeh(BitBlock arg1, BitBlock arg2)
2317{
2318        return _mm_unpackhi_epi16(arg2, arg1);
2319}
2320
2321//The total number of operations is 1
2322template <> inline BitBlock esimd<32>::mergeh(BitBlock arg1, BitBlock arg2)
2323{
2324        return _mm_unpackhi_epi32(arg2, arg1);
2325}
2326
2327//The total number of operations is 1
2328template <> inline BitBlock esimd<64>::mergeh(BitBlock arg1, BitBlock arg2)
2329{
2330        return _mm_unpackhi_epi64(arg2, arg1);
2331}
2332
2333//The total number of operations is 24
2334template <> inline BitBlock esimd<1>::zeroextendh(BitBlock arg1)
2335{
2336        return esimd<(2)>::mergeh(simd<(2)>::srli<1>(arg1), simd_and(simd<(2)>::lomask(), arg1));
2337}
2338
2339//The total number of operations is 14
2340template <> inline BitBlock esimd<2>::zeroextendh(BitBlock arg1)
2341{
2342        return esimd<(4)>::mergeh(simd<(4)>::srli<2>(arg1), simd_and(simd<(4)>::lomask(), arg1));
2343}
2344
2345//The total number of operations is 4
2346template <> inline BitBlock esimd<4>::zeroextendh(BitBlock arg1)
2347{
2348        return esimd<(8)>::mergeh(simd<(8)>::srli<4>(arg1), simd_and(simd<(8)>::lomask(), arg1));
2349}
2350
2351//The total number of operations is 3
2352template <> inline BitBlock esimd<8>::zeroextendh(BitBlock arg1)
2353{
2354        return esimd<(16)>::mergeh(simd<(16)>::srli<8>(arg1), simd_and(simd<(16)>::lomask(), arg1));
2355}
2356
2357//The total number of operations is 3
2358template <> inline BitBlock esimd<16>::zeroextendh(BitBlock arg1)
2359{
2360        return esimd<(32)>::mergeh(simd<(32)>::srli<16>(arg1), simd_and(simd<(32)>::lomask(), arg1));
2361}
2362
2363//The total number of operations is 3
2364template <> inline BitBlock esimd<32>::zeroextendh(BitBlock arg1)
2365{
2366        return esimd<(64)>::mergeh(simd<(64)>::srli<32>(arg1), simd_and(simd<(64)>::lomask(), arg1));
2367}
2368
2369//The total number of operations is 4
2370template <> inline BitBlock esimd<64>::zeroextendh(BitBlock arg1)
2371{
2372        return simd<(128)>::srli<64>(arg1);
2373}
2374
2375//The total number of operations is 24
2376template <> inline BitBlock esimd<1>::zeroextendl(BitBlock arg1)
2377{
2378        return esimd<(2)>::mergel(simd<(2)>::srli<1>(arg1), simd_and(simd<(2)>::lomask(), arg1));
2379}
2380
2381//The total number of operations is 14
2382template <> inline BitBlock esimd<2>::zeroextendl(BitBlock arg1)
2383{
2384        return esimd<(4)>::mergel(simd<(4)>::srli<2>(arg1), simd_and(simd<(4)>::lomask(), arg1));
2385}
2386
2387//The total number of operations is 4
2388template <> inline BitBlock esimd<4>::zeroextendl(BitBlock arg1)
2389{
2390        return esimd<(8)>::mergel(simd<(8)>::srli<4>(arg1), simd_and(simd<(8)>::lomask(), arg1));
2391}
2392
2393//The total number of operations is 3
2394template <> inline BitBlock esimd<8>::zeroextendl(BitBlock arg1)
2395{
2396        return esimd<(16)>::mergel(simd<(16)>::srli<8>(arg1), simd_and(simd<(16)>::lomask(), arg1));
2397}
2398
2399//The total number of operations is 3
2400template <> inline BitBlock esimd<16>::zeroextendl(BitBlock arg1)
2401{
2402        return esimd<(32)>::mergel(simd<(32)>::srli<16>(arg1), simd_and(simd<(32)>::lomask(), arg1));
2403}
2404
2405//The total number of operations is 3
2406template <> inline BitBlock esimd<32>::zeroextendl(BitBlock arg1)
2407{
2408        return esimd<(64)>::mergel(simd<(64)>::srli<32>(arg1), simd_and(simd<(64)>::lomask(), arg1));
2409}
2410
2411//The total number of operations is 1
2412template <> inline BitBlock esimd<64>::zeroextendl(BitBlock arg1)
2413{
2414        return simd_and(simd<(128)>::lomask(), arg1);
2415}
2416
2417//The total number of operations is 31
2418template <> inline BitBlock esimd<1>::signextendh(BitBlock arg1)
2419{
2420        return esimd<(2)>::mergeh(simd<(2)>::srai<1>(arg1), simd<(2)>::srai<1>(simd<(2)>::slli<1>(arg1)));
2421}
2422
2423//The total number of operations is 33
2424template <> inline BitBlock esimd<2>::signextendh(BitBlock arg1)
2425{
2426        return esimd<(4)>::mergeh(simd<(4)>::srai<2>(arg1), simd<(4)>::srai<2>(simd<(4)>::slli<2>(arg1)));
2427}
2428
2429//The total number of operations is 13
2430template <> inline BitBlock esimd<4>::signextendh(BitBlock arg1)
2431{
2432        return esimd<(8)>::mergeh(simd<(8)>::srai<4>(arg1), simd<(8)>::srai<4>(simd<(8)>::slli<4>(arg1)));
2433}
2434
2435//The total number of operations is 4
2436template <> inline BitBlock esimd<8>::signextendh(BitBlock arg1)
2437{
2438        return esimd<(16)>::mergeh(simd<(16)>::srai<8>(arg1), simd<(16)>::srai<8>(simd<(16)>::slli<8>(arg1)));
2439}
2440
2441//The total number of operations is 4
2442template <> inline BitBlock esimd<16>::signextendh(BitBlock arg1)
2443{
2444        return esimd<(32)>::mergeh(simd<(32)>::srai<16>(arg1), simd<(32)>::srai<16>(simd<(32)>::slli<16>(arg1)));
2445}
2446
2447//The total number of operations is 12
2448template <> inline BitBlock esimd<32>::signextendh(BitBlock arg1)
2449{
2450        return esimd<(64)>::mergeh(simd<(64)>::srai<32>(arg1), simd<(64)>::srai<32>(simd<(64)>::slli<32>(arg1)));
2451}
2452
2453//The total number of operations is 24
2454template <> inline BitBlock esimd<64>::signextendh(BitBlock arg1)
2455{
2456        return simd<(128)>::srai<64>(arg1);
2457}
2458
2459//The total number of operations is 31
2460template <> inline BitBlock esimd<1>::signextendl(BitBlock arg1)
2461{
2462        return esimd<(2)>::mergel(simd<(2)>::srai<1>(arg1), simd<(2)>::srai<1>(simd<(2)>::slli<1>(arg1)));
2463}
2464
2465//The total number of operations is 33
2466template <> inline BitBlock esimd<2>::signextendl(BitBlock arg1)
2467{
2468        return esimd<(4)>::mergel(simd<(4)>::srai<2>(arg1), simd<(4)>::srai<2>(simd<(4)>::slli<2>(arg1)));
2469}
2470
2471//The total number of operations is 13
2472template <> inline BitBlock esimd<4>::signextendl(BitBlock arg1)
2473{
2474        return esimd<(8)>::mergel(simd<(8)>::srai<4>(arg1), simd<(8)>::srai<4>(simd<(8)>::slli<4>(arg1)));
2475}
2476
2477//The total number of operations is 4
2478template <> inline BitBlock esimd<8>::signextendl(BitBlock arg1)
2479{
2480        return esimd<(16)>::mergel(simd<(16)>::srai<8>(arg1), simd<(16)>::srai<8>(simd<(16)>::slli<8>(arg1)));
2481}
2482
2483//The total number of operations is 4
2484template <> inline BitBlock esimd<16>::signextendl(BitBlock arg1)
2485{
2486        return esimd<(32)>::mergel(simd<(32)>::srai<16>(arg1), simd<(32)>::srai<16>(simd<(32)>::slli<16>(arg1)));
2487}
2488
2489//The total number of operations is 12
2490template <> inline BitBlock esimd<32>::signextendl(BitBlock arg1)
2491{
2492        return esimd<(64)>::mergel(simd<(64)>::srai<32>(arg1), simd<(64)>::srai<32>(simd<(64)>::slli<32>(arg1)));
2493}
2494
2495//The total number of operations is 28
2496template <> inline BitBlock esimd<64>::signextendl(BitBlock arg1)
2497{
2498        return simd<(128)>::srai<64>(simd<(128)>::slli<64>(arg1));
2499}
2500
2501//The total number of operations is 17
2502template <> template <int msk> inline BitBlock mvmd<16>::shufflei(BitBlock arg1)
2503{
2504        BitBlock tmphi = _mm_shufflehi_epi16(arg1, (shufflemask8_to_shufflemask4(msk)>>8));
2505        BitBlock tmpAns = _mm_shufflelo_epi16(tmphi, (shufflemask8_to_shufflemask4(msk)&255));
2506        BitBlock tmplh = _mm_shufflehi_epi16(simd<128>::slli<64>(arg1), (shufflemask8_to_shufflemask4(msk)>>8));
2507        BitBlock tmphl = _mm_shufflelo_epi16(simd<128>::srli<64>(arg1), (shufflemask8_to_shufflemask4(msk)&255));
2508        int a1 = ((((msk>>21)&4) == 0) ? 0 : (131071));
2509        int a2 = ((((msk>>18)&4) == 0) ? 0 : (131071));
2510        int a3 = ((((msk>>15)&4) == 0) ? 0 : (131071));
2511        int a4 = ((((msk>>12)&4) == 0) ? 0 : (131071));
2512        int a5 = ((((msk>>9)&4) == 0) ? (131071) : 0);
2513        int a6 = ((((msk>>6)&4) == 0) ? (131071) : 0);
2514        int a7 = ((((msk>>3)&4) == 0) ? (131071) : 0);
2515        int a8 = (((msk&4) == 0) ? (131071) : 0);
2516        return simd<1>::ifh(mvmd<16>::fill8(a1, a2, a3, a4, a5, a6, a7, a8), tmpAns, simd_or(tmplh, tmphl));
2517}
2518
2519//The total number of operations is 1
2520template <> template <int msk> inline BitBlock mvmd<32>::shufflei(BitBlock arg1)
2521{
2522        return _mm_shuffle_epi32(arg1, msk);
2523}
2524
2525//The total number of operations is 1
2526template <> template <int msk> inline BitBlock mvmd<64>::shufflei(BitBlock arg1)
2527{
2528        return mvmd<32>::shufflei<shufflemask4_from_shufflemask2(msk)>(arg1);
2529}
2530
2531//The total number of operations is 9
2532template <> template <int sh> inline BitBlock mvmd<2>::dsrli(BitBlock arg1, BitBlock arg2)
2533{
2534        return simd_or(mvmd<2>::srli<sh>(arg1), mvmd<2>::slli<((64)-sh)>(arg2));
2535}
2536
2537//The total number of operations is 9
2538template <> template <int sh> inline BitBlock mvmd<4>::dsrli(BitBlock arg1, BitBlock arg2)
2539{
2540        return simd_or(mvmd<4>::srli<sh>(arg1), mvmd<4>::slli<((32)-sh)>(arg2));
2541}
2542
2543//The total number of operations is 9
2544template <> template <int sh> inline BitBlock mvmd<8>::dsrli(BitBlock arg1, BitBlock arg2)
2545{
2546        return simd_or(mvmd<8>::srli<sh>(arg1), mvmd<8>::slli<((16)-sh)>(arg2));
2547}
2548
2549//The total number of operations is 9
2550template <> template <int sh> inline BitBlock mvmd<16>::dsrli(BitBlock arg1, BitBlock arg2)
2551{
2552        return simd_or(mvmd<16>::srli<sh>(arg1), mvmd<16>::slli<((8)-sh)>(arg2));
2553}
2554
2555//The total number of operations is 9
2556template <> template <int sh> inline BitBlock mvmd<32>::dsrli(BitBlock arg1, BitBlock arg2)
2557{
2558        return simd_or(mvmd<32>::srli<sh>(arg1), mvmd<32>::slli<((4)-sh)>(arg2));
2559}
2560
2561//The total number of operations is 9
2562template <> template <int sh> inline BitBlock mvmd<64>::dsrli(BitBlock arg1, BitBlock arg2)
2563{
2564        return simd_or(mvmd<64>::srli<sh>(arg1), mvmd<64>::slli<((2)-sh)>(arg2));
2565}
2566
2567//The total number of operations is 9
2568template <> template <int sh> inline BitBlock mvmd<128>::dsrli(BitBlock arg1, BitBlock arg2)
2569{
2570        return simd_or(mvmd<128>::srli<sh>(arg1), mvmd<128>::slli<((1)-sh)>(arg2));
2571}
2572
2573//The total number of operations is 1
2574template <> inline BitBlock mvmd<1>::fill(int val1)
2575{
2576        return mvmd<32>::fill(val1);
2577}
2578
2579//The total number of operations is 1
2580template <> inline BitBlock mvmd<2>::fill(int val1)
2581{
2582        return ((val1 < 0) ? mvmd<(4)>::fill(((val1<<2)|(val1^(-4)))) : mvmd<(4)>::fill(((val1<<2)|val1)));
2583}
2584
2585//The total number of operations is 1
2586template <> inline BitBlock mvmd<4>::fill(int val1)
2587{
2588        return ((val1 < 0) ? mvmd<(8)>::fill(((val1<<4)|(val1^(-16)))) : mvmd<(8)>::fill(((val1<<4)|val1)));
2589}
2590
2591//The total number of operations is 1
2592template <> inline BitBlock mvmd<8>::fill(int val1)
2593{
2594        return _mm_set1_epi8(val1);
2595}
2596
2597//The total number of operations is 1
2598template <> inline BitBlock mvmd<16>::fill(int val1)
2599{
2600        return _mm_set1_epi16(val1);
2601}
2602
2603//The total number of operations is 1
2604template <> inline BitBlock mvmd<32>::fill(int val1)
2605{
2606        return _mm_set1_epi32(val1);
2607}
2608
2609//The total number of operations is 1
2610template <> inline BitBlock mvmd<64>::fill(int val1)
2611{
2612        return ((val1 >= 0) ? _mm_set_epi32(0, val1, 0, val1) : _mm_set_epi32(-1, val1, -1, val1));
2613}
2614
2615//The total number of operations is 1
2616template <> inline BitBlock mvmd<128>::fill(int val1)
2617{
2618        return ((val1 >= 0) ? _mm_set_epi32(0, 0, 0, val1) : _mm_set_epi32(-1, -1, -1, val1));
2619}
2620
2621//The total number of operations is 17
2622template <> template <int pos> inline BitBlock mvmd<1>::splat(BitBlock arg1)
2623{
2624        BitBlock tmpArg = (((pos%2) == 0) ? simd<(2)>::slli<1>(arg1) : simd<(2)>::srli<1>(arg1));
2625        BitBlock arg11 = (((pos%2) == 0) ? simd_and(simd<(2)>::lomask(), arg1) : simd_and(simd<(2)>::himask(), arg1));
2626        return mvmd<(2)>::splat<(pos/2)>(simd_or(tmpArg, arg11));
2627}
2628
2629//The total number of operations is 13
2630template <> template <int pos> inline BitBlock mvmd<2>::splat(BitBlock arg1)
2631{
2632        BitBlock tmpArg = (((pos%2) == 0) ? simd<(4)>::slli<2>(arg1) : simd<(4)>::srli<2>(arg1));
2633        BitBlock arg11 = (((pos%2) == 0) ? simd_and(simd<(4)>::lomask(), arg1) : simd_and(simd<(4)>::himask(), arg1));
2634        return mvmd<(4)>::splat<(pos/2)>(simd_or(tmpArg, arg11));
2635}
2636
2637//The total number of operations is 9
2638template <> template <int pos> inline BitBlock mvmd<4>::splat(BitBlock arg1)
2639{
2640        BitBlock tmpArg = (((pos%2) == 0) ? simd<(8)>::slli<4>(arg1) : simd<(8)>::srli<4>(arg1));
2641        BitBlock arg11 = (((pos%2) == 0) ? simd_and(simd<(8)>::lomask(), arg1) : simd_and(simd<(8)>::himask(), arg1));
2642        return mvmd<(8)>::splat<(pos/2)>(simd_or(tmpArg, arg11));
2643}
2644
2645//The total number of operations is 5
2646template <> template <int pos> inline BitBlock mvmd<8>::splat(BitBlock arg1)
2647{
2648        BitBlock tmpArg = (((pos%2) == 0) ? simd<(16)>::slli<8>(arg1) : simd<(16)>::srli<8>(arg1));
2649        BitBlock arg11 = (((pos%2) == 0) ? simd_and(simd<(16)>::lomask(), arg1) : simd_and(simd<(16)>::himask(), arg1));
2650        return mvmd<(16)>::splat<(pos/2)>(simd_or(tmpArg, arg11));
2651}
2652
2653//The total number of operations is 2
2654template <> template <int pos> inline BitBlock mvmd<16>::splat(BitBlock arg1)
2655{
2656        return mvmd<16>::fill(_mm_extract_epi16(arg1, pos));
2657}
2658
2659//The total number of operations is 1
2660template <> template <int pos> inline BitBlock mvmd<32>::splat(BitBlock arg1)
2661{
2662        return mvmd<32>::shufflei<shufflemask4(pos, pos, pos, pos)>(arg1);
2663}
2664
2665//The total number of operations is 5
2666template <> template <int pos> inline BitBlock mvmd<64>::splat(BitBlock arg1)
2667{
2668        return simd<1>::ifh(simd<64>::himask(), mvmd<(32)>::splat<((2*pos)+1)>(arg1), mvmd<(32)>::splat<(2*pos)>(arg1));
2669}
2670
2671//The total number of operations is 13
2672template <> template <int pos> inline BitBlock mvmd<128>::splat(BitBlock arg1)
2673{
2674        return simd<1>::ifh(simd<128>::himask(), mvmd<(64)>::splat<((2*pos)+1)>(arg1), mvmd<(64)>::splat<(2*pos)>(arg1));
2675}
2676
2677//The total number of operations is 15
2678template <> inline BitBlock mvmd<1>::fill16(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8, int val9, int val10, int val11, int val12, int val13, int val14, int val15, int val16)
2679{
2680        return simd_or(mvmd<(2)>::fill16((val1<<1), (val3<<1), (val5<<1), (val7<<1), (val9<<1), (val11<<1), (val13<<1), (val15<<1), (val1<<1), (val3<<1), (val5<<1), (val7<<1), (val9<<1), (val11<<1), (val13<<1), (val15<<1)), mvmd<(2)>::fill16((val2&(1)), (val4&(1)), (val6&(1)), (val8&(1)), (val10&(1)), (val12&(1)), (val14&(1)), (val16&(1)), (val2&(1)), (val4&(1)), (val6&(1)), (val8&(1)), (val10&(1)), (val12&(1)), (val14&(1)), (val16&(1))));
2681}
2682
2683//The total number of operations is 7
2684template <> inline BitBlock mvmd<2>::fill16(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8, int val9, int val10, int val11, int val12, int val13, int val14, int val15, int val16)
2685{
2686        return simd_or(mvmd<(4)>::fill16((val1<<2), (val3<<2), (val5<<2), (val7<<2), (val9<<2), (val11<<2), (val13<<2), (val15<<2), (val1<<2), (val3<<2), (val5<<2), (val7<<2), (val9<<2), (val11<<2), (val13<<2), (val15<<2)), mvmd<(4)>::fill16((val2&(3)), (val4&(3)), (val6&(3)), (val8&(3)), (val10&(3)), (val12&(3)), (val14&(3)), (val16&(3)), (val2&(3)), (val4&(3)), (val6&(3)), (val8&(3)), (val10&(3)), (val12&(3)), (val14&(3)), (val16&(3))));
2687}
2688
2689//The total number of operations is 3
2690template <> inline BitBlock mvmd<4>::fill16(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8, int val9, int val10, int val11, int val12, int val13, int val14, int val15, int val16)
2691{
2692        return simd_or(mvmd<(8)>::fill16((val1<<4), (val3<<4), (val5<<4), (val7<<4), (val9<<4), (val11<<4), (val13<<4), (val15<<4), (val1<<4), (val3<<4), (val5<<4), (val7<<4), (val9<<4), (val11<<4), (val13<<4), (val15<<4)), mvmd<(8)>::fill16((val2&(15)), (val4&(15)), (val6&(15)), (val8&(15)), (val10&(15)), (val12&(15)), (val14&(15)), (val16&(15)), (val2&(15)), (val4&(15)), (val6&(15)), (val8&(15)), (val10&(15)), (val12&(15)), (val14&(15)), (val16&(15))));
2693}
2694
2695//The total number of operations is 1
2696template <> inline BitBlock mvmd<8>::fill16(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8, int val9, int val10, int val11, int val12, int val13, int val14, int val15, int val16)
2697{
2698        return _mm_set_epi8(val1, val2, val3, val4, val5, val6, val7, val8, val9, val10, val11, val12, val13, val14, val15, val16);
2699}
2700
2701//The total number of operations is 4
2702template <> template <int sh> inline BitBlock mvmd<2>::slli(BitBlock arg1)
2703{
2704        return simd<128>::slli<(sh*2)>(arg1);
2705}
2706
2707//The total number of operations is 4
2708template <> template <int sh> inline BitBlock mvmd<4>::slli(BitBlock arg1)
2709{
2710        return simd<128>::slli<(sh*4)>(arg1);
2711}
2712
2713//The total number of operations is 4
2714template <> template <int sh> inline BitBlock mvmd<8>::slli(BitBlock arg1)
2715{
2716        return simd<128>::slli<(sh*8)>(arg1);
2717}
2718
2719//The total number of operations is 4
2720template <> template <int sh> inline BitBlock mvmd<16>::slli(BitBlock arg1)
2721{
2722        return simd<128>::slli<(sh*16)>(arg1);
2723}
2724
2725//The total number of operations is 4
2726template <> template <int sh> inline BitBlock mvmd<32>::slli(BitBlock arg1)
2727{
2728        return simd<128>::slli<(sh*32)>(arg1);
2729}
2730
2731//The total number of operations is 4
2732template <> template <int sh> inline BitBlock mvmd<64>::slli(BitBlock arg1)
2733{
2734        return simd<128>::slli<(sh*64)>(arg1);
2735}
2736
2737//The total number of operations is 4
2738template <> template <int sh> inline BitBlock mvmd<128>::slli(BitBlock arg1)
2739{
2740        return simd<128>::slli<(sh*128)>(arg1);
2741}
2742
2743//The total number of operations is 5
2744template <> inline BitBlock mvmd<1>::fill4(int val1, int val2, int val3, int val4)
2745{
2746        return simd<1>::ifh(simd<(4)>::himask(), mvmd<1>::fill2(val1, val2), mvmd<1>::fill2(val3, val4));
2747}
2748
2749//The total number of operations is 5
2750template <> inline BitBlock mvmd<2>::fill4(int val1, int val2, int val3, int val4)
2751{
2752        return simd<1>::ifh(simd<(8)>::himask(), mvmd<2>::fill2(val1, val2), mvmd<2>::fill2(val3, val4));
2753}
2754
2755//The total number of operations is 5
2756template <> inline BitBlock mvmd<4>::fill4(int val1, int val2, int val3, int val4)
2757{
2758        return simd<1>::ifh(simd<(16)>::himask(), mvmd<4>::fill2(val1, val2), mvmd<4>::fill2(val3, val4));
2759}
2760
2761//The total number of operations is 5
2762template <> inline BitBlock mvmd<8>::fill4(int val1, int val2, int val3, int val4)
2763{
2764        return simd<1>::ifh(simd<(32)>::himask(), mvmd<8>::fill2(val1, val2), mvmd<8>::fill2(val3, val4));
2765}
2766
2767//The total number of operations is 3
2768template <> inline BitBlock mvmd<16>::fill4(int val1, int val2, int val3, int val4)
2769{
2770        return simd_or(mvmd<(32)>::fill4((val1<<16), (val3<<16), (val1<<16), (val3<<16)), mvmd<(32)>::fill4((val2&(65535)), (val4&(65535)), (val2&(65535)), (val4&(65535))));
2771}
2772
2773//The total number of operations is 1
2774template <> inline BitBlock mvmd<32>::fill4(int val1, int val2, int val3, int val4)
2775{
2776        return _mm_set_epi32(val1, val2, val3, val4);
2777}
2778
2779//The total number of operations is 4
2780template <> template <int sh> inline BitBlock mvmd<2>::srli(BitBlock arg1)
2781{
2782        return simd<128>::srli<(sh*2)>(arg1);
2783}
2784
2785//The total number of operations is 4
2786template <> template <int sh> inline BitBlock mvmd<4>::srli(BitBlock arg1)
2787{
2788        return simd<128>::srli<(sh*4)>(arg1);
2789}
2790
2791//The total number of operations is 4
2792template <> template <int sh> inline BitBlock mvmd<8>::srli(BitBlock arg1)
2793{
2794        return simd<128>::srli<(sh*8)>(arg1);
2795}
2796
2797//The total number of operations is 4
2798template <> template <int sh> inline BitBlock mvmd<16>::srli(BitBlock arg1)
2799{
2800        return simd<128>::srli<(sh*16)>(arg1);
2801}
2802
2803//The total number of operations is 4
2804template <> template <int sh> inline BitBlock mvmd<32>::srli(BitBlock arg1)
2805{
2806        return simd<128>::srli<(sh*32)>(arg1);
2807}
2808
2809//The total number of operations is 4
2810template <> template <int sh> inline BitBlock mvmd<64>::srli(BitBlock arg1)
2811{
2812        return simd<128>::srli<(sh*64)>(arg1);
2813}
2814
2815//The total number of operations is 4
2816template <> template <int sh> inline BitBlock mvmd<128>::srli(BitBlock arg1)
2817{
2818        return simd<128>::srli<(sh*128)>(arg1);
2819}
2820
2821//The total number of operations is 1
2822template <> inline BitBlock mvmd<1>::fill2(int val1, int val2)
2823{
2824        return mvmd<(2)>::fill(((val1<<1)|(val2&(1))));
2825}
2826
2827//The total number of operations is 1
2828template <> inline BitBlock mvmd<2>::fill2(int val1, int val2)
2829{
2830        return mvmd<(4)>::fill(((val1<<2)|(val2&(3))));
2831}
2832
2833//The total number of operations is 1
2834template <> inline BitBlock mvmd<4>::fill2(int val1, int val2)
2835{
2836        return mvmd<(8)>::fill(((val1<<4)|(val2&(15))));
2837}
2838
2839//The total number of operations is 1
2840template <> inline BitBlock mvmd<8>::fill2(int val1, int val2)
2841{
2842        return mvmd<(16)>::fill(((val1<<8)|(val2&(255))));
2843}
2844
2845//The total number of operations is 1
2846template <> inline BitBlock mvmd<16>::fill2(int val1, int val2)
2847{
2848        return mvmd<(32)>::fill(((val1<<16)|(val2&(65535))));
2849}
2850
2851//The total number of operations is 5
2852template <> inline BitBlock mvmd<32>::fill2(int val1, int val2)
2853{
2854        return simd<1>::ifh(simd<(64)>::himask(), mvmd<32>::fill(val1), mvmd<32>::fill(val2));
2855}
2856
2857//The total number of operations is 5
2858template <> inline BitBlock mvmd<64>::fill2(int val1, int val2)
2859{
2860        return simd<1>::ifh(simd<(128)>::himask(), mvmd<64>::fill(val1), mvmd<64>::fill(val2));
2861}
2862
2863//The total number of operations is 9
2864template <> template <int sh> inline BitBlock mvmd<2>::dslli(BitBlock arg1, BitBlock arg2)
2865{
2866        return simd_or(mvmd<2>::slli<sh>(arg1), mvmd<2>::srli<((64)-sh)>(arg2));
2867}
2868
2869//The total number of operations is 9
2870template <> template <int sh> inline BitBlock mvmd<4>::dslli(BitBlock arg1, BitBlock arg2)
2871{
2872        return simd_or(mvmd<4>::slli<sh>(arg1), mvmd<4>::srli<((32)-sh)>(arg2));
2873}
2874
2875//The total number of operations is 9
2876template <> template <int sh> inline BitBlock mvmd<8>::dslli(BitBlock arg1, BitBlock arg2)
2877{
2878        return simd_or(mvmd<8>::slli<sh>(arg1), mvmd<8>::srli<((16)-sh)>(arg2));
2879}
2880
2881//The total number of operations is 9
2882template <> template <int sh> inline BitBlock mvmd<16>::dslli(BitBlock arg1, BitBlock arg2)
2883{
2884        return simd_or(mvmd<16>::slli<sh>(arg1), mvmd<16>::srli<((8)-sh)>(arg2));
2885}
2886
2887//The total number of operations is 9
2888template <> template <int sh> inline BitBlock mvmd<32>::dslli(BitBlock arg1, BitBlock arg2)
2889{
2890        return simd_or(mvmd<32>::slli<sh>(arg1), mvmd<32>::srli<((4)-sh)>(arg2));
2891}
2892
2893//The total number of operations is 9
2894template <> template <int sh> inline BitBlock mvmd<64>::dslli(BitBlock arg1, BitBlock arg2)
2895{
2896        return simd_or(mvmd<64>::slli<sh>(arg1), mvmd<64>::srli<((2)-sh)>(arg2));
2897}
2898
2899//The total number of operations is 9
2900template <> template <int sh> inline BitBlock mvmd<128>::dslli(BitBlock arg1, BitBlock arg2)
2901{
2902        return simd_or(mvmd<128>::slli<sh>(arg1), mvmd<128>::srli<((1)-sh)>(arg2));
2903}
2904
2905//The total number of operations is 13
2906template <> inline BitBlock mvmd<1>::fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8)
2907{
2908        return simd<1>::ifh(simd<(8)>::himask(), mvmd<1>::fill4(val1, val2, val3, val4), mvmd<1>::fill4(val5, val6, val7, val8));
2909}
2910
2911//The total number of operations is 13
2912template <> inline BitBlock mvmd<2>::fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8)
2913{
2914        return simd<1>::ifh(simd<(16)>::himask(), mvmd<2>::fill4(val1, val2, val3, val4), mvmd<2>::fill4(val5, val6, val7, val8));
2915}
2916
2917//The total number of operations is 7
2918template <> inline BitBlock mvmd<4>::fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8)
2919{
2920        return simd_or(mvmd<(8)>::fill8((val1<<4), (val3<<4), (val5<<4), (val7<<4), (val1<<4), (val3<<4), (val5<<4), (val7<<4)), mvmd<(8)>::fill8((val2&(15)), (val4&(15)), (val6&(15)), (val8&(15)), (val2&(15)), (val4&(15)), (val6&(15)), (val8&(15))));
2921}
2922
2923//The total number of operations is 3
2924template <> inline BitBlock mvmd<8>::fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8)
2925{
2926        return simd_or(mvmd<(16)>::fill8((val1<<8), (val3<<8), (val5<<8), (val7<<8), (val1<<8), (val3<<8), (val5<<8), (val7<<8)), mvmd<(16)>::fill8((val2&(255)), (val4&(255)), (val6&(255)), (val8&(255)), (val2&(255)), (val4&(255)), (val6&(255)), (val8&(255))));
2927}
2928
2929//The total number of operations is 1
2930template <> inline BitBlock mvmd<16>::fill8(int val1, int val2, int val3, int val4, int val5, int val6, int val7, int val8)
2931{
2932        return _mm_set_epi16(val1, val2, val3, val4, val5, val6, val7, val8);
2933}
2934
2935//The total number of operations is 1
2936template<class BB>
2937inline BB bitblock<BB>::load_unaligned(BB* arg1)
2938{
2939        return _mm_loadu_si128(arg1);
2940}
2941
2942//The total number of operations is 1
2943template<class BB>
2944inline void bitblock<BB>::store_aligned(BB* arg1, BB arg2)
2945{
2946        _mm_store_si128(arg1, arg2);
2947}
2948
2949//The total number of operations is 2
2950template<class BB>
2951inline bool bitblock<BB>::all(BB arg1)
2952{
2953        return hsimd<8>::signmask(simd<8>::eq(arg1, simd<8>::constant<-1>())) == 65535;
2954}
2955
2956//The total number of operations is 2
2957template<class BB>
2958inline bool bitblock<BB>::any(BB arg1)
2959{
2960        return hsimd<8>::signmask(simd<8>::eq(arg1, simd<8>::constant<0>())) != 65535;
2961}
2962
2963//The total number of operations is 1
2964template<class BB>
2965inline BB bitblock<BB>::load_aligned(BB* arg1)
2966{
2967        return _mm_load_si128(arg1);
2968}
2969
2970//The total number of operations is 1
2971template<class BB>
2972inline void bitblock<BB>::store_unaligned(BB* arg1, BB arg2)
2973{
2974        _mm_storeu_si128(arg1, arg2);
2975}
2976
2977#endif
Note: See TracBrowser for help on using the repository browser.