asm.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * Assembly Macros For MIPS
  3. *
  4. * Copyright (c) 2006-2019, RT-Thread Development Team
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. *
  8. * Change Logs:
  9. * Date Author Notes
  10. * 2019-12-04 Jiaxun Yang Initial version
  11. */
  12. #ifndef __ASM_H__
  13. #define __ASM_H__
  14. /*
  15. * LEAF - declare leaf routine
  16. */
  17. #define LEAF(symbol) \
  18. .globl symbol; \
  19. .align 2; \
  20. .type symbol,@function; \
  21. .ent symbol,0; \
  22. symbol: .frame sp,0,ra
  23. /*
  24. * NESTED - declare nested routine entry point
  25. */
  26. #define NESTED(symbol, framesize, rpc) \
  27. .globl symbol; \
  28. .align 2; \
  29. .type symbol,@function; \
  30. .ent symbol,0; \
  31. symbol: .frame sp, framesize, rpc
  32. /*
  33. * END - mark end of function
  34. */
  35. #define END(function) \
  36. .end function; \
  37. .size function,.-function
  38. /*
  39. * EXPORT - export definition of symbol
  40. */
  41. #define EXPORT(symbol) \
  42. .globl symbol; \
  43. symbol:
  44. /*
  45. * FEXPORT - export definition of a function symbol
  46. */
  47. #define FEXPORT(symbol) \
  48. .globl symbol; \
  49. .type symbol,@function; \
  50. symbol:
  51. /*
  52. * Global data declaration with size.
  53. */
  54. #define EXPORTS(name,sz) \
  55. .globl name; \
  56. .type name,@object; \
  57. .size name,sz; \
  58. name:
  59. /*
  60. * Weak data declaration with size.
  61. */
  62. #define WEXPORT(name,sz) \
  63. .weakext name; \
  64. .type name,@object; \
  65. .size name,sz; \
  66. name:
  67. /*
  68. * Global data reference with size.
  69. */
  70. #define IMPORT(name, size) \
  71. .extern name,size
  72. /*
  73. * Global zeroed data.
  74. */
  75. #define BSS(name,size) \
  76. .type name,@object; \
  77. .comm name,size
  78. /*
  79. * Local zeroed data.
  80. */
  81. #define LBSS(name,size) \
  82. .lcomm name,size
  83. /*
  84. * ABS - export absolute symbol
  85. */
  86. #define ABS(symbol,value) \
  87. .globl symbol; \
  88. symbol = value
  89. #define TEXT(msg) \
  90. .pushsection .data; \
  91. 8: .asciiz msg; \
  92. .popsection;
  93. #define ENTRY(name) \
  94. .globl name; \
  95. .align 2; \
  96. .ent name,0; \
  97. name##:
  98. /*
  99. * Macros to handle different pointer/register sizes for 32/64-bit code
  100. */
  101. /*
  102. * Size of a register
  103. */
  104. #define SZREG 4
  105. /*
  106. * Use the following macros in assemblercode to load/store registers,
  107. * pointers etc.
  108. */
  109. #define REG_S sw
  110. #define REG_L lw
  111. #define REG_SUBU subu
  112. #define REG_ADDU addu
  113. /*
  114. * How to add/sub/load/store/shift C int variables.
  115. */
  116. #define INT_ADD add
  117. #define INT_ADDU addu
  118. #define INT_ADDI addi
  119. #define INT_ADDIU addiu
  120. #define INT_SUB sub
  121. #define INT_SUBU subu
  122. #define INT_L lw
  123. #define INT_S sw
  124. #define INT_SLL sll
  125. #define INT_SLLV sllv
  126. #define INT_SRL srl
  127. #define INT_SRLV srlv
  128. #define INT_SRA sra
  129. #define INT_SRAV srav
  130. /*
  131. * How to add/sub/load/store/shift C long variables.
  132. */
  133. #define LONG_ADD add
  134. #define LONG_ADDU addu
  135. #define LONG_ADDI addi
  136. #define LONG_ADDIU addiu
  137. #define LONG_SUB sub
  138. #define LONG_SUBU subu
  139. #define LONG_L lw
  140. #define LONG_S sw
  141. #define LONG_SLL sll
  142. #define LONG_SLLV sllv
  143. #define LONG_SRL srl
  144. #define LONG_SRLV srlv
  145. #define LONG_SRA sra
  146. #define LONG_SRAV srav
  147. #define LONG .word
  148. #define LONGSIZE 4
  149. #define LONGMASK 3
  150. #define LONGLOG 2
  151. /*
  152. * How to add/sub/load/store/shift pointers.
  153. */
  154. #define PTR_ADD add
  155. #define PTR_ADDU addu
  156. #define PTR_ADDI addi
  157. #define PTR_ADDIU addiu
  158. #define PTR_SUB sub
  159. #define PTR_SUBU subu
  160. #define PTR_L lw
  161. #define PTR_S sw
  162. #define PTR_LA la
  163. #define PTR_SLL sll
  164. #define PTR_SLLV sllv
  165. #define PTR_SRL srl
  166. #define PTR_SRLV srlv
  167. #define PTR_SRA sra
  168. #define PTR_SRAV srav
  169. #define PTR_SCALESHIFT 2
  170. #define PTR .word
  171. #define PTRSIZE 4
  172. #define PTRLOG 2
  173. /*
  174. * Some cp0 registers were extended to 64bit for MIPS III.
  175. */
  176. #define MFC0 mfc0
  177. #define MTC0 mtc0
  178. #define SSNOP sll zero, zero, 1
  179. #endif /* end of __ASM_H__ */