asm.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:9k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1995, 1996, 1997, 1999, 2001 by Ralf Baechle
  7.  * Copyright (C) 1999 by Silicon Graphics, Inc.
  8.  * Copyright (C) 2001 MIPS Technologies, Inc.
  9.  *
  10.  * Some useful macros for MIPS assembler code
  11.  *
  12.  * Some of the routines below contain useless nops that will be optimized
  13.  * away by gas in -O mode. These nops are however required to fill delay
  14.  * slots in noreorder mode.
  15.  */
  16. #ifndef __ASM_ASM_H
  17. #define __ASM_ASM_H
  18. #include <asm/sgidefs.h>
  19. /*
  20.  * PIC specific declarations
  21.  * Not used for the kernel but here seems to be the right place.
  22.  */
  23. #ifdef __PIC__
  24. #define CPRESTORE(register)                             
  25. .cprestore register
  26. #define CPADD(register)                                 
  27. .cpadd register
  28. #define CPLOAD(register)                                
  29. .cpload register
  30. #else
  31. #define CPRESTORE(register)
  32. #define CPADD(register)
  33. #define CPLOAD(register)
  34. #endif
  35. /*
  36.  * LEAF - declare leaf routine
  37.  */
  38. #define LEAF(symbol)                                    
  39. .globl symbol;                         
  40. .align 2;                              
  41. .type symbol,@function;               
  42. .ent symbol,0;                       
  43. symbol: .frame sp,0,ra
  44. /*
  45.  * NESTED - declare nested routine entry point
  46.  */
  47. #define NESTED(symbol, framesize, rpc)                  
  48. .globl symbol;                         
  49. .align 2;                              
  50. .type symbol,@function;               
  51. .ent symbol,0;                       
  52. symbol: .frame sp, framesize, rpc
  53. /*
  54.  * END - mark end of function
  55.  */
  56. #define END(function)                                   
  57. .end function;         
  58. .size function,.-function
  59. /*
  60.  * EXPORT - export definition of symbol
  61.  */
  62. #define EXPORT(symbol)
  63. .globl symbol;                         
  64. symbol:
  65. /*
  66.  * FEXPORT - export definition of a function symbol
  67.  */
  68. #define FEXPORT(symbol)
  69. .globl symbol;
  70. .type symbol,@function;
  71. symbol:
  72. /*
  73.  * ABS - export absolute symbol
  74.  */
  75. #define ABS(symbol,value)                               
  76. .globl symbol;                         
  77. symbol = value
  78. #define PANIC(msg)                                      
  79. .set push;
  80. .set reorder;                        
  81. la a0,8f;                          
  82. jal panic;                          
  83. 9: b 9b;                             
  84. .set pop;
  85. TEXT(msg)
  86. /*
  87.  * Print formatted string
  88.  */
  89. #define PRINT(string)                                   
  90. .set push;
  91. .set reorder;                        
  92. la a0,8f;                          
  93. jal printk;                         
  94. .set pop;
  95. TEXT(string)
  96. #define TEXT(msg)                                       
  97. .data;                                  
  98. 8: .asciiz msg;                            
  99. .previous;
  100. /*
  101.  * Build text tables
  102.  */
  103. #define TTABLE(string)                                  
  104. .text;                                  
  105. .word 1f;                             
  106. .previous;                              
  107. .data;                                  
  108. 1: .asciz string;                         
  109. .previous
  110. /*
  111.  * MIPS IV pref instruction.
  112.  * Use with .set noreorder only!
  113.  *
  114.  * MIPS IV implementations are free to treat this as a nop.  The R5000
  115.  * is one of them.  So we should have an option not to use this instruction.
  116.  */
  117. #if (_MIPS_ISA == _MIPS_ISA_MIPS4 ) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || 
  118.     (_MIPS_ISA == _MIPS_ISA_MIPS64)
  119. #define PREF(hint,addr)                                 
  120. pref hint,addr
  121. #define PREFX(hint,addr)                                
  122. prefx hint,addr
  123. #else
  124. #define PREF
  125. #define PREFX
  126. #endif
  127. /*
  128.  * MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs.
  129.  */
  130. #if _MIPS_ISA == _MIPS_ISA_MIPS1
  131. #define MOVN(rd,rs,rt)                                  
  132. .set push;
  133. .set reorder;
  134. beqz rt,9f;                          
  135. move rd,rs;                          
  136. .set pop;
  137. 9:
  138. #define MOVZ(rd,rs,rt)                                  
  139. .set push;
  140. .set reorder;
  141. bnez rt,9f;                          
  142. move rd,rt;                          
  143. .set pop;
  144. 9:
  145. #endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */
  146. #if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3)
  147. #define MOVN(rd,rs,rt)                                  
  148. .set push;
  149. .set noreorder;
  150. bnezl rt,9f;                          
  151. move rd,rs;                          
  152. .set pop;
  153. 9:
  154. #define MOVZ(rd,rs,rt)                                  
  155. .set push;
  156. .set noreorder;
  157. beqzl rt,9f;                          
  158. movz rd,rs;                          
  159. .set pop;
  160. 9:
  161. #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */
  162. #if (_MIPS_ISA == _MIPS_ISA_MIPS4 ) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || 
  163.     (_MIPS_ISA == _MIPS_ISA_MIPS64)
  164. #define MOVN(rd,rs,rt)                                  
  165. movn rd,rs,rt
  166. #define MOVZ(rd,rs,rt)                                  
  167. movz rd,rs,rt
  168. #endif /* MIPS IV, MIPS V or MIPS64 */
  169. /*
  170.  * Stack alignment
  171.  */
  172. #if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) || 
  173.     (_MIPS_ISA == _MIPS_ISA_MIPS32)
  174. #define ALSZ 7
  175. #define ALMASK ~7
  176. #endif
  177. #if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || 
  178.     (_MIPS_ISA == _MIPS_ISA_MIPS5) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
  179. #define ALSZ 15
  180. #define ALMASK ~15
  181. #endif
  182. /*
  183.  * Size of a register
  184.  */
  185. #ifdef __mips64
  186. #define SZREG 8
  187. #else
  188. #define SZREG 4
  189. #endif
  190. /*
  191.  * Use the following macros in assemblercode to load/store registers,
  192.  * pointers etc.
  193.  */
  194. #if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) || 
  195.     (_MIPS_ISA == _MIPS_ISA_MIPS32)
  196. #define REG_S sw
  197. #define REG_L lw
  198. #define PTR_SUBU dsubu
  199. #define PTR_ADDU daddu
  200. #endif
  201. #if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || 
  202.     (_MIPS_ISA == _MIPS_ISA_MIPS5) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
  203. #define REG_S sd
  204. #define REG_L ld
  205. /* We still live in a 32 bit address space ...  */
  206. #define PTR_SUBU dsubu
  207. #define PTR_ADDU daddu
  208. #endif
  209. /*
  210.  * How to add/sub/load/store/shift C int variables.
  211.  */
  212. #if (_MIPS_SZINT == 32)
  213. #define INT_ADD add
  214. #define INT_ADDI addi
  215. #define INT_ADDU addu
  216. #define INT_ADDIU addiu
  217. #define INT_SUB add
  218. #define INT_SUBI subi
  219. #define INT_SUBU subu
  220. #define INT_SUBIU subu
  221. #define INT_L lw
  222. #define INT_S sw
  223. #endif
  224. #if (_MIPS_SZINT == 64)
  225. #define INT_ADD dadd
  226. #define INT_ADDI daddi
  227. #define INT_ADDU daddu
  228. #define INT_ADDIU daddiu
  229. #define INT_SUB dadd
  230. #define INT_SUBI dsubi
  231. #define INT_SUBU dsubu
  232. #define INT_SUBIU dsubu
  233. #define INT_L ld
  234. #define INT_S sd
  235. #endif
  236. /*
  237.  * How to add/sub/load/store/shift C long variables.
  238.  */
  239. #if (_MIPS_SZLONG == 32)
  240. #define LONG_ADD add
  241. #define LONG_ADDI addi
  242. #define LONG_ADDU addu
  243. #define LONG_ADDIU addiu
  244. #define LONG_SUB add
  245. #define LONG_SUBI subi
  246. #define LONG_SUBU subu
  247. #define LONG_SUBIU subu
  248. #define LONG_L lw
  249. #define LONG_S sw
  250. #define LONG_SLL sll
  251. #define LONG_SLLV sllv
  252. #define LONG_SRL srl
  253. #define LONG_SRLV srlv
  254. #define LONG_SRA sra
  255. #define LONG_SRAV srav
  256. #endif
  257. #if (_MIPS_SZLONG == 64)
  258. #define LONG_ADD dadd
  259. #define LONG_ADDI daddi
  260. #define LONG_ADDU daddu
  261. #define LONG_ADDIU daddiu
  262. #define LONG_SUB dadd
  263. #define LONG_SUBI dsubi
  264. #define LONG_SUBU dsubu
  265. #define LONG_SUBIU dsubu
  266. #define LONG_L ld
  267. #define LONG_S sd
  268. #define LONG_SLL dsll
  269. #define LONG_SLLV dsllv
  270. #define LONG_SRL dsrl
  271. #define LONG_SRLV dsrlv
  272. #define LONG_SRA dsra
  273. #define LONG_SRAV dsrav
  274. #endif
  275. /*
  276.  * How to add/sub/load/store/shift pointers.
  277.  */
  278. #if (_MIPS_SZPTR == 32)
  279. #define PTR_ADD add
  280. #define PTR_ADDI addi
  281. #define PTR_ADDU addu
  282. #define PTR_ADDIU addiu
  283. #define PTR_SUB add
  284. #define PTR_SUBI subi
  285. #define PTR_SUBU subu
  286. #define PTR_SUBIU subu
  287. #define PTR_L lw
  288. #define PTR_S sw
  289. #define PTR_SLL sll
  290. #define PTR_SLLV sllv
  291. #define PTR_SRL srl
  292. #define PTR_SRLV srlv
  293. #define PTR_SRA sra
  294. #define PTR_SRAV srav
  295. #define PTR_SCALESHIFT 2
  296. #define PTR .word
  297. #define PTRSIZE 4
  298. #define PTRLOG 2
  299. #endif
  300. #if (_MIPS_SZPTR == 64)
  301. #define PTR_ADD dadd
  302. #define PTR_ADDI daddi
  303. #define PTR_ADDU daddu
  304. #define PTR_ADDIU daddiu
  305. #define PTR_SUB dadd
  306. #define PTR_SUBI dsubi
  307. #define PTR_SUBU dsubu
  308. #define PTR_SUBIU dsubu
  309. #define PTR_L ld
  310. #define PTR_S sd
  311. #define PTR_SLL dsll
  312. #define PTR_SLLV dsllv
  313. #define PTR_SRL dsrl
  314. #define PTR_SRLV dsrlv
  315. #define PTR_SRA dsra
  316. #define PTR_SRAV dsrav
  317. #define PTR_SCALESHIFT 3
  318. #define PTR .dword
  319. #define PTRSIZE 8
  320. #define PTRLOG 3
  321. #endif
  322. /*
  323.  * Some cp0 registers were extended to 64bit for MIPS III.
  324.  */
  325. #if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) || 
  326.     (_MIPS_ISA == _MIPS_ISA_MIPS32)
  327. #define MFC0 mfc0
  328. #define MTC0 mtc0
  329. #endif
  330. #if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || 
  331.     (_MIPS_ISA == _MIPS_ISA_MIPS5) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
  332. #define MFC0 dmfc0
  333. #define MTC0 dmtc0
  334. #endif
  335. #endif /* __ASM_ASM_H */