source: icGREP/icgrep-devel/icgrep/IR_Gen/idisa_builder.h @ 5260

Last change on this file since 5260 was 5260, checked in by nmedfort, 2 years ago

Changes working towards simplifying accessing stream elements + some modifications to simplify include / forward declarations within the CodeGen? library.

File size: 7.4 KB
Line 
1#ifndef IDISA_BUILDER_H
2#define IDISA_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 *  icgrep is a trademark of International Characters.
8 */
9#include "CBuilder.h"
10#include <llvm/IR/DerivedTypes.h>
11#include <IR_Gen/types/streamtype.h>
12#include <boost/container/flat_map.hpp>
13namespace llvm { class Constant; }
14namespace llvm { class LoadInst; }
15namespace llvm { class Module; }
16namespace llvm { class Type; }
17namespace llvm { class Value; }
18
19namespace IDISA {
20
21class IDISA_Builder : public CBuilder {
22
23    using StreamTypes = boost::container::flat_map<unsigned, StreamType *>;
24
25public:
26
27    IDISA_Builder(llvm::Module * m, unsigned archBitWidth, unsigned bitBlockWidth, unsigned stride, unsigned CacheAlignment=64);
28
29    virtual ~IDISA_Builder();
30   
31    std::string getBitBlockTypeName() const;  // A short string such as v4i64 or i256.
32
33    llvm::Value * bitCast(llvm::Value * a) {
34        return (a->getType() == mBitBlockType) ? a : CreateBitCast(a, mBitBlockType);
35    }
36
37    unsigned getBitBlockWidth() const {
38        return mBitBlockWidth;
39    }
40
41    unsigned getStride() const {
42        return mStride;
43    }
44
45    llvm::Constant * allZeroes() const {
46        return mZeroInitializer;
47    }
48
49    llvm::Constant * allOnes() const {
50        return mOneInitializer;
51    }
52   
53
54    llvm::LoadInst * CreateBlockAlignedLoad(llvm::Value * const ptr);
55    llvm::LoadInst * CreateBlockAlignedLoad(llvm::Value * const ptr, llvm::Value * const index);
56    llvm::LoadInst * CreateBlockAlignedLoad(llvm::Value * const ptr, std::initializer_list<llvm::Value *> indices);
57
58    void CreateBlockAlignedStore(llvm::Value * const value, llvm::Value * const ptr);
59    void CreateBlockAlignedStore(llvm::Value * const value, llvm::Value * const ptr, llvm::Value * const index);
60    void CreateBlockAlignedStore(llvm::Value * const value, llvm::Value * const ptr, std::initializer_list<llvm::Value *> indices);
61
62    llvm::VectorType * fwVectorType(unsigned fw);
63
64    llvm::Constant * simd_himask(unsigned fw);
65    llvm::Constant * simd_lomask(unsigned fw);
66   
67    virtual llvm::Value * simd_fill(unsigned fw, llvm::Value * a);
68
69    virtual llvm::Value * simd_add(unsigned fw, llvm::Value * a, llvm::Value * b);
70    virtual llvm::Value * simd_sub(unsigned fw, llvm::Value * a, llvm::Value * b);
71    virtual llvm::Value * simd_mult(unsigned fw, llvm::Value * a, llvm::Value * b);
72    virtual llvm::Value * simd_eq(unsigned fw, llvm::Value * a, llvm::Value * b);
73    virtual llvm::Value * simd_gt(unsigned fw, llvm::Value * a, llvm::Value * b);
74    virtual llvm::Value * simd_ugt(unsigned fw, llvm::Value * a, llvm::Value * b);
75    virtual llvm::Value * simd_lt(unsigned fw, llvm::Value * a, llvm::Value * b);
76    virtual llvm::Value * simd_ult(unsigned fw, llvm::Value * a, llvm::Value * b);
77    virtual llvm::Value * simd_max(unsigned fw, llvm::Value * a, llvm::Value * b);
78    virtual llvm::Value * simd_umax(unsigned fw, llvm::Value * a, llvm::Value * b);
79    virtual llvm::Value * simd_min(unsigned fw, llvm::Value * a, llvm::Value * b);
80    virtual llvm::Value * simd_umin(unsigned fw, llvm::Value * a, llvm::Value * b);
81    virtual llvm::Value * simd_if(unsigned fw, llvm::Value * cond, llvm::Value * a, llvm::Value * b);
82   
83    virtual llvm::Value * simd_slli(unsigned fw, llvm::Value * a, unsigned shift);
84    virtual llvm::Value * simd_srli(unsigned fw, llvm::Value * a, unsigned shift);
85    virtual llvm::Value * simd_srai(unsigned fw, llvm::Value * a, unsigned shift);
86   
87    virtual llvm::Value * simd_cttz(unsigned fw, llvm::Value * a);
88    virtual llvm::Value * simd_popcount(unsigned fw, llvm::Value * a);
89   
90    virtual llvm::Value * esimd_mergeh(unsigned fw, llvm::Value * a, llvm::Value * b);
91    virtual llvm::Value * esimd_mergel(unsigned fw, llvm::Value * a, llvm::Value * b);
92    virtual llvm::Value * esimd_bitspread(unsigned fw, llvm::Value * bitmask);
93   
94    virtual llvm::Value * hsimd_packh(unsigned fw, llvm::Value * a, llvm::Value * b);
95    virtual llvm::Value * hsimd_packl(unsigned fw, llvm::Value * a, llvm::Value * b);
96    virtual llvm::Value * hsimd_packh_in_lanes(unsigned lanes, unsigned fw, llvm::Value * a, llvm::Value * b);
97    virtual llvm::Value * hsimd_packl_in_lanes(unsigned lanes, unsigned fw, llvm::Value * a, llvm::Value * b);
98
99    virtual llvm::Value * hsimd_signmask(unsigned fw, llvm::Value * a);
100   
101    virtual llvm::Value * mvmd_extract(unsigned fw, llvm::Value * a, unsigned fieldIndex);
102    virtual llvm::Value * mvmd_insert(unsigned fw, llvm::Value * blk, llvm::Value * elt, unsigned fieldIndex);
103    virtual llvm::Value * mvmd_slli(unsigned fw, llvm::Value * a, unsigned shift);
104    virtual llvm::Value * mvmd_srli(unsigned fw, llvm::Value * a, unsigned shift);
105    virtual llvm::Value * mvmd_dslli(unsigned fw, llvm::Value * a, llvm::Value * b, unsigned shift);
106   
107   
108    virtual llvm::Value * bitblock_any(llvm::Value * a);
109    // full add producing {carryout, sum}
110    virtual std::pair<llvm::Value *, llvm::Value *> bitblock_add_with_carry(llvm::Value * a, llvm::Value * b, llvm::Value * carryin);
111    // full shift producing {shiftout, shifted}
112    virtual std::pair<llvm::Value *, llvm::Value *> bitblock_advance(llvm::Value * a, llvm::Value * shiftin, unsigned shift);
113    virtual llvm::Value * bitblock_mask_from(llvm::Value * pos);
114    virtual llvm::Value * bitblock_set_bit(llvm::Value * pos);
115   
116    llvm::Value * simd_and(llvm::Value * a, llvm::Value * b);
117    llvm::Value * simd_or(llvm::Value * a, llvm::Value * b);
118    llvm::Value * simd_xor(llvm::Value * a, llvm::Value * b);
119    llvm::Value * simd_not(llvm::Value * a);
120    llvm::Value * fwCast(unsigned fw, llvm::Value * a);
121   
122    inline llvm::VectorType * getBitBlockType() const {
123        return mBitBlockType;
124    }
125
126    inline llvm::ArrayType * getStreamSetTy(const unsigned NumElements = 1, const unsigned FieldWidth = 1) {
127        return llvm::ArrayType::get(getStreamTy(FieldWidth), NumElements);
128    }
129   
130    StreamType * getStreamTy(const unsigned FieldWidth = 1);
131
132    void CallPrintRegister(const std::string & regName, llvm::Value * const value);
133   
134protected:
135    unsigned            mBitBlockWidth;
136    unsigned            mStride;
137    llvm::VectorType *  mBitBlockType;
138
139    llvm::Constant *    mZeroInitializer;
140    llvm::Constant *    mOneInitializer;
141    llvm::Constant *    mPrintRegisterFunction;
142    StreamTypes         mStreamTypes;
143};
144
145inline llvm::LoadInst * IDISA_Builder::CreateBlockAlignedLoad(llvm::Value * const ptr) {
146    return CreateAlignedLoad(ptr, mBitBlockWidth / 8);
147}
148
149inline llvm::LoadInst * IDISA_Builder::CreateBlockAlignedLoad(llvm::Value * const ptr, llvm::Value * const index) {
150    return CreateBlockAlignedLoad(CreateGEP(ptr, index));
151}
152
153inline llvm::LoadInst * IDISA_Builder::CreateBlockAlignedLoad(llvm::Value * const ptr, std::initializer_list<llvm::Value *> indices) {
154    return CreateBlockAlignedLoad(CreateGEP(ptr, indices));
155}
156
157inline void IDISA_Builder::CreateBlockAlignedStore(llvm::Value * const value, llvm::Value * const ptr) {
158    CreateAlignedStore(value, ptr, mBitBlockWidth / 8);
159}
160
161inline void IDISA_Builder::CreateBlockAlignedStore(llvm::Value * const value, llvm::Value * const ptr, llvm::Value * const index) {
162    CreateBlockAlignedStore(value, CreateGEP(ptr, index));
163}
164
165inline void IDISA_Builder::CreateBlockAlignedStore(llvm::Value * const value, llvm::Value * const ptr, std::initializer_list<llvm::Value *> indices) {
166    CreateBlockAlignedStore(value, CreateGEP(ptr, indices));
167}
168   
169
170   
171}
172#endif // IDISA_BUILDER_H
Note: See TracBrowser for help on using the repository browser.