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

嵌入式Linux

开发平台:

Unix_Linux

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