23.11
|
Go to the documentation of this file.
24 #ifndef ARM_COMPUTE_REPEAT_H
25 #define ARM_COMPUTE_REPEAT_H
31 #define REPEAT_3_1(P_X, P_A, P_B, P_C) P_X##_DEF(0, P_A, P_B, P_C)
32 #define REPEAT_3_2(P_X, P_A, P_B, P_C) \
33 P_X##_DEF(1, P_A, P_B, P_C); \
34 REPEAT_3_1(P_X, P_A, P_B, P_C)
35 #define REPEAT_3_3(P_X, P_A, P_B, P_C) \
36 P_X##_DEF(2, P_A, P_B, P_C); \
37 REPEAT_3_2(P_X, P_A, P_B, P_C)
38 #define REPEAT_3_4(P_X, P_A, P_B, P_C) \
39 P_X##_DEF(3, P_A, P_B, P_C); \
40 REPEAT_3_3(P_X, P_A, P_B, P_C)
41 #define REPEAT_3_5(P_X, P_A, P_B, P_C) \
42 P_X##_DEF(4, P_A, P_B, P_C); \
43 REPEAT_3_4(P_X, P_A, P_B, P_C)
44 #define REPEAT_3_6(P_X, P_A, P_B, P_C) \
45 P_X##_DEF(5, P_A, P_B, P_C); \
46 REPEAT_3_5(P_X, P_A, P_B, P_C)
47 #define REPEAT_3_7(P_X, P_A, P_B, P_C) \
48 P_X##_DEF(6, P_A, P_B, P_C); \
49 REPEAT_3_6(P_X, P_A, P_B, P_C)
50 #define REPEAT_3_8(P_X, P_A, P_B, P_C) \
51 P_X##_DEF(7, P_A, P_B, P_C); \
52 REPEAT_3_7(P_X, P_A, P_B, P_C)
53 #define REPEAT_3_9(P_X, P_A, P_B, P_C) \
54 P_X##_DEF(8, P_A, P_B, P_C); \
55 REPEAT_3_8(P_X, P_A, P_B, P_C)
56 #define REPEAT_3_10(P_X, P_A, P_B, P_C) \
57 P_X##_DEF(9, P_A, P_B, P_C); \
58 REPEAT_3_9(P_X, P_A, P_B, P_C)
59 #define REPEAT_3_11(P_X, P_A, P_B, P_C) \
60 P_X##_DEF(A, P_A, P_B, P_C); \
61 REPEAT_3_10(P_X, P_A, P_B, P_C)
62 #define REPEAT_3_12(P_X, P_A, P_B, P_C) \
63 P_X##_DEF(B, P_A, P_B, P_C); \
64 REPEAT_3_11(P_X, P_A, P_B, P_C)
65 #define REPEAT_3_13(P_X, P_A, P_B, P_C) \
66 P_X##_DEF(C, P_A, P_B, P_C); \
67 REPEAT_3_12(P_X, P_A, P_B, P_C)
68 #define REPEAT_3_14(P_X, P_A, P_B, P_C) \
69 P_X##_DEF(D, P_A, P_B, P_C); \
70 REPEAT_3_13(P_X, P_A, P_B, P_C)
71 #define REPEAT_3_15(P_X, P_A, P_B, P_C) \
72 P_X##_DEF(E, P_A, P_B, P_C); \
73 REPEAT_3_14(P_X, P_A, P_B, P_C)
74 #define REPEAT_3_16(P_X, P_A, P_B, P_C) \
75 P_X##_DEF(F, P_A, P_B, P_C); \
76 REPEAT_3_15(P_X, P_A, P_B, P_C)
78 #define REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C) \
79 REPEAT_3_##P_NUM(P_OP, P_A, P_B, \
80 P_C) //One level of indirection to ensure order of expansion does not affect preprocessing P_NUM
81 #define REPEAT_3_N(P_NUM, P_OP, P_A, P_B, P_C) REPEAT_DEF_3_N(P_NUM, P_OP, P_A, P_B, P_C)
84 #define REPEAT_4_1(P_X, P_A, P_B, P_C, P_D) P_X##_DEF(0, P_A, P_B, P_C, P_D)
85 #define REPEAT_4_2(P_X, P_A, P_B, P_C, P_D) \
86 P_X##_DEF(1, P_A, P_B, P_C, P_D); \
87 REPEAT_4_1(P_X, P_A, P_B, P_C, P_D)
88 #define REPEAT_4_3(P_X, P_A, P_B, P_C, P_D) \
89 P_X##_DEF(2, P_A, P_B, P_C, P_D); \
90 REPEAT_4_2(P_X, P_A, P_B, P_C, P_D)
91 #define REPEAT_4_4(P_X, P_A, P_B, P_C, P_D) \
92 P_X##_DEF(3, P_A, P_B, P_C, P_D); \
93 REPEAT_4_3(P_X, P_A, P_B, P_C, P_D)
94 #define REPEAT_4_5(P_X, P_A, P_B, P_C, P_D) \
95 P_X##_DEF(4, P_A, P_B, P_C, P_D); \
96 REPEAT_4_4(P_X, P_A, P_B, P_C, P_D)
97 #define REPEAT_4_6(P_X, P_A, P_B, P_C, P_D) \
98 P_X##_DEF(5, P_A, P_B, P_C, P_D); \
99 REPEAT_4_5(P_X, P_A, P_B, P_C, P_D)
100 #define REPEAT_4_7(P_X, P_A, P_B, P_C, P_D) \
101 P_X##_DEF(6, P_A, P_B, P_C, P_D); \
102 REPEAT_4_6(P_X, P_A, P_B, P_C, P_D)
103 #define REPEAT_4_8(P_X, P_A, P_B, P_C, P_D) \
104 P_X##_DEF(7, P_A, P_B, P_C, P_D); \
105 REPEAT_4_7(P_X, P_A, P_B, P_C, P_D)
106 #define REPEAT_4_9(P_X, P_A, P_B, P_C, P_D) \
107 P_X##_DEF(8, P_A, P_B, P_C, P_D); \
108 REPEAT_4_8(P_X, P_A, P_B, P_C, P_D)
109 #define REPEAT_4_10(P_X, P_A, P_B, P_C, P_D) \
110 P_X##_DEF(9, P_A, P_B, P_C, P_D); \
111 REPEAT_4_9(P_X, P_A, P_B, P_C, P_D)
112 #define REPEAT_4_11(P_X, P_A, P_B, P_C, P_D) \
113 P_X##_DEF(A, P_A, P_B, P_C, P_D); \
114 REPEAT_4_10(P_X, P_A, P_B, P_C, P_D)
115 #define REPEAT_4_12(P_X, P_A, P_B, P_C, P_D) \
116 P_X##_DEF(B, P_A, P_B, P_C, P_D); \
117 REPEAT_4_11(P_X, P_A, P_B, P_C, P_D)
118 #define REPEAT_4_13(P_X, P_A, P_B, P_C, P_D) \
119 P_X##_DEF(C, P_A, P_B, P_C, P_D); \
120 REPEAT_4_12(P_X, P_A, P_B, P_C, P_D)
121 #define REPEAT_4_14(P_X, P_A, P_B, P_C, P_D) \
122 P_X##_DEF(D, P_A, P_B, P_C, P_D); \
123 REPEAT_4_13(P_X, P_A, P_B, P_C, P_D)
124 #define REPEAT_4_15(P_X, P_A, P_B, P_C, P_D) \
125 P_X##_DEF(E, P_A, P_B, P_C, P_D); \
126 REPEAT_4_14(P_X, P_A, P_B, P_C, P_D)
127 #define REPEAT_4_16(P_X, P_A, P_B, P_C, P_D) \
128 P_X##_DEF(F, P_A, P_B, P_C, P_D); \
129 REPEAT_4_15(P_X, P_A, P_B, P_C, P_D)
131 #define REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) \
132 REPEAT_4_##P_NUM(P_OP, P_A, P_B, P_C, \
133 P_D) //One level of indirection to ensure order of expansion does not affect preprocessing P_NUM
134 #define REPEAT_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D) REPEAT_DEF_4_N(P_NUM, P_OP, P_A, P_B, P_C, P_D)
137 #define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL
138 #define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL)
141 #define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT)
142 #define REPEAT_VAR_INIT_CONVERT(N, TYPE_OUT, VAR_IN, VAR_OUT) REPEAT_3_N(N, VAR_INIT_CONVERT, TYPE_OUT, VAR_IN, VAR_OUT)
145 #define VAR_INIT_CONVERT_SAT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT_SAT(VAR_IN##ID, TYPE_OUT)
146 #define REPEAT_VAR_INIT_CONVERT_SAT(N, TYPE_OUT, VAR_IN, VAR_OUT) \
147 REPEAT_3_N(N, VAR_INIT_CONVERT_SAT, TYPE_OUT, VAR_IN, VAR_OUT)
150 #define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL
151 #define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL)
154 #define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL
155 #define REPEAT_MLA_VAR_WITH_CONST_VEC(N, VAR_A, VAR_B, VAL) REPEAT_3_N(N, MLA_VAR_WITH_CONST_VEC, VAR_A, VAR_B, VAL)
158 #define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC
159 #define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC)
162 #define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID
163 #define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B)
166 #define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL)
167 #define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL)
170 #define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL)
171 #define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL)
174 #define ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \
175 VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE)
176 #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) \
177 REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT)
180 #define ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \
181 VAR##ID = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, SIZE)
182 #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(N, SIZE, VAR, RES_MUL, RES_SHIFT) \
183 REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE, SIZE, VAR, RES_MUL, RES_SHIFT)
186 #define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \
188 VEC_DATA_TYPE(int, N0) \
189 VAR##ID_shift_lt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \
190 VEC_DATA_TYPE(int, N0) \
191 VAR##ID_shift_gt0 = ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(VAR##ID, RES_MUL, RES_SHIFT, N0); \
192 VAR##ID = select(VAR##ID_shift_lt0, VAR##ID_shift_gt0, RES_SHIFT >= 0); \
194 #define REPEAT_ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL(N, SIZE, VAR, RES_MUL, RES_SHIFT) \
195 REPEAT_4_N(N, ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL, SIZE, VAR, RES_MUL, RES_SHIFT)
197 #endif // ARM_COMPUTE_REPEAT_H