source: icGREP/icgrep-devel/icgrep/kernels/p2s_kernel.cpp @ 4987

Last change on this file since 4987 was 4987, checked in by cameron, 3 years ago

Inverse transposition kernels

File size: 2.2 KB
Line 
1#include "p2s_kernel.h"
2#include "kernels/kernel.h"
3#include "IDISA/idisa_builder.h"
4
5namespace kernel{
6       
7void p2s_step(IDISA::IDISA_Builder * iBuilder, Value * p0, Value * p1, Value * hi_mask, unsigned shift, Value * &s1, Value * &s0) {
8    Value * t0 = iBuilder->simd_if(1, hi_mask, p0, iBuilder->simd_srli(16, p1, shift));
9    Value * t1 = iBuilder->simd_if(1, hi_mask, iBuilder->simd_slli(16, p0, shift), p1);
10    s1 = iBuilder->esimd_mergeh(8, t1, t0);
11    s0 = iBuilder->esimd_mergel(8, t1, t0);
12}
13
14inline void p2s(IDISA::IDISA_Builder * iBuilder, Value * p[], Value * output) {
15    Value * bit00004444[2];
16    Value * bit22226666[2];
17    Value * bit11115555[2];
18    Value * bit33337777[2];
19    p2s_step(iBuilder, p[0], p[4], iBuilder->simd_himask(8), 4, bit00004444[1], bit00004444[0]);
20    p2s_step(iBuilder, p[1], p[5], iBuilder->simd_himask(8), 4, bit11115555[1], bit11115555[0]);
21    p2s_step(iBuilder, p[2], p[6], iBuilder->simd_himask(8), 4, bit22226666[1], bit22226666[0]);
22    p2s_step(iBuilder, p[3], p[7], iBuilder->simd_himask(8), 4, bit33337777[1], bit33337777[0]);
23
24    Value * bit00224466[4];
25    Value * bit11335577[4];
26    for (unsigned j = 0; j<2; j++) {
27        p2s_step(iBuilder, bit00004444[j], bit22226666[j],iBuilder->simd_himask(4), 2, bit00224466[2*j+1], bit00224466[2*j]);
28        p2s_step(iBuilder, bit11115555[j], bit33337777[j],iBuilder->simd_himask(4), 2, bit11335577[2*j+1], bit11335577[2*j]);
29    }
30    Value * s[8];
31    for (unsigned j = 0; j<4; j++) {
32        p2s_step(iBuilder, bit00224466[j], bit11335577[j], iBuilder->simd_himask(2), 1, s[2*j+1], s[2*j]);
33    }
34    for (unsigned j = 0; j < 8; ++j) {
35        iBuilder->CreateBlockAlignedStore(s[j], output, {iBuilder->getInt32(j)});
36    }
37}
38               
39void generateP2SKernel(Module *, IDISA::IDISA_Builder * iBuilder, KernelBuilder * kBuilder) {
40    for (unsigned i = 0; i < 8; ++i) {
41        kBuilder->addInputStream(1);
42    }
43    kBuilder->addOutputStream(8);
44    kBuilder->prepareFunction();
45    Value * input[8];
46    Value * output = kBuilder->getOutputStream(0);
47    for (unsigned j = 0; j < 8; ++j) {
48        input[j] = iBuilder->CreateBlockAlignedLoad(kBuilder->getInputStream(j));
49    }
50    p2s(iBuilder, input, output);
51    kBuilder->finalize();
52}
53
54}
Note: See TracBrowser for help on using the repository browser.