source: icGREP/icgrep-devel/icgrep/IR_Gen/idisa_avx_builder.h @ 6053

Last change on this file since 6053 was 6045, checked in by cameron, 17 months ago

StreamExpand? kernel and compiler - initial check-in

File size: 4.3 KB
Line 
1#ifndef IDISA_AVX_BUILDER_H
2#define IDISA_AVX_BUILDER_H
3
4/*
5 *  Copyright (c) 2015 International Characters.
6 *  This software is licensed to the public under the Open Software License 3.0.
7*/
8
9#include <IR_Gen/idisa_sse_builder.h>
10
11namespace IDISA {
12
13class IDISA_AVX_Builder : public IDISA_SSE2_Builder {
14public:
15
16    IDISA_AVX_Builder(llvm::LLVMContext & C, unsigned vectorWidth, unsigned stride)
17    : IDISA_Builder(C, vectorWidth, stride)
18    , IDISA_SSE2_Builder(C, vectorWidth, stride)
19    {
20
21    }
22
23    virtual std::string getBuilderUniqueName() override;
24
25    llvm::Value * hsimd_signmask(unsigned fw, llvm::Value * a) override;
26
27    ~IDISA_AVX_Builder() {}
28
29};
30
31class IDISA_AVX2_Builder : public IDISA_AVX_Builder {
32public:
33
34    IDISA_AVX2_Builder(llvm::LLVMContext & C, unsigned vectorWidth, unsigned stride)
35    : IDISA_Builder(C, vectorWidth, stride)
36    , IDISA_AVX_Builder(C, vectorWidth, stride) {
37
38    }
39
40    virtual std::string getBuilderUniqueName() override;
41    llvm::Value * hsimd_packh(unsigned fw, llvm::Value * a, llvm::Value * b) override;
42    llvm::Value * hsimd_packl(unsigned fw, llvm::Value * a, llvm::Value * b) override;
43    llvm::Value * esimd_mergeh(unsigned fw, llvm::Value * a, llvm::Value * b) override;
44    llvm::Value * esimd_mergel(unsigned fw, llvm::Value * a, llvm::Value * b) override;
45    llvm::Value * hsimd_packh_in_lanes(unsigned lanes, unsigned fw, llvm::Value * a, llvm::Value * b) override;
46    llvm::Value * hsimd_packl_in_lanes(unsigned lanes, unsigned fw, llvm::Value * a, llvm::Value * b) override;
47    std::pair<llvm::Value *, llvm::Value *> bitblock_add_with_carry(llvm::Value * a, llvm::Value * b, llvm::Value * carryin) override;
48    std::pair<llvm::Value *, llvm::Value *> bitblock_indexed_advance(llvm::Value * a, llvm::Value * index_strm, llvm::Value * shiftin, unsigned shift) override;
49    llvm::Value * hsimd_signmask(unsigned fw, llvm::Value * a) override;
50    llvm::Value * mvmd_srl(unsigned fw, llvm::Value * a, llvm::Value * shift) override;
51    llvm::Value * mvmd_sll(unsigned fw, llvm::Value * a, llvm::Value * shift) override;
52    llvm::Value * mvmd_shuffle(unsigned fw, llvm::Value * a, llvm::Value * shuffle_table) override;
53    llvm::Value * mvmd_compress(unsigned fw, llvm::Value * a, llvm::Value * select_mask) override;
54    llvm::Value * simd_pext(unsigned fw, llvm::Value * v, llvm::Value * extract_mask) override;
55    llvm::Value * simd_pdep(unsigned fw, llvm::Value * v, llvm::Value * deposit_mask) override;
56   
57
58    ~IDISA_AVX2_Builder() {}
59};
60
61class IDISA_AVX512F_Builder : public IDISA_AVX2_Builder {
62public:
63
64    IDISA_AVX512F_Builder(llvm::LLVMContext & C, unsigned vectorWidth, unsigned stride)
65    : IDISA_Builder(C, vectorWidth, stride)
66    , IDISA_AVX2_Builder(C, vectorWidth, stride) {
67        getAVX512Features();
68    }
69
70    virtual std::string getBuilderUniqueName() override;
71    void getAVX512Features();
72    llvm::Value * hsimd_packh(unsigned fw, llvm::Value * a, llvm::Value * b) override;
73    llvm::Value * hsimd_packl(unsigned fw, llvm::Value * a, llvm::Value * b) override;
74    llvm::Value * esimd_bitspread(unsigned fw, llvm::Value * bitmask) override;
75    llvm::Value * simd_popcount(unsigned fw, llvm::Value * a) override;
76    llvm::Value * mvmd_slli(unsigned fw, llvm::Value * a, unsigned shift) override;
77    llvm::Value * mvmd_dslli(unsigned fw, llvm::Value * a, llvm::Value * b, unsigned shift) override;
78    llvm::Value * hsimd_signmask(unsigned fw, llvm::Value * a) override;
79    llvm::Value * mvmd_shuffle(unsigned fw, llvm::Value * a, llvm::Value * shuffle_table) override;
80    llvm::Value * mvmd_shuffle2(unsigned fw, llvm::Value * a, llvm::Value * b, llvm::Value * shuffle_table) override;
81    llvm::Value * mvmd_compress(unsigned fw, llvm::Value * a, llvm::Value * select_mask) override;
82    llvm::Value * mvmd_srl(unsigned fw, llvm::Value * a, llvm::Value * shift) override;
83    llvm::Value * mvmd_sll(unsigned fw, llvm::Value * a, llvm::Value * shift) override;
84
85    ~IDISA_AVX512F_Builder() {
86    }
87private:
88    struct Features {
89        //not an exhaustive list, can be extended if needed
90        bool hasAVX512CD = false;
91        bool hasAVX512BW = false;
92        bool hasAVX512DQ = false;
93        bool hasAVX512VL = false;
94        bool hasAVX512VBMI = false;
95        bool hasAVX512VBMI2 = false;
96        bool hasAVX512VPOPCNTDQ = false;
97    };
98    Features hostCPUFeatures;
99};
100
101
102}
103#endif // IDISA_AVX_BUILDER_H
Note: See TracBrowser for help on using the repository browser.