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

Last change on this file since 5978 was 5978, checked in by cameron, 13 months ago

Using Cole's bypass of AVX signmask in favoer of the SSE2 version

File size: 3.1 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
51    ~IDISA_AVX2_Builder() {}
52};
53
54class IDISA_AVX512F_Builder : public IDISA_AVX2_Builder {
55public:
56
57    IDISA_AVX512F_Builder(llvm::LLVMContext & C, unsigned vectorWidth, unsigned stride)
58    : IDISA_Builder(C, vectorWidth, stride)
59    , IDISA_AVX2_Builder(C, vectorWidth, stride) {
60        getAVX512Features();
61    }
62
63    virtual std::string getBuilderUniqueName() override;
64    void getAVX512Features();
65    llvm::Value * hsimd_packh(unsigned fw, llvm::Value * a, llvm::Value * b) override;
66    llvm::Value * hsimd_packl(unsigned fw, llvm::Value * a, llvm::Value * b) override;
67    llvm::Value * esimd_bitspread(unsigned fw, llvm::Value * bitmask) override;
68    llvm::Value * simd_popcount(unsigned fw, llvm::Value * a) override;
69    llvm::Value * hsimd_signmask(unsigned fw, llvm::Value * a) override;
70
71    ~IDISA_AVX512F_Builder() {
72    }
73private:
74    struct Features {
75        //not an exhaustive list, can be extended if needed
76        bool hasAVX512CD = false;
77        bool hasAVX512BW = false;
78        bool hasAVX512DQ = false;
79        bool hasAVX512VL = false;
80        bool hasAVX512VBMI = false;
81        bool hasAVX512VBMI2 = false;
82        bool hasAVX512VPOPCNTDQ = false;
83    };
84    Features hostCPUFeatures;
85};
86
87
88}
89#endif // IDISA_AVX_BUILDER_H
Note: See TracBrowser for help on using the repository browser.