milli.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /* 32 and 64-bit millicode, original author Hewlett-Packard
  2. adapted for gcc by Paul Bame <bame@debian.org>
  3. and Alan Modra <alan@linuxcare.com.au>.
  4. Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
  5. This file is part of GCC and is released under the terms of
  6. of the GNU General Public License as published by the Free Software
  7. Foundation; either version 2, or (at your option) any later version.
  8. See the file COPYING in the top-level GCC source directory for a copy
  9. of the license. */
  10. #ifndef _PA_MILLI_H_
  11. #define _PA_MILLI_H_
  12. #define L_dyncall
  13. #define L_divI
  14. #define L_divU
  15. #define L_remI
  16. #define L_remU
  17. #define L_div_const
  18. #define L_mulI
  19. #ifdef CONFIG_64BIT
  20. .level 2.0w
  21. #endif
  22. /* Hardware General Registers. */
  23. r0: .reg %r0
  24. r1: .reg %r1
  25. r2: .reg %r2
  26. r3: .reg %r3
  27. r4: .reg %r4
  28. r5: .reg %r5
  29. r6: .reg %r6
  30. r7: .reg %r7
  31. r8: .reg %r8
  32. r9: .reg %r9
  33. r10: .reg %r10
  34. r11: .reg %r11
  35. r12: .reg %r12
  36. r13: .reg %r13
  37. r14: .reg %r14
  38. r15: .reg %r15
  39. r16: .reg %r16
  40. r17: .reg %r17
  41. r18: .reg %r18
  42. r19: .reg %r19
  43. r20: .reg %r20
  44. r21: .reg %r21
  45. r22: .reg %r22
  46. r23: .reg %r23
  47. r24: .reg %r24
  48. r25: .reg %r25
  49. r26: .reg %r26
  50. r27: .reg %r27
  51. r28: .reg %r28
  52. r29: .reg %r29
  53. r30: .reg %r30
  54. r31: .reg %r31
  55. /* Hardware Space Registers. */
  56. sr0: .reg %sr0
  57. sr1: .reg %sr1
  58. sr2: .reg %sr2
  59. sr3: .reg %sr3
  60. sr4: .reg %sr4
  61. sr5: .reg %sr5
  62. sr6: .reg %sr6
  63. sr7: .reg %sr7
  64. /* Hardware Floating Point Registers. */
  65. fr0: .reg %fr0
  66. fr1: .reg %fr1
  67. fr2: .reg %fr2
  68. fr3: .reg %fr3
  69. fr4: .reg %fr4
  70. fr5: .reg %fr5
  71. fr6: .reg %fr6
  72. fr7: .reg %fr7
  73. fr8: .reg %fr8
  74. fr9: .reg %fr9
  75. fr10: .reg %fr10
  76. fr11: .reg %fr11
  77. fr12: .reg %fr12
  78. fr13: .reg %fr13
  79. fr14: .reg %fr14
  80. fr15: .reg %fr15
  81. /* Hardware Control Registers. */
  82. cr11: .reg %cr11
  83. sar: .reg %cr11 /* Shift Amount Register */
  84. /* Software Architecture General Registers. */
  85. rp: .reg r2 /* return pointer */
  86. #ifdef CONFIG_64BIT
  87. mrp: .reg r2 /* millicode return pointer */
  88. #else
  89. mrp: .reg r31 /* millicode return pointer */
  90. #endif
  91. ret0: .reg r28 /* return value */
  92. ret1: .reg r29 /* return value (high part of double) */
  93. sp: .reg r30 /* stack pointer */
  94. dp: .reg r27 /* data pointer */
  95. arg0: .reg r26 /* argument */
  96. arg1: .reg r25 /* argument or high part of double argument */
  97. arg2: .reg r24 /* argument */
  98. arg3: .reg r23 /* argument or high part of double argument */
  99. /* Software Architecture Space Registers. */
  100. /* sr0 ; return link from BLE */
  101. sret: .reg sr1 /* return value */
  102. sarg: .reg sr1 /* argument */
  103. /* sr4 ; PC SPACE tracker */
  104. /* sr5 ; process private data */
  105. /* Frame Offsets (millicode convention!) Used when calling other
  106. millicode routines. Stack unwinding is dependent upon these
  107. definitions. */
  108. r31_slot: .equ -20 /* "current RP" slot */
  109. sr0_slot: .equ -16 /* "static link" slot */
  110. #if defined(CONFIG_64BIT)
  111. mrp_slot: .equ -16 /* "current RP" slot */
  112. psp_slot: .equ -8 /* "previous SP" slot */
  113. #else
  114. mrp_slot: .equ -20 /* "current RP" slot (replacing "r31_slot") */
  115. #endif
  116. #define DEFINE(name,value)name: .EQU value
  117. #define RDEFINE(name,value)name: .REG value
  118. #ifdef milliext
  119. #define MILLI_BE(lbl) BE lbl(sr7,r0)
  120. #define MILLI_BEN(lbl) BE,n lbl(sr7,r0)
  121. #define MILLI_BLE(lbl) BLE lbl(sr7,r0)
  122. #define MILLI_BLEN(lbl) BLE,n lbl(sr7,r0)
  123. #define MILLIRETN BE,n 0(sr0,mrp)
  124. #define MILLIRET BE 0(sr0,mrp)
  125. #define MILLI_RETN BE,n 0(sr0,mrp)
  126. #define MILLI_RET BE 0(sr0,mrp)
  127. #else
  128. #define MILLI_BE(lbl) B lbl
  129. #define MILLI_BEN(lbl) B,n lbl
  130. #define MILLI_BLE(lbl) BL lbl,mrp
  131. #define MILLI_BLEN(lbl) BL,n lbl,mrp
  132. #define MILLIRETN BV,n 0(mrp)
  133. #define MILLIRET BV 0(mrp)
  134. #define MILLI_RETN BV,n 0(mrp)
  135. #define MILLI_RET BV 0(mrp)
  136. #endif
  137. #define CAT(a,b) a##b
  138. #define SUBSPA_MILLI .section .text
  139. #define SUBSPA_MILLI_DIV .section .text.div,"ax",@progbits! .align 16
  140. #define SUBSPA_MILLI_MUL .section .text.mul,"ax",@progbits! .align 16
  141. #define ATTR_MILLI
  142. #define SUBSPA_DATA .section .data
  143. #define ATTR_DATA
  144. #define GLOBAL $global$
  145. #define GSYM(sym) !sym:
  146. #define LSYM(sym) !CAT(.L,sym:)
  147. #define LREF(sym) CAT(.L,sym)
  148. #endif /*_PA_MILLI_H_*/