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

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

Inverse transposition for 16 bit streams to 16-bit code units

File size: 3.6 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 * s[]) {
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    for (unsigned j = 0; j<4; j++) {
31        p2s_step(iBuilder, bit00224466[j], bit11335577[j], iBuilder->simd_himask(2), 1, s[2*j+1], s[2*j]);
32    }
33}
34               
35void generateP2SKernel(Module * m, IDISA::IDISA_Builder * iBuilder, KernelBuilder * kBuilder) {
36    for (unsigned i = 0; i < 8; ++i) {
37        kBuilder->addInputStream(1);
38    }
39    kBuilder->addOutputStream(8);
40    kBuilder->prepareFunction();
41    Value * input[8];
42    for (unsigned j = 0; j < 8; ++j) {
43        input[j] = iBuilder->CreateBlockAlignedLoad(kBuilder->getInputStream(j));
44    }
45    Value * output[8];
46    p2s(iBuilder, input, output);
47    Value * output_ptr = kBuilder->getOutputStream(0);
48    for (unsigned j = 0; j < 8; ++j) {
49
50        iBuilder->CreateBlockAlignedStore(output[j], iBuilder->CreateGEP(output_ptr, std::vector<Value *>({ iBuilder->getInt32(0), iBuilder->getInt32(j) })));
51    }
52    kBuilder->finalize();
53}
54
55void generateP2S_16Kernel(Module * m, IDISA::IDISA_Builder * iBuilder, KernelBuilder * kBuilder) {
56    for (unsigned i = 0; i < 16; ++i) {
57        kBuilder->addInputStream(1);
58    }
59    kBuilder->addOutputStream(16);
60    kBuilder->prepareFunction();
61    Value * hi_input[8];
62    for (unsigned j = 0; j < 8; ++j) {
63        hi_input[j] = iBuilder->CreateBlockAlignedLoad(kBuilder->getInputStream(j));
64    }
65    Value * hi_bytes[8];
66    p2s(iBuilder, hi_input, hi_bytes);
67   
68    Value * lo_input[8];
69    for (unsigned j = 0; j < 8; ++j) {
70        lo_input[j] = iBuilder->CreateBlockAlignedLoad(kBuilder->getInputStream(j+8));
71    }
72    Value * lo_bytes[8];
73    p2s(iBuilder, lo_input, lo_bytes);
74   
75    Value * output_ptr = kBuilder->getOutputStream(0);
76    for (unsigned j = 0; j < 8; ++j) {
77        Value * merge0 = iBuilder->esimd_mergel(8, hi_bytes[j], lo_bytes[j]);
78        Value * merge1 = iBuilder->esimd_mergeh(8, hi_bytes[j], lo_bytes[j]);
79        iBuilder->CreateBlockAlignedStore(merge0, iBuilder->CreateGEP(output_ptr, std::vector<Value *>({ iBuilder->getInt32(0), iBuilder->getInt32(2*j) })));
80        iBuilder->CreateBlockAlignedStore(merge1, iBuilder->CreateGEP(output_ptr, std::vector<Value *>({ iBuilder->getInt32(0), iBuilder->getInt32(2*j+1) })));
81    }
82    kBuilder->finalize();
83}
84
85}
Note: See TracBrowser for help on using the repository browser.