/projects/A++Preprocessor2003/transformationMacros.h
https://bitbucket.org/bathtub/rose · C Header · 255 lines · 135 code · 73 blank · 47 comment · 0 complexity · 3e3e1d1437b2f2318796c9c955e00488 MD5 · raw file
- // build include guards
- #ifndef APP_TRANSFORMATION_MACROS_HEADER_FILE
- #define APP_TRANSFORMATION_MACROS_HEADER_FILE
- // This file contains the subscript computations required for A++/P++ array transformations
- #include "transformationSubscriptMacros.h"
- // Macros that support the declaration and initialization of specific variables used in different
- // ways within transformations
- #include "transformationMacro-length.h"
- #include "transformationMacro-size.h"
- #include "transformationMacro-stride.h"
- #ifdef ROSE_MACROS_APPEAR_AS_FUNCTIONS
- // error "USE_ROSE is defined!"
- #if 0
- #define ARRAY_OPERAND_TRANSFORMATION_DATA(T) \
- void VARIABLE_DECLARATIONS_UNIFORM_SIZE_STRIDE_ONE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_UNIFORM_SIZE_STRIDE_ONE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_UNIFORM_SIZE_UNIFORM_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_UNIFORM_SIZE_UNIFORM_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_UNIFORM_SIZE_VARIABLE_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_UNIFORM_SIZE_VARIABLE_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_VARIABLE_SIZE_STRIDE_ONE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_VARIABLE_SIZE_STRIDE_ONE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_VARIABLE_SIZE_UNIFORM_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_VARIABLE_SIZE_UNIFORM_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_VARIABLE_SIZE_VARIABLE_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_DECLARATIONS_VARIABLE_SIZE_VARIABLE_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_UNIFORM_SIZE_STRIDE_ONE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_UNIFORM_SIZE_STRIDE_ONE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_UNIFORM_SIZE_UNIFORM_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_UNIFORM_SIZE_UNIFORM_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_UNIFORM_SIZE_VARIABLE_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_UNIFORM_SIZE_VARIABLE_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_VARIABLE_SIZE_STRIDE_ONE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_VARIABLE_SIZE_STRIDE_ONE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_VARIABLE_SIZE_UNIFORM_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_VARIABLE_SIZE_UNIFORM_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_VARIABLE_SIZE_VARIABLE_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
- void VARIABLE_INITIALIZATION_VARIABLE_SIZE_VARIABLE_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y);
- // Declare functions for all different A++/P++ types
- ARRAY_OPERAND_TRANSFORMATION_DATA(int)
- ARRAY_OPERAND_TRANSFORMATION_DATA(float)
- ARRAY_OPERAND_TRANSFORMATION_DATA(double)
- #endif
- #else
- //error "USE_ROSE is NOT defined!"
- // We have to handle several cases (and we have to have dimension specific versions of each case):
- // 1) Uniform Size
- // a) Stride == 1
- // b) Uniform Stride
- // c) Variable Stride
- // 2) Variable Size
- // a) Stride == 1
- // b) Uniform Stride
- // c) Variable Stride
- // ###################################################################
- // UNIFORM SIZE
- // ###################################################################
- // include "transformationMacro-uniform_size.h"
- // ###################################################################
- // VARIABLE SIZE
- // ###################################################################
- // include "transformationMacro-variable_size.h"
- // ###################################################################
- // MACRO INTERFACE
- // ###################################################################
- // ########## UNIFORM SIZE ##########
- // ########## unit stride ##########
- // These macros are the ones called by the transformations generated by the a++ preprocessor (generated by ROSE)
- #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_STRIDE_ONE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_UNIFORM_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_STRIDE_ONE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_STRIDE_ONE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_UNIFORM_SIZE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_STRIDE_ONE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
- // ########## uniform stride ##########
- #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_UNIFORM_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_UNIFORM_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_UNIFORM_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_UNIFORM_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_UNIFORM_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_UNIFORM_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
- // ########## variable stride ##########
- #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_VARIABLE_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_UNIFORM_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_STRIDE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_VARIABLE_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_STRIDE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_VARIABLE_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_VARIABLE_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- // ########## VARIABLE SIZE ##########
- // ########## unit stride ##########
- #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_STRIDE_ONE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_STRIDE_ONE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_SIZE_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_STRIDE_ONE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_STRIDE_ONE_INITIALIZATION_MACRO_D## DIMENSION()
- #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_STRIDE_ONE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_SIZE_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- // ########## uniform stride ##########
- #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_UNIFORM_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_UNIFORM_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_UNIFORM_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_UNIFORM_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_UNIFORM_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
- // ########## variable stride ##########
- #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_VARIABLE_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_STRIDE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_VARIABLE_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_STRIDE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_VARIABLE_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_SIZE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
- ARRAY_OPERAND_VARIABLE_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_VARIABLE_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
- #endif
- // Used for both internally generated intermediate code and final generated code
- // (since the loop nests must have there variables defined so that the intermediate
- // code can compile).
- #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D1() \
- int _length1 = 0;
- #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D2() \
- int _length1 = 0, _length2 = 0;
- #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D3() \
- int _length1 = 0,_length2 = 0,_length3 = 0;
- #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D4() \
- int _length1 = 0,_length2 = 0,_length3 = 0,_length4 = 0;
- #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D5() \
- int _length1 = 0,_length2 = 0,_length3 = 0,_length4 = 0,_length5 = 0;
- #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D6() \
- int _length1 = 0,_length2 = 0,_length3 = 0,_length4 = 0,_length5 = 0,_length6 = 0;
- // These macros define the loop variables which are required to be seen
- // when we compile both the loop nest to build the AST fragment and the
- // final application code.
- #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D1() \
- int _1; \
- ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D1()
- #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D2() \
- int _1,_2; \
- ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D2()
- #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D3() \
- int _1,_2,_3; \
- ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D3()
- #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D4() \
- int _1,_2,_3,_4; \
- ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D4()
- #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D5() \
- int _1,_2,_3,_4,_5; \
- ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D5()
- #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D6() \
- int _1,_2,_3,_4,_5,_6; \
- ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D6()
- // The case of uniform stride (across all operands) is optimized in the
- // generated loop nest to increment by a fixed stride (across all operands)
- // This requires the support of a macro that declares the stride# variables
- // so that the generated loop nest can be compiled to form the AST fragment.
- #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D1() \
- LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D1() \
- ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D1()
- #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D2() \
- LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D2() \
- ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D2()
- #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D3() \
- LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D3() \
- ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D3()
- #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D4() \
- LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D4() \
- ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D4()
- #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D5() \
- LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D5() \
- ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D5()
- #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D6() \
- LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D6() \
- ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D6()
- // endif for APP_TRANSFORMATION_MACROS_HEADER_FILE (include guard)
- #endif