m68k-defs.m4
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:6k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. divert(-1)
  2. dnl  m4 macros for 68k assembler.
  3. dnl  Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
  4. dnl
  5. dnl  This file is part of the GNU MP Library.
  6. dnl
  7. dnl  The GNU MP Library is free software; you can redistribute it and/or
  8. dnl  modify it under the terms of the GNU Lesser General Public License as
  9. dnl  published by the Free Software Foundation; either version 3 of the
  10. dnl  License, or (at your option) any later version.
  11. dnl
  12. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  13. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. dnl  Lesser General Public License for more details.
  16. dnl
  17. dnl  You should have received a copy of the GNU Lesser General Public License
  18. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  19. dnl  The default m4 `#' commenting interferes with the assembler syntax for
  20. dnl  immediates.  `|' would be correct, but it interferes with "||" in
  21. dnl  eval().  Would like to disable commenting, but that's not possible (see
  22. dnl  mpn/asm-defs.m4), so use `;' which should be harmless.
  23. changecom(;)
  24. dnl  Called: PROLOGUE_cpu(GSYM_PREFIX`'foo)
  25. dnl
  26. dnl  Same as the standard PROLOGUE, but align to 2 bytes not 4.
  27. define(`PROLOGUE_cpu',
  28. m4_assert_numargs(1)
  29. ` TEXT
  30. ALIGN(2)
  31. GLOBL `$1' GLOBL_ATTR
  32. TYPE(`$1',`function')
  33. `$1'LABEL_SUFFIX')
  34. dnl  Usage: d0, etc
  35. dnl
  36. dnl  Expand to d0 or %d0 according to the assembler's requirements.
  37. dnl
  38. dnl  Actually d0 expands to `d0' or %`d0', the quotes protecting against
  39. dnl  further expansion.  Definitions are made even if d0 is to be just `d0',
  40. dnl  so that any m4 quoting problems will show up everywhere, not just on a
  41. dnl  %d0 system.
  42. dnl
  43. dnl  Care must be taken with quoting when using these in a definition.  For
  44. dnl  instance the quotes in the following are essential or two %'s will be
  45. dnl  produced when `counter' is used.
  46. dnl
  47. dnl         define(counter, `d7')
  48. dnl
  49. dnl  Called: m68k_reg(r)
  50. define(m68k_reg,
  51. m4_assert_numargs(1)
  52. m4_assert_defined(`WANT_REGISTER_PERCENT')
  53. `ifelse(WANT_REGISTER_PERCENT,yes,%)`$1'')
  54. dnl  Usage: m68k_defreg(r)
  55. define(m68k_defreg,
  56. m4_assert_numargs(1)
  57. `deflit($1,`m68k_reg(`$1')')')
  58. m68k_defreg(d0)
  59. m68k_defreg(d1)
  60. m68k_defreg(d2)
  61. m68k_defreg(d3)
  62. m68k_defreg(d4)
  63. m68k_defreg(d5)
  64. m68k_defreg(d6)
  65. m68k_defreg(d7)
  66. m68k_defreg(a0)
  67. m68k_defreg(a1)
  68. m68k_defreg(a2)
  69. m68k_defreg(a3)
  70. m68k_defreg(a4)
  71. m68k_defreg(a5)
  72. m68k_defreg(a6)
  73. m68k_defreg(a7)
  74. m68k_defreg(sp)
  75. m68k_defreg(pc)
  76. dnl  Usage: M(base)
  77. dnl         M(base,displacement)
  78. dnl         M(base,index,size)
  79. dnl         M(base,index,size,scale)
  80. dnl         M(base,+)
  81. dnl         M(-,base)
  82. dnl
  83. dnl  `base' is an address register, `index' is a data register, `size' is w
  84. dnl  or l, and scale is 1, 2, 4 or 8.
  85. dnl
  86. dnl  M(-,base) has it's arguments that way around to emphasise it's a
  87. dnl  pre-decrement, as opposed to M(base,+) a post-increment.
  88. dnl
  89. dnl  Enhancement: Add the memory indirect modes, if/when they're needed.
  90. define(M,
  91. m4_assert_numargs_range(1,4)
  92. m4_assert_defined(`WANT_ADDRESSING')
  93. `ifelse(WANT_ADDRESSING,mit,
  94. `ifelse($#,1, ``$1'@')dnl
  95. ifelse($#,2,
  96. `ifelse($2,+, ``$1'@+',
  97. `ifelse($1,-, ``$2'@-',
  98.               ``$1'@($2)')')')dnl
  99. ifelse($#,3,  ``$1'@(`$2':`$3')')dnl
  100. ifelse($#,4,  ``$1'@(`$2':`$3':$4)')',
  101. dnl  WANT_ADDRESSING `motorola'
  102. `ifelse($#,1, `(`$1')')dnl
  103. ifelse($#,2,
  104. `ifelse($2,+, `(`$1')+',
  105. `ifelse($1,-, `-(`$2')',
  106.               `$2(`$1')')')')dnl
  107. ifelse($#,3,  `(`$1',`$2'.$3)')dnl
  108. ifelse($#,4,  `(`$1',`$2'.$3*$4)')')')
  109. dnl  Usage: addl etc
  110. dnl
  111. dnl  m68k instructions with special handling for the suffix, with for
  112. dnl  instance addl expanding to addl or add.l as necessary.
  113. dnl
  114. dnl  See also t-m68k-defs.pl which verifies all mnemonics used in the asm
  115. dnl  files have entries here.
  116. dnl  Called: m68k_insn(mnemonic,suffix)
  117. define(m68k_insn,
  118. m4_assert_numargs(2)
  119. m4_assert_defined(`WANT_DOT_SIZE')
  120. `ifelse(WANT_DOT_SIZE,yes, ``$1'.``$2''',
  121.                            ``$1$2'')')
  122. dnl  Usage: m68k_definsn(mnemonic,suffix)
  123. define(m68k_definsn,
  124. m4_assert_numargs(2)
  125. `deflit($1`'$2,`m68k_insn(`$1',`$2')')')
  126. m68k_definsn(add,  l)
  127. m68k_definsn(addx, l)
  128. m68k_definsn(addq, l)
  129. m68k_definsn(asl,  l)
  130. m68k_definsn(cmp,  l)
  131. m68k_definsn(cmp,  w)
  132. m68k_definsn(clr,  l)
  133. m68k_definsn(divu, l)
  134. m68k_definsn(eor,  w)
  135. m68k_definsn(lsl,  l)
  136. m68k_definsn(lsr,  l)
  137. m68k_definsn(move, l)
  138. m68k_definsn(move, w)
  139. m68k_definsn(movem,l)
  140. m68k_definsn(moveq,l)
  141. m68k_definsn(mulu, l)
  142. m68k_definsn(neg,  l)
  143. m68k_definsn(or,   l)
  144. m68k_definsn(roxl, l)
  145. m68k_definsn(roxr, l)
  146. m68k_definsn(sub,  l)
  147. m68k_definsn(subx, l)
  148. m68k_definsn(subq, l)
  149. dnl  Usage: bra etc
  150. dnl
  151. dnl  Expand to `bra', `jra' or `jbra' according to what the assembler will
  152. dnl  accept.  The latter two give variable-sized branches in gas.
  153. dnl
  154. dnl  See also t-m68k-defs.pl which verifies all the bXX branches used in the
  155. dnl  asm files have entries here.
  156. dnl  Called: m68k_branch(cond)
  157. define(m68k_branch,
  158. m4_assert_numargs(1)
  159. m4_assert_defined(`WANT_BRANCHES')
  160. `ifelse(WANT_BRANCHES,jra, `j$1',
  161. `ifelse(WANT_BRANCHES,jbra,`jb$1',
  162.                            ``b$1'')')')
  163. dnl  Called: m68k_defbranch(cond)
  164. define(m68k_defbranch,
  165. m4_assert_numargs(1)
  166. `deflit(b$1,`m68k_branch(`$1')')')
  167. m68k_defbranch(ra)
  168. m68k_defbranch(cc)
  169. m68k_defbranch(cs)
  170. m68k_defbranch(ls)
  171. m68k_defbranch(eq)
  172. m68k_defbranch(ne)
  173. dnl  Usage: scale_available_p
  174. dnl
  175. dnl  Expand to 1 if a scale factor can be used in addressing modes, or 0 if
  176. dnl  not.  M(a0,d0,l,4), meaning a0+d0*4, is not available in 68000 or
  177. dnl  68010, but is in CPU32 and in 68020 and up.
  178. define(scale_available_p,
  179. `m4_ifdef_anyof_p(
  180. `HAVE_HOST_CPU_m68360'
  181. `HAVE_HOST_CPU_m68020'
  182. `HAVE_HOST_CPU_m68030'
  183. `HAVE_HOST_CPU_m68040'
  184. `HAVE_HOST_CPU_m68060')')
  185. divert