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

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

casefold sample application/pipeline

File size: 2.3 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    m->dump();
54}
55
56}
Note: See TracBrowser for help on using the repository browser.