blob: cb2f4b0319770c828ed28b2e802751b9f8e78f45 [file] [log] [blame]
Vidhya Sudhan Loganathan17b0f8b2019-01-08 12:17:03 +00001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2019-2020 Arm Limited.
Vidhya Sudhan Loganathan17b0f8b2019-01-08 12:17:03 +00003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#ifndef ARM_COMPUTE_REPEAT_H
25#define ARM_COMPUTE_REPEAT_H
26
Michele Di Giorgiob54ba282020-01-14 15:31:55 +000027#include "helpers.h"
28
Vidhya Sudhan Loganathan17b0f8b2019-01-08 12:17:03 +000029/** Macros that help in loop unrolling */
30//Repeat macros with 3 param, excluding the implicit ID param
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)
77
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +010078#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
Vidhya Sudhan Loganathan17b0f8b2019-01-08 12:17:03 +000081#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)
82
Michele Di Giorgiob54ba282020-01-14 15:31:55 +000083// Repeat macros with 4 param, excluding the implicit ID param
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)
130
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100131#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
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000134#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)
135
136// Macro for initializing N variables. Generates N statements that defines VAR##N = RHS_ACCESSOR_DEF(...)
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100137#define VAR_INIT_TO_CONST_DEF(ID, TYPE, VAR, VAL) TYPE VAR##ID = VAL
Vidhya Sudhan Loganathan17b0f8b2019-01-08 12:17:03 +0000138#define REPEAT_VAR_INIT_TO_CONST(N, TYPE, VAR, VAL) REPEAT_3_N(N, VAR_INIT_TO_CONST, TYPE, VAR, VAL)
139
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000140// Macro for initializing N variables by converting the data type. Generates N statements that defines VAR##N = RHS_ACCESSOR_DEF(...)
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100141#define VAR_INIT_CONVERT_DEF(ID, TYPE_OUT, VAR_IN, VAR_OUT) TYPE_OUT VAR_OUT##ID = CONVERT(VAR_IN##ID, TYPE_OUT)
Michele Di Giorgio27d92fd2020-10-27 12:44:17 +0000142#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)
143
144// Macro for initializing N variables by converting the data type with saturation. Generates N statements that defines VAR##N = RHS_ACCESSOR_DEF(...)
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000145#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)
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100146#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)
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000148
149// Macro for adding a constant to N variables. Generates N statements that defines VAR##N =RHS_ACCESSOR_DEF(...)
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100150#define ADD_CONST_TO_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID += (TYPE)VAL
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000151#define REPEAT_ADD_CONST_TO_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, ADD_CONST_TO_VAR, TYPE, VAR, VAL)
152
153// Macro for multiplying N variables (VAR_B) by a constant (VAL) and adding to other N variables (VAR_A). Generates N statements that defines VAR_A##N =RHS_ACCESSOR_DEF(...)
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100154#define MLA_VAR_WITH_CONST_VEC_DEF(ID, VAR_A, VAR_B, VAL) VAR_A##ID += VAR_B##ID * VAL
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000155#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)
156
157// Macro for adding a vector to N-variables. Generates N statements that defines VAR##N =RHS_ACCESSOR_DEF(...)
158#define ADD_VECTOR_TO_VAR_DEF(ID, TYPE, VAR, VEC) VAR##ID += VEC
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100159#define REPEAT_ADD_VECTOR_TO_VAR(N, VAR, VEC) REPEAT_3_N(N, ADD_VECTOR_TO_VAR, "", VAR, VEC)
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000160
161// Macro for adding a two N-variables. Generates N statements that defines VAR##N =RHS_ACCESSOR_DEF(...)
162#define ADD_TWO_VARS_DEF(ID, TYPE, VAR_A, VAR_B) VAR_A##ID += VAR_B##ID
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100163#define REPEAT_ADD_TWO_VARS(N, VAR_A, VAR_B) REPEAT_3_N(N, ADD_TWO_VARS, "", VAR_A, VAR_B)
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000164
165// Macro for performing Max between a constant and N variables. Generates N statements that defines VAR##N =RHS_ACCESSOR_DEF(...)
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100166#define MAX_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = max(VAR##ID, (TYPE)VAL)
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000167#define REPEAT_MAX_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MAX_CONST_VAR, TYPE, VAR, VAL)
168
169// Macro for performing Min between a constant and N variables. Generates N statements that defines VAR##N =RHS_ACCESSOR_DEF(...)
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100170#define MIN_CONST_VAR_DEF(ID, TYPE, VAR, VAL) VAR##ID = min(VAR##ID, (TYPE)VAL)
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000171#define REPEAT_MIN_CONST_VAR(N, TYPE, VAR, VAL) REPEAT_3_N(N, MIN_CONST_VAR, TYPE, VAR, VAL)
172
173// Macro for performing ASYMM_MULT_BY_QUANT_MULTIPLIER_GREATER_THAN_ONE to N variables. Generates N statements that defines VAR##N =RHS_ACCESSOR_DEF(...)
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100174#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)
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000178
179// Macro for performing ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE to N variables. Generates N statements that defines VAR##N =RHS_ACCESSOR_DEF(...)
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100180#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)
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000184
185// Macro for performing per-channel ASYMM_MULT_BY_QUANT_MULTIPLIER to N variables.
186#define ASYMM_MULT_BY_QUANT_MULTIPLIER_PER_CHANNEL_DEF(ID, SIZE, VAR, RES_MUL, RES_SHIFT) \
187 ({ \
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); \
193 })
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +0100194#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)
Michele Di Giorgiob54ba282020-01-14 15:31:55 +0000196
Vidhya Sudhan Loganathan17b0f8b2019-01-08 12:17:03 +0000197#endif // ARM_COMPUTE_REPEAT_H