/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

  1. // build include guards
  2. #ifndef APP_TRANSFORMATION_MACROS_HEADER_FILE
  3. #define APP_TRANSFORMATION_MACROS_HEADER_FILE
  4. // This file contains the subscript computations required for A++/P++ array transformations
  5. #include "transformationSubscriptMacros.h"
  6. // Macros that support the declaration and initialization of specific variables used in different
  7. // ways within transformations
  8. #include "transformationMacro-length.h"
  9. #include "transformationMacro-size.h"
  10. #include "transformationMacro-stride.h"
  11. #ifdef ROSE_MACROS_APPEAR_AS_FUNCTIONS
  12. // error "USE_ROSE is defined!"
  13. #if 0
  14. #define ARRAY_OPERAND_TRANSFORMATION_DATA(T) \
  15. void VARIABLE_DECLARATIONS_UNIFORM_SIZE_STRIDE_ONE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  16. void VARIABLE_DECLARATIONS_UNIFORM_SIZE_STRIDE_ONE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  17. void VARIABLE_DECLARATIONS_UNIFORM_SIZE_UNIFORM_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  18. void VARIABLE_DECLARATIONS_UNIFORM_SIZE_UNIFORM_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  19. void VARIABLE_DECLARATIONS_UNIFORM_SIZE_VARIABLE_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  20. void VARIABLE_DECLARATIONS_UNIFORM_SIZE_VARIABLE_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  21. void VARIABLE_DECLARATIONS_VARIABLE_SIZE_STRIDE_ONE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  22. void VARIABLE_DECLARATIONS_VARIABLE_SIZE_STRIDE_ONE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  23. void VARIABLE_DECLARATIONS_VARIABLE_SIZE_UNIFORM_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  24. void VARIABLE_DECLARATIONS_VARIABLE_SIZE_UNIFORM_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  25. void VARIABLE_DECLARATIONS_VARIABLE_SIZE_VARIABLE_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  26. void VARIABLE_DECLARATIONS_VARIABLE_SIZE_VARIABLE_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  27. void VARIABLE_INITIALIZATION_UNIFORM_SIZE_STRIDE_ONE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  28. void VARIABLE_INITIALIZATION_UNIFORM_SIZE_STRIDE_ONE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  29. void VARIABLE_INITIALIZATION_UNIFORM_SIZE_UNIFORM_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  30. void VARIABLE_INITIALIZATION_UNIFORM_SIZE_UNIFORM_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  31. void VARIABLE_INITIALIZATION_UNIFORM_SIZE_VARIABLE_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  32. void VARIABLE_INITIALIZATION_UNIFORM_SIZE_VARIABLE_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  33. void VARIABLE_INITIALIZATION_VARIABLE_SIZE_STRIDE_ONE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  34. void VARIABLE_INITIALIZATION_VARIABLE_SIZE_STRIDE_ONE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  35. void VARIABLE_INITIALIZATION_VARIABLE_SIZE_UNIFORM_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  36. void VARIABLE_INITIALIZATION_VARIABLE_SIZE_UNIFORM_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y); \
  37. void VARIABLE_INITIALIZATION_VARIABLE_SIZE_VARIABLE_STRIDE_LHS_MACRO (int dim, T ##Array & X, int Y); \
  38. void VARIABLE_INITIALIZATION_VARIABLE_SIZE_VARIABLE_STRIDE_RHS_MACRO (int dim, T ##Array & X, int Y);
  39. // Declare functions for all different A++/P++ types
  40. ARRAY_OPERAND_TRANSFORMATION_DATA(int)
  41. ARRAY_OPERAND_TRANSFORMATION_DATA(float)
  42. ARRAY_OPERAND_TRANSFORMATION_DATA(double)
  43. #endif
  44. #else
  45. //error "USE_ROSE is NOT defined!"
  46. // We have to handle several cases (and we have to have dimension specific versions of each case):
  47. // 1) Uniform Size
  48. // a) Stride == 1
  49. // b) Uniform Stride
  50. // c) Variable Stride
  51. // 2) Variable Size
  52. // a) Stride == 1
  53. // b) Uniform Stride
  54. // c) Variable Stride
  55. // ###################################################################
  56. // UNIFORM SIZE
  57. // ###################################################################
  58. // include "transformationMacro-uniform_size.h"
  59. // ###################################################################
  60. // VARIABLE SIZE
  61. // ###################################################################
  62. // include "transformationMacro-variable_size.h"
  63. // ###################################################################
  64. // MACRO INTERFACE
  65. // ###################################################################
  66. // ########## UNIFORM SIZE ##########
  67. // ########## unit stride ##########
  68. // These macros are the ones called by the transformations generated by the a++ preprocessor (generated by ROSE)
  69. #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_STRIDE_ONE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  70. ARRAY_OPERAND_UNIFORM_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  71. #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_STRIDE_ONE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
  72. #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_STRIDE_ONE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  73. ARRAY_OPERAND_UNIFORM_SIZE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  74. #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_STRIDE_ONE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
  75. // ########## uniform stride ##########
  76. #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_UNIFORM_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  77. ARRAY_OPERAND_UNIFORM_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  78. ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  79. #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_UNIFORM_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
  80. #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_UNIFORM_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  81. ARRAY_OPERAND_VARIABLE_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  82. ARRAY_OPERAND_UNIFORM_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  83. #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_UNIFORM_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
  84. // ########## variable stride ##########
  85. #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_VARIABLE_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  86. ARRAY_OPERAND_UNIFORM_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  87. ARRAY_OPERAND_VARIABLE_STRIDE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  88. #define VARIABLE_DECLARATIONS_UNIFORM_SIZE_VARIABLE_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  89. ARRAY_OPERAND_VARIABLE_STRIDE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  90. #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_VARIABLE_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  91. ARRAY_OPERAND_VARIABLE_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  92. #define VARIABLE_INITIALIZATION_UNIFORM_SIZE_VARIABLE_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  93. ARRAY_OPERAND_VARIABLE_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  94. // ########## VARIABLE SIZE ##########
  95. // ########## unit stride ##########
  96. #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_STRIDE_ONE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  97. ARRAY_OPERAND_VARIABLE_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  98. #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_STRIDE_ONE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  99. ARRAY_OPERAND_VARIABLE_SIZE_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  100. #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_STRIDE_ONE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  101. ARRAY_OPERAND_STRIDE_ONE_INITIALIZATION_MACRO_D## DIMENSION()
  102. #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_STRIDE_ONE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  103. ARRAY_OPERAND_VARIABLE_SIZE_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  104. // ########## uniform stride ##########
  105. #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_UNIFORM_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  106. ARRAY_OPERAND_VARIABLE_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  107. #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_UNIFORM_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
  108. #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_UNIFORM_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  109. ARRAY_OPERAND_UNIFORM_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  110. #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_UNIFORM_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
  111. // ########## variable stride ##########
  112. #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_VARIABLE_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  113. ARRAY_OPERAND_VARIABLE_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  114. ARRAY_OPERAND_VARIABLE_STRIDE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  115. #define VARIABLE_DECLARATIONS_VARIABLE_SIZE_VARIABLE_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  116. ARRAY_OPERAND_VARIABLE_SIZE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  117. ARRAY_OPERAND_VARIABLE_STRIDE_DECLARATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  118. #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_VARIABLE_STRIDE_LHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  119. ARRAY_OPERAND_VARIABLE_SIZE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER) \
  120. ARRAY_OPERAND_VARIABLE_STRIDE_INITIALIZATION_MACRO_D## DIMENSION(VARIABLE_NAME,VARIABLE_IDENTIFIER)
  121. #define VARIABLE_INITIALIZATION_VARIABLE_SIZE_VARIABLE_STRIDE_RHS_MACRO(DIMENSION,VARIABLE_NAME,VARIABLE_IDENTIFIER)
  122. #endif
  123. // Used for both internally generated intermediate code and final generated code
  124. // (since the loop nests must have there variables defined so that the intermediate
  125. // code can compile).
  126. #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D1() \
  127. int _length1 = 0;
  128. #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D2() \
  129. int _length1 = 0, _length2 = 0;
  130. #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D3() \
  131. int _length1 = 0,_length2 = 0,_length3 = 0;
  132. #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D4() \
  133. int _length1 = 0,_length2 = 0,_length3 = 0,_length4 = 0;
  134. #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D5() \
  135. int _length1 = 0,_length2 = 0,_length3 = 0,_length4 = 0,_length5 = 0;
  136. #define ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D6() \
  137. int _length1 = 0,_length2 = 0,_length3 = 0,_length4 = 0,_length5 = 0,_length6 = 0;
  138. // These macros define the loop variables which are required to be seen
  139. // when we compile both the loop nest to build the AST fragment and the
  140. // final application code.
  141. #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D1() \
  142. int _1; \
  143. ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D1()
  144. #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D2() \
  145. int _1,_2; \
  146. ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D2()
  147. #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D3() \
  148. int _1,_2,_3; \
  149. ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D3()
  150. #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D4() \
  151. int _1,_2,_3,_4; \
  152. ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D4()
  153. #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D5() \
  154. int _1,_2,_3,_4,_5; \
  155. ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D5()
  156. #define LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D6() \
  157. int _1,_2,_3,_4,_5,_6; \
  158. ARRAY_TRANSFORMATION_LENGTH_DECLARATION_MACRO_D6()
  159. // The case of uniform stride (across all operands) is optimized in the
  160. // generated loop nest to increment by a fixed stride (across all operands)
  161. // This requires the support of a macro that declares the stride# variables
  162. // so that the generated loop nest can be compiled to form the AST fragment.
  163. #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D1() \
  164. LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D1() \
  165. ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D1()
  166. #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D2() \
  167. LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D2() \
  168. ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D2()
  169. #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D3() \
  170. LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D3() \
  171. ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D3()
  172. #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D4() \
  173. LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D4() \
  174. ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D4()
  175. #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D5() \
  176. LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D5() \
  177. ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D5()
  178. #define LOOP_INDEX_VARIABLES_UNIFORM_STRIDE_DECLARATION_MACRO_D6() \
  179. LOOP_INDEX_VARIABLES_DECLARATION_MACRO_D6() \
  180. ARRAY_OPERAND_UNIFORM_STRIDE_DECLARATION_MACRO_D6()
  181. // endif for APP_TRANSFORMATION_MACROS_HEADER_FILE (include guard)
  182. #endif