unroll_macro.h 8.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#pragma once

#define UNROLL_RAW1(cb, v0, a...) cb(0, ##a)
#define UNROLL_RAW2(cb, v0, a...) cb(0, ##a) cb(1, ##a)
#define UNROLL_RAW3(cb, v0, a...) UNROLL_RAW2(cb, v0, ##a) cb(2, ##a)
#define UNROLL_RAW4(cb, v0, a...) \
    UNROLL_RAW2(cb, v0, ##a)      \
    cb(2, ##a) cb(3, ##a)
#define UNROLL_RAW5(cb, v0, a...) \
    UNROLL_RAW4(cb, v0, ##a)      \
    cb(4, ##a)
#define UNROLL_RAW6(cb, v0, a...) \
    UNROLL_RAW4(cb, v0, ##a)      \
    cb(4, ##a) cb(5, ##a)
#define UNROLL_RAW7(cb, v0, a...) \
    UNROLL_RAW4(cb, v0, ##a)      \
    cb(4, ##a) cb(5, ##a) cb(6, ##a)
#define UNROLL_RAW8(cb, v0, a...) \
    UNROLL_RAW4(cb, v0, ##a)      \
    cb(4, ##a) cb(5, ##a) cb(6, ##a) cb(7, ##a)
#define UNROLL_RAW9(cb, v0, a...) \
    UNROLL_RAW8(cb, v0, ##a)      \
    cb(8, ##a)
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#define UNROLL_RAW10(cb, v0, a...) \
    UNROLL_RAW9(cb, v0, ##a)       \
    cb(9, ##a)
#define UNROLL_RAW11(cb, v0, a...) \
    UNROLL_RAW10(cb, v0, ##a)      \
    cb(10, ##a)
#define UNROLL_RAW12(cb, v0, a...) \
    UNROLL_RAW11(cb, v0, ##a)      \
    cb(11, ##a)
#define UNROLL_RAW13(cb, v0, a...) \
    UNROLL_RAW12(cb, v0, ##a)      \
    cb(12, ##a)
#define UNROLL_RAW14(cb, v0, a...) \
    UNROLL_RAW13(cb, v0, ##a)      \
    cb(13, ##a)
#define UNROLL_RAW15(cb, v0, a...) \
    UNROLL_RAW14(cb, v0, ##a)      \
    cb(14, ##a)

// clang-format off
44 45 46 47
#define UNROLL_RAW16(cb, v0, a...)                                        \
    UNROLL_RAW8(cb, v0, ##a)                                              \
    cb(8, ##a) cb(9, ##a) cb(10, ##a) cb(11, ##a) cb(12, ##a) cb(13, ##a) \
            cb(14, ##a) cb(15, ##a)
48 49 50
#define UNROLL_RAW17(cb, v0, a...) \
    UNROLL_RAW16(cb, v0, ##a)      \
    cb(16, ##a)
51 52 53 54
#define UNROLL_RAW24(cb, v0, a...)                                          \
    UNROLL_RAW16(cb, v0, ##a)                                               \
    cb(16, ##a) cb(17, ##a) cb(18, ##a) cb(19, ##a) cb(20, ##a) cb(21, ##a) \
            cb(22, ##a) cb(23, ##a)
55 56 57 58 59 60 61 62 63
#define UNROLL_RAW25(cb, v0, a...) \
    UNROLL_RAW24(cb, v0, ##a)      \
    cb(24, ##a)
#define UNROLL_RAW49(cb, v0, a...)                                          \
    UNROLL_RAW25(cb, v0, ##a)                                               \
    cb(25, ##a) cb(26, ##a) cb(27, ##a) cb(28, ##a) cb(29, ##a) cb(30, ##a) \
    cb(31, ##a) cb(32, ##a) cb(33, ##a) cb(34, ##a) cb(35, ##a) cb(36, ##a) \
    cb(37, ##a) cb(38, ##a) cb(39, ##a) cb(40, ##a) cb(41, ##a) cb(42, ##a) \
    cb(43, ##a) cb(44, ##a) cb(45, ##a) cb(46, ##a) cb(47, ##a) cb(48, ##a)
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112

#define UNROLL_CALL0(step, cb, v...) UNROLL_RAW##step(cb, 0, ##v)
#define UNROLL_CALL1(step, cb, v...) UNROLL_CALL0(step, cb, ##v)
#define UNROLL_CALL(step, cb, v...)  \
    do {                             \
        UNROLL_CALL1(step, cb, ##v); \
    } while (0)

#define UNROLL_CALL_RAW(step, cb, v...) UNROLL_CALL1(step, cb, ##v);
#define UNROLL_CALL_NOWRAPPER(step, cb) UNROLL_CALL_RAW(step, cb)

#define UNROLL_CALL0(step, cb, v...) UNROLL_RAW##step(cb, 0, ##v)
#define UNROLL_CALL1(step, cb, v...) UNROLL_CALL0(step, cb, ##v)
#define UNROLL_CALL(step, cb, v...)  \
    do {                             \
        UNROLL_CALL1(step, cb, ##v); \
    } while (0)


///////////////////// unroll with 2 dimension //////////////////////
#define UNROLL_RAW_1x1(cb, v0, a...) cb(0, 0, ##a)
#define UNROLL_RAW_2x2(cb, v0, a...) \
    cb(0, 0, ##a) cb(0, 1, ##a) cb(1, 0, ##a) cb(1, 1, ##a)

#define UNROLL_RAW_3x3(cb, v0, a...) \
    cb(0, 0, ##a) cb(0, 1, ##a) cb(0, 2, ##a) \
    cb(1, 0, ##a) cb(1, 1, ##a) cb(1, 2, ##a) \
    cb(2, 0, ##a) cb(2, 1, ##a) cb(2, 2, ##a) \

#define UNROLL_RAW_4x4(cb, v0, a...) \
    cb(0, 0, ##a) cb(0, 1, ##a) cb(0, 2, ##a) cb(0, 3, ##a) \
    cb(1, 0, ##a) cb(1, 1, ##a) cb(1, 2, ##a) cb(1, 3, ##a) \
    cb(2, 0, ##a) cb(2, 1, ##a) cb(2, 2, ##a) cb(2, 3, ##a) \
    cb(3, 0, ##a) cb(3, 1, ##a) cb(3, 2, ##a) cb(3, 3, ##a)

#define UNROLL_RAW_6x6(cb, v0, a...) \
    cb(0, 0, ##a) cb(0, 1, ##a) cb(0, 2, ##a) cb(0, 3, ##a) \
    cb(0, 4, ##a) cb(0, 5, ##a)                             \
    cb(1, 0, ##a) cb(1, 1, ##a) cb(1, 2, ##a) cb(1, 3, ##a) \
    cb(1, 4, ##a) cb(1, 5, ##a)                             \
    cb(2, 0, ##a) cb(2, 1, ##a) cb(2, 2, ##a) cb(2, 3, ##a) \
    cb(2, 4, ##a) cb(2, 5, ##a)                             \
    cb(3, 0, ##a) cb(3, 1, ##a) cb(3, 2, ##a) cb(3, 3, ##a) \
    cb(3, 4, ##a) cb(3, 5, ##a)                             \
    cb(4, 0, ##a) cb(4, 1, ##a) cb(4, 2, ##a) cb(4, 3, ##a) \
    cb(4, 4, ##a) cb(4, 5, ##a)                             \
    cb(5, 0, ##a) cb(5, 1, ##a) cb(5, 2, ##a) cb(5, 3, ##a) \
    cb(5, 4, ##a) cb(5, 5, ##a)                             \

113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
#define UNROLL_RAW_7x7(cb, v0, a...) \
    cb(0, 0, ##a) cb(0, 1, ##a) cb(0, 2, ##a) cb(0, 3, ##a) \
    cb(0, 4, ##a) cb(0, 5, ##a) cb(0, 6, ##a)               \
    cb(1, 0, ##a) cb(1, 1, ##a) cb(1, 2, ##a) cb(1, 3, ##a) \
    cb(1, 4, ##a) cb(1, 5, ##a) cb(1, 6, ##a)               \
    cb(2, 0, ##a) cb(2, 1, ##a) cb(2, 2, ##a) cb(2, 3, ##a) \
    cb(2, 4, ##a) cb(2, 5, ##a) cb(2, 6, ##a)               \
    cb(3, 0, ##a) cb(3, 1, ##a) cb(3, 2, ##a) cb(3, 3, ##a) \
    cb(3, 4, ##a) cb(3, 5, ##a) cb(3, 6, ##a)               \
    cb(4, 0, ##a) cb(4, 1, ##a) cb(4, 2, ##a) cb(4, 3, ##a) \
    cb(4, 4, ##a) cb(4, 5, ##a) cb(4, 6, ##a)               \
    cb(5, 0, ##a) cb(5, 1, ##a) cb(5, 2, ##a) cb(5, 3, ##a) \
    cb(5, 4, ##a) cb(5, 5, ##a) cb(5, 6, ##a)               \
    cb(6, 0, ##a) cb(6, 1, ##a) cb(6, 2, ##a) cb(6, 3, ##a) \
    cb(6, 4, ##a) cb(6, 5, ##a) cb(6, 6, ##a)               \


130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
#define UNROLL_RAW_8x8(cb, v0, a...) \
    cb(0, 0, ##a) cb(0, 1, ##a) cb(0, 2, ##a) cb(0, 3, ##a) \
    cb(0, 4, ##a) cb(0, 5, ##a) cb(0, 6, ##a) cb(0, 7, ##a) \
    cb(1, 0, ##a) cb(1, 1, ##a) cb(1, 2, ##a) cb(1, 3, ##a) \
    cb(1, 4, ##a) cb(1, 5, ##a) cb(1, 6, ##a) cb(1, 7, ##a) \
    cb(2, 0, ##a) cb(2, 1, ##a) cb(2, 2, ##a) cb(2, 3, ##a) \
    cb(2, 4, ##a) cb(2, 5, ##a) cb(2, 6, ##a) cb(2, 7, ##a) \
    cb(3, 0, ##a) cb(3, 1, ##a) cb(3, 2, ##a) cb(3, 3, ##a) \
    cb(3, 4, ##a) cb(3, 5, ##a) cb(3, 6, ##a) cb(3, 7, ##a) \
    cb(4, 0, ##a) cb(4, 1, ##a) cb(4, 2, ##a) cb(4, 3, ##a) \
    cb(4, 4, ##a) cb(4, 5, ##a) cb(4, 6, ##a) cb(4, 7, ##a) \
    cb(5, 0, ##a) cb(5, 1, ##a) cb(5, 2, ##a) cb(5, 3, ##a) \
    cb(5, 4, ##a) cb(5, 5, ##a) cb(5, 6, ##a) cb(5, 7, ##a) \
    cb(6, 0, ##a) cb(6, 1, ##a) cb(6, 2, ##a) cb(6, 3, ##a) \
    cb(6, 4, ##a) cb(6, 5, ##a) cb(6, 6, ##a) cb(6, 7, ##a) \
    cb(7, 0, ##a) cb(7, 1, ##a) cb(7, 2, ##a) cb(7, 3, ##a) \
    cb(7, 4, ##a) cb(7, 5, ##a) cb(7, 6, ##a) cb(7, 7, ##a)

148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
#define UNROLL_RAW_9x9(cb, v0, a...) \
    cb(0, 0, ##a) cb(0, 1, ##a) cb(0, 2, ##a) cb(0, 3, ##a)               \
    cb(0, 4, ##a) cb(0, 5, ##a) cb(0, 6, ##a) cb(0, 7, ##a) cb(0, 8, ##a) \
    cb(1, 0, ##a) cb(1, 1, ##a) cb(1, 2, ##a) cb(1, 3, ##a)               \
    cb(1, 4, ##a) cb(1, 5, ##a) cb(1, 6, ##a) cb(1, 7, ##a) cb(1, 8, ##a) \
    cb(2, 0, ##a) cb(2, 1, ##a) cb(2, 2, ##a) cb(2, 3, ##a)               \
    cb(2, 4, ##a) cb(2, 5, ##a) cb(2, 6, ##a) cb(2, 7, ##a) cb(2, 8, ##a) \
    cb(3, 0, ##a) cb(3, 1, ##a) cb(3, 2, ##a) cb(3, 3, ##a)               \
    cb(3, 4, ##a) cb(3, 5, ##a) cb(3, 6, ##a) cb(3, 7, ##a) cb(3, 8, ##a) \
    cb(4, 0, ##a) cb(4, 1, ##a) cb(4, 2, ##a) cb(4, 3, ##a)               \
    cb(4, 4, ##a) cb(4, 5, ##a) cb(4, 6, ##a) cb(4, 7, ##a) cb(4, 8, ##a) \
    cb(5, 0, ##a) cb(5, 1, ##a) cb(5, 2, ##a) cb(5, 3, ##a)               \
    cb(5, 4, ##a) cb(5, 5, ##a) cb(5, 6, ##a) cb(5, 7, ##a) cb(5, 8, ##a) \
    cb(6, 0, ##a) cb(6, 1, ##a) cb(6, 2, ##a) cb(6, 3, ##a)               \
    cb(6, 4, ##a) cb(6, 5, ##a) cb(6, 6, ##a) cb(6, 7, ##a) cb(6, 8, ##a) \
    cb(7, 0, ##a) cb(7, 1, ##a) cb(7, 2, ##a) cb(7, 3, ##a)               \
    cb(7, 4, ##a) cb(7, 5, ##a) cb(7, 6, ##a) cb(7, 7, ##a) cb(7, 8, ##a) \
    cb(8, 0, ##a) cb(8, 1, ##a) cb(8, 2, ##a) cb(8, 3, ##a)               \
    cb(8, 4, ##a) cb(8, 5, ##a) cb(8, 6, ##a) cb(8, 7, ##a) cb(8, 8, ##a)

168 169 170 171 172 173 174 175 176 177 178 179
#define UNROLL_RAW_4x2(cb, v0, a...)                        \
    cb(0, 0, ##a) cb(0, 1, ##a) cb(1, 0, ##a) cb(1, 1, ##a) \
    cb(2, 0, ##a) cb(2, 1, ##a) cb(3, 0, ##a) cb(3, 1, ##a)

#define UNROLL_RAW_5x2(cb, v0, a...) \
    UNROLL_RAW_4x2(cb, v0, ##a)      \
    cb(4, 0, ##a) cb(4, 1, ##a)

#define UNROLL_RAW_6x2(cb, v0, a...) \
    UNROLL_RAW_5x2(cb, v0, ##a)      \
    cb(5, 0, ##a) cb(5, 1, ##a)

180 181 182 183 184 185 186 187 188 189 190 191 192 193
#define UNROLL_CALL0_D2(step, step2, cb, v...) \
    UNROLL_RAW_##step##x##step2(cb, 0, ##v)
#define UNROLL_CALL1_D2(step, step2, cb, v...) \
    UNROLL_CALL0_D2(step, step2, cb, ##v)
#define UNROLL_CALL_D2(step, step2, cb, v...)  \
    do {                                       \
        UNROLL_CALL1_D2(step, step2, cb, ##v); \
    } while (0)

#define UNROLL_CALL_RAW_D2(step, step2, cb, v...) \
    UNROLL_CALL1_D2(step, step2, cb, ##v);
#define UNROLL_CALL_NOWRAPPER_D2(step, step2, cb) \
    UNROLL_CALL_RAW_D2(step, step2, cb)

194 195
// clang-format on

196
// vim: syntax=cpp.doxygen