FIX BUILD (with GHC 6.2.x): System.Directory.Internals is no more
[ghc-hetmet.git] / rts / gmp / mpn / asm-defs.m4
1 divert(-1)
2 dnl
3 dnl  m4 macros for gmp assembly code, shared by all CPUs.
4 dnl
5 dnl  These macros are designed for use with any m4 and have been used on
6 dnl  GNU, FreeBSD, OpenBSD and SysV.
7 dnl
8 dnl  GNU m4 and OpenBSD 2.7 m4 will give filenames and line numbers in error
9 dnl  messages.
10
11
12 dnl  Copyright (C) 1999, 2000 Free Software Foundation, Inc.
13 dnl 
14 dnl  This file is part of the GNU MP Library.
15 dnl
16 dnl  The GNU MP Library is free software; you can redistribute it and/or
17 dnl  modify it under the terms of the GNU Lesser General Public License as
18 dnl  published by the Free Software Foundation; either version 2.1 of the
19 dnl  License, or (at your option) any later version.
20 dnl
21 dnl  The GNU MP Library is distributed in the hope that it will be useful,
22 dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
23 dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24 dnl  Lesser General Public License for more details.
25 dnl
26 dnl  You should have received a copy of the GNU Lesser General Public
27 dnl  License along with the GNU MP Library; see the file COPYING.LIB.  If
28 dnl  not, write to the Free Software Foundation, Inc., 59 Temple Place -
29 dnl  Suite 330, Boston, MA 02111-1307, USA.
30
31
32 dnl  Macros:
33 dnl
34 dnl  Most new m4 specific macros have an "m4_" prefix to emphasise they're
35 dnl  m4 expansions.  But new defining things like deflit() and defreg() are
36 dnl  named like the builtin define(), and forloop() is named following the
37 dnl  GNU m4 example on which it's based.
38 dnl
39 dnl  GNU m4 with the -P option uses "m4_" as a prefix for builtins, but that
40 dnl  option isn't going to be used, so there's no conflict or confusion.
41 dnl
42 dnl
43 dnl  Comments in output:
44 dnl
45 dnl  The m4 comment delimiters are left at # and \n, the normal assembler
46 dnl  commenting for most CPUs.  m4 passes comment text through without
47 dnl  expanding macros in it, which is generally a good thing since it stops
48 dnl  unexpected expansions and possible resultant errors.
49 dnl
50 dnl  But note that when a quoted string is being read, a # isn't special, so
51 dnl  apostrophes in comments in quoted strings must be avoided or they'll be
52 dnl  interpreted as a closing quote mark.  But when the quoted text is
53 dnl  re-read # will still act like a normal comment, supressing macro
54 dnl  expansion.
55 dnl
56 dnl  For example,
57 dnl
58 dnl          # apostrophes in comments that're outside quotes are ok
59 dnl          # and using macro names like PROLOGUE is ok too
60 dnl          ...
61 dnl          ifdef(`PIC',`
62 dnl                  # but apostrophes aren't ok inside quotes
63 dnl                  #                     ^--wrong
64 dnl                  ...
65 dnl                  # though macro names like PROLOGUE are still ok
66 dnl                  ...
67 dnl          ')
68 dnl
69 dnl  If macro expansion in a comment is wanted, use `#' in the .asm (ie. a
70 dnl  quoted hash symbol), which will turn into # in the .s but get
71 dnl  expansions done on that line.  This can make the .s more readable to
72 dnl  humans, but it won't make a blind bit of difference to the assembler.
73 dnl
74 dnl  All the above applies, mutatis mutandis, when changecom() is used to
75 dnl  select @ ! ; or whatever other commenting.
76 dnl
77 dnl
78 dnl  Variations in m4 affecting gmp:
79 dnl
80 dnl  $# - When a macro is called as "foo" with no brackets, BSD m4 sets $#
81 dnl       to 1, whereas GNU or SysV m4 set it to 0.  In all cases though
82 dnl       "foo()" sets $# to 1.  This is worked around in various places.
83 dnl
84 dnl  len() - When "len()" is given an empty argument, BSD m4 evaluates to
85 dnl       nothing, whereas GNU, SysV, and the new OpenBSD, evaluate to 0.
86 dnl       See m4_length() below which works around this.
87 dnl
88 dnl  translit() - GNU m4 accepts character ranges like A-Z, and the new
89 dnl       OpenBSD m4 does under option -g, but basic BSD and SysV don't.
90 dnl
91 dnl  popdef() - in BSD and SysV m4 popdef() takes multiple arguments and
92 dnl       pops each, but GNU m4 only takes one argument.
93 dnl
94 dnl  push back - BSD m4 has some limits on the amount of text that can be
95 dnl       pushed back.  The limit is reasonably big and so long as macros
96 dnl       don't gratuitously duplicate big arguments it isn't a problem.
97 dnl       Normally an error message is given, but sometimes it just hangs.
98 dnl
99 dnl  eval() &,|,^ - GNU and SysV m4 have bitwise operators &,|,^ available,
100 dnl       but BSD m4 doesn't (contrary to what the man page suggests) and
101 dnl       instead ^ is exponentiation.
102 dnl
103 dnl  eval() ?: - The C ternary operator "?:" is available in BSD m4, but not
104 dnl       in SysV or GNU m4 (as of GNU m4 1.4 and betas of 1.5).
105 dnl
106 dnl  eval() -2^31 - BSD m4 has a bug where an eval() resulting in -2^31
107 dnl       (ie. -2147483648) gives "-(".  Using -2147483648 within an
108 dnl       expression is ok, it just can't be a final result.  "-(" will of
109 dnl       course upset parsing, with all sorts of strange effects.
110 dnl
111 dnl  eval() <<,>> - SysV m4 doesn't support shift operators in eval() (on
112 dnl       SunOS 5.7 /usr/xpg4/m4 has them but /usr/ccs/m4 doesn't).  See
113 dnl       m4_lshift() and m4_rshift() below for workarounds.
114 dnl
115 dnl  m4wrap() - in BSD m4, m4wrap() replaces any previous m4wrap() string,
116 dnl       in SysV m4 it appends to it, and in GNU m4 it prepends.  See
117 dnl       m4wrap_prepend() below which brings uniformity to this.
118 dnl
119 dnl  __file__,__line__ - GNU m4 and OpenBSD 2.7 m4 provide these, and
120 dnl       they're used here to make error messages more informative.  GNU m4
121 dnl       gives an unhelpful "NONE 0" in an m4wrap(), but that's worked
122 dnl       around.
123 dnl
124 dnl  __file__ quoting - OpenBSD m4, unlike GNU m4, doesn't quote the
125 dnl       filename in __file__, so care should be taken that no macro has
126 dnl       the same name as a file, or an unwanted expansion will occur when
127 dnl       printing an error or warning.
128 dnl
129 dnl  OpenBSD 2.6 m4 - this m4 rejects decimal constants containing an 8 or 9
130 dnl       in eval(), making it pretty much unusable.  This bug is confined
131 dnl       to version 2.6 (it's not in 2.5, and has been fixed in 2.7).
132 dnl
133 dnl  SunOS /usr/bin/m4 - this m4 lacks a number of desired features,
134 dnl       including $# and $@, defn(), m4exit(), m4wrap(), pushdef(),
135 dnl       popdef().  /usr/5bin/m4 is a SysV style m4 which should always be
136 dnl       available, and "configure" will reject /usr/bin/m4 in favour of
137 dnl       /usr/5bin/m4 (if necessary).
138 dnl
139 dnl       The sparc code actually has modest m4 requirements currently and
140 dnl       could manage with /usr/bin/m4, but there's no reason to put our
141 dnl       macros through contortions when /usr/5bin/m4 is available or GNU
142 dnl       m4 can be installed.
143
144
145 ifdef(`__ASM_DEFS_M4_INCLUDED__',
146 `m4_error(`asm-defs.m4 already included, dont include it twice
147 ')m4exit(1)')
148 define(`__ASM_DEFS_M4_INCLUDED__')
149
150
151 dnl  Detect and give a message about the unsuitable OpenBSD 2.6 m4.
152
153 ifelse(eval(89),89,,
154 `errprint(
155 `This m4 doesnt accept 8 and/or 9 in constants in eval(), making it unusable.
156 This is probably OpenBSD 2.6 m4 (September 1999).  Upgrade to OpenBSD 2.7,
157 or get a bug fix from the CVS (expr.c rev 1.9), or get GNU m4.  Dont forget
158 to configure with M4=/wherever/m4 if you install one of these in a directory
159 not in $PATH.
160 ')m4exit(1)')
161
162
163 dnl  Detect and give a message about the unsuitable SunOS /usr/bin/m4.
164 dnl
165 dnl  Unfortunately this test doesn't work when m4 is run in the normal way
166 dnl  from mpn/Makefile with "m4 -DOPERATION_foo foo.asm", since the bad m4
167 dnl  takes "-" in "-D..." to mean read stdin, so it will look like it just
168 dnl  hangs.  But running "m4 asm-defs.m4" to try it out will work.
169 dnl
170 dnl  We'd like to abort immediately on finding a problem, but unfortunately
171 dnl  the bad m4 doesn't have an m4exit(), nor does an invalid eval() kill
172 dnl  it.  Unexpanded $#'s in some m4_assert_numargs() later on will comment
173 dnl  out some closing parentheses and kill it with "m4: arg stack overflow".
174
175 define(m4_dollarhash_works_test,``$#'')
176 ifelse(m4_dollarhash_works_test(x),1,,
177 `errprint(
178 `This m4 doesnt support $# and cant be used for GMP asm processing.
179 If this is on SunOS, ./configure should choose /usr/5bin/m4 if you have that
180 or can get it, otherwise install GNU m4.  Dont forget to configure with
181 M4=/wherever/m4 if you install in a directory not in $PATH.
182 ')')
183 undefine(`m4_dollarhash_works_test')
184
185
186 dnl  --------------------------------------------------------------------------
187 dnl  Basic error handling things.
188
189
190 dnl  Usage: m4_dollarhash_1_if_noparen_p
191 dnl
192 dnl  Expand to 1 if a call "foo" gives $# set to 1 (as opposed to 0 like GNU
193 dnl  and SysV m4 give).
194
195 define(m4_dollarhash_1_if_noparen_test,`$#')
196 define(m4_dollarhash_1_if_noparen_p,
197 eval(m4_dollarhash_1_if_noparen_test==1))
198 undefine(`m4_dollarhash_1_if_noparen_test')
199
200
201 dnl  Usage: m4wrap_prepend(string)
202 dnl
203 dnl  Prepend the given string to what will be exapanded under m4wrap at the
204 dnl  end of input.
205 dnl
206 dnl  This macro exists to work around variations in m4wrap() behaviour in
207 dnl  the various m4s (notes at the start of this file).  Don't use m4wrap()
208 dnl  directly since it will interfere with this scheme.
209
210 define(m4wrap_prepend,
211 m4_assert_numargs(1)
212 `define(`m4wrap_string',`$1'defn(`m4wrap_string'))')
213
214 m4wrap(`m4wrap_string')
215 define(m4wrap_string,`')
216
217
218 dnl  Usage: m4_file_and_line
219 dnl
220 dnl  Expand to the current file and line number, if the GNU m4 extensions
221 dnl  __file__ and __line__ are available.
222 dnl
223 dnl  In GNU m4 1.4 at the end of input when m4wrap text is expanded,
224 dnl  __file__ is NONE and __line__ is 0, which is not a helpful thing to
225 dnl  print.  If m4_file_seen() has been called to note the last file seen,
226 dnl  then that file at a big line number is used, otherwise "end of input"
227 dnl  is used (although "end of input" won't parse as an error message).
228
229 define(m4_file_and_line,
230 `ifdef(`__file__',
231 `ifelse(__file__`'__line__,`NONE0',
232 `ifdef(`m4_file_seen_last',`m4_file_seen_last: 999999: ',`end of input: ')',
233 `__file__: __line__: ')')')
234
235
236 dnl  Usage: m4_errprint_commas(arg,...)
237 dnl
238 dnl  The same as errprint(), but commas are printed between arguments
239 dnl  instead of spaces.
240
241 define(m4_errprint_commas,
242 `errprint(`$1')dnl
243 ifelse(eval($#>1),1,`errprint(`,')m4_errprint_commas(shift($@))')')
244
245
246 dnl  Usage: m4_error(args...)
247 dnl         m4_warning(args...)
248 dnl
249 dnl  Print an error message, using m4_errprint_commas, prefixed with the
250 dnl  current filename and line number (if available).  m4_error sets up to
251 dnl  give an error exit at the end of processing, m4_warning just prints.
252 dnl  These macros are the recommended way to print errors.
253 dnl
254 dnl  The arguments here should be quoted in the usual way to prevent them
255 dnl  being expanded when the macro call is read.  (m4_error takes care not
256 dnl  to do any further expansion.)
257 dnl
258 dnl  For example,
259 dnl
260 dnl         m4_error(`some error message
261 dnl         ')
262 dnl
263 dnl  which prints
264 dnl
265 dnl         foo.asm:123: some error message
266 dnl
267 dnl  or if __file__ and __line__ aren't available
268 dnl
269 dnl         some error message
270 dnl
271 dnl  The "file:line:" format is a basic style, used by gcc and GNU m4, so
272 dnl  emacs and other editors will recognise it in their normal error message
273 dnl  parsing.
274
275 define(m4_warning,
276 `m4_errprint_commas(m4_file_and_line`'$@)')
277
278 define(m4_error,
279 `define(`m4_error_occurred',1)m4_warning($@)')
280
281 define(`m4_error_occurred',0)
282
283 dnl  This m4wrap_prepend() is first, so it'll be executed last.
284 m4wrap_prepend(
285 `ifelse(m4_error_occurred,1,
286 `m4_error(`Errors occurred during m4 processing
287 ')m4exit(1)')')
288
289
290 dnl  Usage: m4_assert_numargs(num)
291 dnl
292 dnl  Put this unquoted on a line on its own at the start of a macro
293 dnl  definition to add some code to check that num many arguments get passed
294 dnl  to the macro.  For example,
295 dnl
296 dnl         define(foo,
297 dnl         m4_assert_numargs(2)
298 dnl         `something `$1' and `$2' blah blah')
299 dnl
300 dnl  Then a call like foo(one,two,three) will provoke an error like
301 dnl
302 dnl         file:10: foo expected 2 arguments, got 3 arguments
303 dnl
304 dnl  Here are some calls and how many arguments they're interpreted as passing.
305 dnl
306 dnl         foo(abc,def)  2
307 dnl         foo(xyz)      1
308 dnl         foo()         0
309 dnl         foo          -1
310 dnl
311 dnl  The -1 for no parentheses at all means a macro that's meant to be used
312 dnl  that way can be checked with m4_assert_numargs(-1).  For example,
313 dnl
314 dnl         define(SPECIAL_SUFFIX,
315 dnl         m4_assert_numargs(-1)
316 dnl         `ifdef(`FOO',`_foo',`_bar')')
317 dnl
318 dnl  But as an alternative see also deflit() below where parenthesized
319 dnl  expressions following a macro are passed through to the output.
320 dnl
321 dnl  Note that in BSD m4 there's no way to differentiate calls "foo" and
322 dnl  "foo()", so in BSD m4 the distinction between the two isn't enforced.
323 dnl  (In GNU and SysV m4 it can be checked, and is.)
324
325
326 dnl  m4_assert_numargs is able to check its own arguments by calling
327 dnl  assert_numargs_internal directly.
328 dnl
329 dnl  m4_doublequote($`'0) expands to ``$0'', whereas ``$`'0'' would expand
330 dnl  to `$`'0' and do the wrong thing, and likewise for $1.  The same is
331 dnl  done in other assert macros.
332 dnl
333 dnl  $`#' leaves $# in the new macro being defined, and stops # being
334 dnl  interpreted as a comment character.
335 dnl
336 dnl  `dnl ' means an explicit dnl isn't necessary when m4_assert_numargs is
337 dnl  used.  The space means that if there is a dnl it'll still work.
338
339 dnl  Usage: m4_doublequote(x) expands to ``x''
340 define(m4_doublequote,
341 `m4_assert_numargs_internal(`$0',1,$#,len(`$1'))``$1''')
342
343 define(m4_assert_numargs,
344 `m4_assert_numargs_internal(`$0',1,$#,len(`$1'))dnl
345 `m4_assert_numargs_internal'(m4_doublequote($`'0),$1,$`#',`len'(m4_doublequote($`'1)))`dnl '')
346
347 dnl  Called: m4_assert_numargs_internal(`macroname',wantargs,$#,len(`$1'))
348 define(m4_assert_numargs_internal,
349 `m4_assert_numargs_internal_check(`$1',`$2',m4_numargs_count(`$3',`$4'))')
350
351 dnl  Called: m4_assert_numargs_internal_check(`macroname',wantargs,gotargs)
352 dnl
353 dnl  If m4_dollarhash_1_if_noparen_p (BSD m4) then gotargs can be 0 when it
354 dnl  should be -1.  If wantargs is -1 but gotargs is 0 and the two can't be
355 dnl  distinguished then it's allowed to pass.
356 dnl
357 define(m4_assert_numargs_internal_check,
358 `ifelse(eval($2 == $3
359              || ($2==-1 && $3==0 && m4_dollarhash_1_if_noparen_p)),0,
360 `m4_error(`$1 expected 'm4_Narguments(`$2')`, got 'm4_Narguments(`$3')
361 )')')
362
363 dnl  Called: m4_numargs_count($#,len(`$1'))
364 dnl  If $#==0 then -1 args, if $#==1 but len(`$1')==0 then 0 args, otherwise
365 dnl  $# args.
366 define(m4_numargs_count,
367 `ifelse($1,0, -1,
368 `ifelse(eval($1==1 && $2-0==0),1, 0, $1)')')
369
370 dnl  Usage: m4_Narguments(N)
371 dnl  "$1 argument" or "$1 arguments" with the plural according to $1.
372 define(m4_Narguments,
373 `$1 argument`'ifelse(`$1',1,,s)')
374
375
376 dnl  --------------------------------------------------------------------------
377 dnl  Additional error checking things.
378
379
380 dnl  Usage: m4_file_seen()
381 dnl
382 dnl  Record __file__ for the benefit of m4_file_and_line in m4wrap text.
383 dnl  The basic __file__ macro comes out quoted, like `foo.asm', and
384 dnl  m4_file_seen_last is defined like that too.
385 dnl
386 dnl  This only needs to be used with something that could generate an error
387 dnl  message in m4wrap text.  The x86 PROLOGUE is the only such at the
388 dnl  moment (at end of input its m4wrap checks for missing EPILOGUE).  A few
389 dnl  include()s can easily trick this scheme, but you'd expect an EPILOGUE
390 dnl  in the same file as the PROLOGUE.
391
392 define(m4_file_seen,
393 m4_assert_numargs(0)
394 `ifelse(__file__,`NONE',,
395 `define(`m4_file_seen_last',m4_doublequote(__file__))')')
396
397
398 dnl  Usage: m4_assert_onearg()
399 dnl
400 dnl  Put this, unquoted, at the start of a macro definition to add some code
401 dnl  to check that one argument is passed to the macro, but with that
402 dnl  argument allowed to be empty.  For example,
403 dnl
404 dnl          define(foo,
405 dnl          m4_assert_onearg()
406 dnl          `blah blah $1 blah blah')
407 dnl
408 dnl  Calls "foo(xyz)" or "foo()" are accepted.  A call "foo(xyz,abc)" fails.
409 dnl  A call "foo" fails too, but BSD m4 can't detect this case (GNU and SysV
410 dnl  m4 can).
411
412 define(m4_assert_onearg,
413 m4_assert_numargs(0)
414 `m4_assert_onearg_internal'(m4_doublequote($`'0),$`#')`dnl ')
415
416 dnl  Called: m4_assert_onearg(`macroname',$#)
417 define(m4_assert_onearg_internal,
418 `ifelse($2,1,,
419 `m4_error(`$1 expected 1 argument, got 'm4_Narguments(`$2')
420 )')')
421
422
423 dnl  Usage: m4_assert_numargs_range(low,high)
424 dnl
425 dnl  Put this, unquoted, at the start of a macro definition to add some code
426 dnl  to check that between low and high many arguments get passed to the
427 dnl  macro.  For example,
428 dnl
429 dnl         define(foo,
430 dnl         m4_assert_numargs_range(3,5)
431 dnl         `mandatory $1 $2 $3 optional $4 $5 end')
432 dnl
433 dnl  See m4_assert_numargs() for more info.
434
435 define(m4_assert_numargs_range,
436 m4_assert_numargs(2)
437 ``m4_assert_numargs_range_internal'(m4_doublequote($`'0),$1,$2,$`#',`len'(m4_doublequote($`'1)))`dnl '')
438
439 dnl  Called: m4_assert_numargs_range_internal(`name',low,high,$#,len(`$1'))
440 define(m4_assert_numargs_range_internal,
441 m4_assert_numargs(5)
442 `m4_assert_numargs_range_check(`$1',`$2',`$3',m4_numargs_count(`$4',`$5'))')
443
444 dnl  Called: m4_assert_numargs_range_check(`name',low,high,gotargs)
445 dnl
446 dnl  If m4_dollarhash_1_if_noparen_p (BSD m4) then gotargs can be 0 when it
447 dnl  should be -1.  To ensure a `high' of -1 works, a fudge is applied to
448 dnl  gotargs if it's 0 and the 0 and -1 cases can't be distinguished.
449 dnl
450 define(m4_assert_numargs_range_check,
451 m4_assert_numargs(4)
452 `ifelse(eval($2 <= $4 &&
453              ($4 - ($4==0 && m4_dollarhash_1_if_noparen_p) <= $3)),0,
454 `m4_error(`$1 expected $2 to $3 arguments, got 'm4_Narguments(`$4')
455 )')')
456
457
458 dnl  Usage: m4_assert_defined(symbol)
459 dnl
460 dnl  Put this unquoted on a line of its own at the start of a macro
461 dnl  definition to add some code to check that the given symbol is defined
462 dnl  when the macro is used.  For example,
463 dnl
464 dnl          define(foo,
465 dnl          m4_assert_defined(`FOO_PREFIX')
466 dnl          `FOO_PREFIX whatever')
467 dnl
468 dnl  This is a convenient way to check that the user or ./configure or
469 dnl  whatever has defined the things needed by a macro, as opposed to
470 dnl  silently generating garbage.
471
472 define(m4_assert_defined,
473 m4_assert_numargs(1)
474 ``m4_assert_defined_internal'(m4_doublequote($`'0),``$1'')`dnl '')
475
476 dnl  Called: m4_assert_defined_internal(`macroname',`define_required')
477 define(m4_assert_defined_internal,
478 m4_assert_numargs(2)
479 `ifdef(`$2',,
480 `m4_error(`$1 needs $2 defined
481 ')')')
482
483
484 dnl  Usage: m4_not_for_expansion(`SYMBOL')
485 dnl         define_not_for_expansion(`SYMBOL')
486 dnl
487 dnl  m4_not_for_expansion turns SYMBOL, if defined, into something which
488 dnl  will give an error if expanded.  For example,
489 dnl
490 dnl         m4_not_for_expansion(`PIC')
491 dnl
492 dnl  define_not_for_expansion is the same, but always makes a definition.
493 dnl
494 dnl  These are for symbols that should be tested with ifdef(`FOO',...)
495 dnl  rather than be expanded as such.  They guard against accidentally
496 dnl  omitting the quotes, as in ifdef(FOO,...).  Note though that they only
497 dnl  catches this when FOO is defined, so be sure to test code both with and
498 dnl  without each definition.
499
500 define(m4_not_for_expansion,
501 m4_assert_numargs(1)
502 `ifdef(`$1',`define_not_for_expansion(`$1')')')
503
504 define(define_not_for_expansion,
505 m4_assert_numargs(1)
506 `ifelse(defn(`$1'),,,
507 `m4_error(``$1' has a non-empty value, maybe it shouldnt be munged with m4_not_for_expansion()
508 ')')dnl
509 define(`$1',`m4_not_for_expansion_internal(`$1')')')
510
511 define(m4_not_for_expansion_internal,
512 `m4_error(``$1' is not meant to be expanded, perhaps you mean `ifdef(`$1',...)'
513 ')')
514
515
516 dnl  --------------------------------------------------------------------------
517 dnl  Various generic m4 things.
518
519
520 dnl  Usage: m4_ifdef_anyof_p(`symbol',...)
521 dnl
522 dnl  Expand to 1 if any of the symbols in the argument list are defined, or
523 dnl  to 0 if not.
524
525 define(m4_ifdef_anyof_p,
526 `ifelse(eval($#<=1 && m4_length(`$1')==0),1, 0,
527 `ifdef(`$1', 1,
528 `m4_ifdef_anyof_p(shift($@))')')')
529
530
531 dnl  Usage: m4_length(string)
532 dnl
533 dnl  Determine the length of a string.  This is the same as len(), but
534 dnl  always expands to a number, working around the BSD len() which
535 dnl  evaluates to nothing given an empty argument.
536
537 define(m4_length,
538 m4_assert_onearg()
539 `eval(len(`$1')-0)')
540
541
542 dnl  Usage: m4_stringequal_p(x,y)
543 dnl
544 dnl  Expand to 1 or 0 according as strings x and y are equal or not.
545
546 define(m4_stringequal_p,
547 `ifelse(`$1',`$2',1,0)')
548
549
550 dnl  Usage: m4_incr_or_decr(n,last)
551 dnl
552 dnl  Do an incr(n) or decr(n), whichever is in the direction of "last".
553 dnl  Both n and last must be numbers of course.
554
555 define(m4_incr_or_decr,
556 m4_assert_numargs(2)
557 `ifelse(eval($1<$2),1,incr($1),decr($1))')
558
559
560 dnl  Usage: forloop(i, first, last, statement)
561 dnl
562 dnl  Based on GNU m4 examples/forloop.m4, but extended.
563 dnl
564 dnl  statement is expanded repeatedly, with i successively defined as
565 dnl
566 dnl         first, first+1, ..., last-1, last
567 dnl
568 dnl  Or if first > last, then it's
569 dnl
570 dnl         first, first-1, ..., last+1, last
571 dnl
572 dnl  If first == last, then one expansion is done.
573 dnl
574 dnl  A pushdef/popdef of i is done to preserve any previous definition (or
575 dnl  lack of definition).  first and last are eval()ed and so can be
576 dnl  expressions.
577 dnl
578 dnl  forloop_first is defined to 1 on the first iteration, 0 on the rest.
579 dnl  forloop_last is defined to 1 on the last iteration, 0 on the others.
580 dnl  Nested forloops are allowed, in which case forloop_first and
581 dnl  forloop_last apply to the innermost loop that's open.
582 dnl
583 dnl  A simple example,
584 dnl
585 dnl         forloop(i, 1, 2*2+1, `dnl
586 dnl         iteration number i ... ifelse(forloop_first,1,FIRST)
587 dnl         ')
588
589
590 dnl  "i" and "statement" are carefully quoted, but "first" and "last" are
591 dnl  just plain numbers once eval()ed.
592
593 define(`forloop',
594 m4_assert_numargs(4)
595 `pushdef(`$1',eval(`$2'))dnl
596 pushdef(`forloop_first',1)dnl
597 pushdef(`forloop_last',0)dnl
598 forloop_internal(`$1',eval(`$3'),`$4')`'dnl
599 popdef(`forloop_first')dnl
600 popdef(`forloop_last')dnl
601 popdef(`$1')')
602
603 dnl  Called: forloop_internal(`var',last,statement)
604 define(`forloop_internal',
605 m4_assert_numargs(3)
606 `ifelse($1,$2,
607 `define(`forloop_last',1)$3',
608 `$3`'dnl
609 define(`forloop_first',0)dnl
610 define(`$1',m4_incr_or_decr($1,$2))dnl
611 forloop_internal(`$1',$2,`$3')')')
612
613
614 dnl  Usage: m4_toupper(x)
615 dnl         m4_tolower(x)
616 dnl
617 dnl  Convert the argument string to upper or lower case, respectively.
618 dnl  Only one argument accepted.
619 dnl
620 dnl  BSD m4 doesn't take ranges like a-z in translit(), so the full alphabet
621 dnl  is written out.
622
623 define(m4_alphabet_lower, `abcdefghijklmnopqrstuvwxyz')
624 define(m4_alphabet_upper, `ABCDEFGHIJKLMNOPQRSTUVWXYZ')
625
626 define(m4_toupper,
627 m4_assert_onearg()
628 `translit(`$1', m4_alphabet_lower, m4_alphabet_upper)')
629
630 define(m4_tolower,
631 m4_assert_onearg()
632 `translit(`$1', m4_alphabet_upper, m4_alphabet_lower)')
633
634
635 dnl  Usage: m4_empty_if_zero(x)
636 dnl
637 dnl  Evaluate to x, or to nothing if x is 0.  x is eval()ed and so can be an
638 dnl  expression.
639 dnl
640 dnl  This is useful for x86 addressing mode displacements since forms like
641 dnl  (%ebx) are one byte shorter than 0(%ebx).  A macro `foo' for use as
642 dnl  foo(%ebx) could be defined with the following so it'll be empty if the
643 dnl  expression comes out zero.
644 dnl
645 dnl        deflit(`foo', `m4_empty_if_zero(a+b*4-c)')
646 dnl
647 dnl  Naturally this shouldn't be done if, say, a computed jump depends on
648 dnl  the code being a particular size.
649
650 define(m4_empty_if_zero,
651 m4_assert_onearg()
652 `ifelse(eval($1),0,,eval($1))')
653
654
655 dnl  Usage: m4_log2(x)
656 dnl
657 dnl  Calculate a logarithm to base 2.
658 dnl  x must be an integral power of 2, between 2**0 and 2**30.
659 dnl  x is eval()ed, so it can be an expression.
660 dnl  An error results if x is invalid.
661 dnl
662 dnl  2**31 isn't supported, because an unsigned 2147483648 is out of range
663 dnl  of a 32-bit signed int.  Also, the bug in BSD m4 where an eval()
664 dnl  resulting in 2147483648 (or -2147483648 as the case may be) gives `-('
665 dnl  means tests like eval(1<<31==(x)) would be necessary, but that then
666 dnl  gives an unattractive explosion of eval() error messages if x isn't
667 dnl  numeric.
668
669 define(m4_log2,
670 m4_assert_numargs(1)
671 `m4_log2_internal(0,1,eval(`$1'))')
672
673 dnl  Called: m4_log2_internal(n,2**n,target)
674 define(m4_log2_internal,
675 m4_assert_numargs(3)
676 `ifelse($2,$3,$1,
677 `ifelse($1,30,
678 `m4_error(`m4_log2() argument too big or not a power of two: $3
679 ')',
680 `m4_log2_internal(incr($1),eval(2*$2),$3)')')')
681
682
683 dnl  Usage:  m4_div2_towards_zero
684 dnl
685 dnl  m4 division is probably whatever a C signed division is, and C doesn't
686 dnl  specify what rounding gets used on negatives, so this expression forces
687 dnl  a rounding towards zero.
688
689 define(m4_div2_towards_zero,
690 m4_assert_numargs(1)
691 `eval((($1) + ((($1)<0) & ($1))) / 2)')
692
693
694 dnl  Usage: m4_lshift(n,count)
695 dnl         m4_rshift(n,count)
696 dnl
697 dnl  Calculate n shifted left or right by count many bits.  Both n and count
698 dnl  are eval()ed and so can be expressions.
699 dnl
700 dnl  Negative counts are allowed and mean a shift in the opposite direction.
701 dnl  Negative n is allowed and right shifts will be arithmetic (meaning
702 dnl  divide by 2**count, rounding towards zero, also meaning the sign bit is
703 dnl  duplicated).
704 dnl
705 dnl  Use these macros instead of << and >> in eval() since the basic ccs
706 dnl  SysV m4 doesn't have those operators.
707
708 define(m4_rshift,
709 m4_assert_numargs(2)
710 `m4_lshift(`$1',-(`$2'))')
711
712 define(m4_lshift,
713 m4_assert_numargs(2)
714 `m4_lshift_internal(eval(`$1'),eval(`$2'))')
715
716 define(m4_lshift_internal,
717 m4_assert_numargs(2)
718 `ifelse(eval($2-0==0),1,$1,
719 `ifelse(eval($2>0),1,
720 `m4_lshift_internal(eval($1*2),decr($2))',
721 `m4_lshift_internal(m4_div2_towards_zero($1),incr($2))')')')
722
723
724 dnl  Usage: deflit(name,value)
725 dnl
726 dnl  Like define(), but "name" expands like a literal, rather than taking
727 dnl  arguments.  For example "name(%eax)" expands to "value(%eax)".
728 dnl
729 dnl  Limitations:
730 dnl
731 dnl  $ characters in the value part must have quotes to stop them looking
732 dnl  like macro parameters.  For example, deflit(reg,`123+$`'4+567').  See
733 dnl  defreg() below for handling simple register definitions like $7 etc.
734 dnl
735 dnl  "name()" is turned into "name", unfortunately.  In GNU and SysV m4 an
736 dnl  error is generated when this happens, but in BSD m4 it will happen
737 dnl  silently.  The problem is that in BSD m4 $# is 1 in both "name" or
738 dnl  "name()", so there's no way to differentiate them.  Because we want
739 dnl  plain "name" to turn into plain "value", we end up with "name()"
740 dnl  turning into plain "value" too.
741 dnl
742 dnl  "name(foo)" will lose any whitespace after commas in "foo", for example
743 dnl  "disp(%eax, %ecx)" would become "128(%eax,%ecx)".
744 dnl
745 dnl  These parentheses oddities shouldn't matter in assembler text, but if
746 dnl  they do the suggested workaround is to write "name ()" or "name (foo)"
747 dnl  to stop the parentheses looking like a macro argument list.  If a space
748 dnl  isn't acceptable in the output, then write "name`'()" or "name`'(foo)".
749 dnl  The `' is stripped when read, but again stops the parentheses looking
750 dnl  like parameters.
751
752 dnl  Quoting for deflit_emptyargcheck is similar to m4_assert_numargs.  The
753 dnl  stuff in the ifelse gives a $#, $1 and $@ evaluated in the new macro
754 dnl  created, not in deflit.
755 define(deflit,
756 m4_assert_numargs(2)
757 `define(`$1',
758 `deflit_emptyargcheck'(``$1'',$`#',m4_doublequote($`'1))`dnl
759 $2`'dnl
760 ifelse(eval($'`#>1 || m4_length('m4_doublequote($`'1)`)!=0),1,($'`@))')')
761
762 dnl  Called: deflit_emptyargcheck(macroname,$#,`$1')
763 define(deflit_emptyargcheck,
764 `ifelse(eval($2==1 && !m4_dollarhash_1_if_noparen_p && m4_length(`$3')==0),1,
765 `m4_error(`dont use a deflit as $1() because it loses the brackets (see deflit in asm-incl.m4 for more information)
766 ')')')
767
768
769 dnl  Usage: m4_assert(`expr')
770 dnl
771 dnl  Test a compile-time requirement with an m4 expression.  The expression
772 dnl  should be quoted, and will be eval()ed and expected to be non-zero.
773 dnl  For example,
774 dnl
775 dnl         m4_assert(`FOO*2+6 < 14')
776
777 define(m4_assert,
778 m4_assert_numargs(1)
779 `ifelse(eval($1),1,,
780 `m4_error(`assertion failed: $1
781 ')')')
782
783
784 dnl  --------------------------------------------------------------------------
785 dnl  Various assembler things, not specific to any particular CPU.
786 dnl
787
788
789 dnl  Usage: include_mpn(`filename')
790 dnl
791 dnl  Like include(), but adds a path to the mpn source directory.  For
792 dnl  example,
793 dnl
794 dnl         include_mpn(`sparc64/addmul_1h.asm')
795
796 define(include_mpn,
797 m4_assert_numargs(1)
798 m4_assert_defined(`CONFIG_TOP_SRCDIR')
799 `include(CONFIG_TOP_SRCDIR`/mpn/$1')')
800
801
802 dnl  Usage: C comment ...
803 dnl
804 dnl  "C" works like a FORTRAN-style comment character.  This can be used for
805 dnl  comments to the right of assembly instructions, where just dnl would
806 dnl  remove the linefeed, and concatenate adjacent lines.
807 dnl
808 dnl  "C" and/or "dnl" are useful when an assembler doesn't support comments,
809 dnl  or where different assemblers for a particular CPU have different
810 dnl  comment styles.  The intermediate ".s" files will end up with no
811 dnl  comments, just code.
812 dnl
813 dnl  Using "C" is not intended to cause offence to anyone who doesn't like
814 dnl  FORTRAN; but if that happens it's an unexpected bonus.
815
816 define(C, `
817 dnl')
818
819
820 dnl  Various possible defines passed from the Makefile that are to be tested
821 dnl  with ifdef() rather than be expanded.
822
823 m4_not_for_expansion(`PIC')
824
825 dnl  aors_n
826 m4_not_for_expansion(`OPERATION_add_n')
827 m4_not_for_expansion(`OPERATION_sub_n')
828
829 dnl  aorsmul_n
830 m4_not_for_expansion(`OPERATION_addmul_1')
831 m4_not_for_expansion(`OPERATION_submul_1')
832
833 dnl  logops_n
834 m4_not_for_expansion(`OPERATION_and_n')
835 m4_not_for_expansion(`OPERATION_andn_n')
836 m4_not_for_expansion(`OPERATION_nand_n')
837 m4_not_for_expansion(`OPERATION_ior_n')
838 m4_not_for_expansion(`OPERATION_iorn_n')
839 m4_not_for_expansion(`OPERATION_nior_n')
840 m4_not_for_expansion(`OPERATION_xor_n')
841 m4_not_for_expansion(`OPERATION_xnor_n')
842
843 dnl  popham
844 m4_not_for_expansion(`OPERATION_popcount')
845 m4_not_for_expansion(`OPERATION_hamdist')
846
847
848 dnl  Usage: m4_config_gmp_mparam(`symbol')
849 dnl
850 dnl  Check that `symbol' is defined.  If it isn't, issue an error and
851 dnl  terminate immediately.  The error message explains that the symbol
852 dnl  should be in config.m4, copied from gmp-mparam.h.
853 dnl
854 dnl  Processing is terminated immediately since missing something like
855 dnl  KARATSUBA_SQR_THRESHOLD can lead to infinite loops with endless error
856 dnl  messages.
857
858 define(m4_config_gmp_mparam,
859 m4_assert_numargs(1)
860 `ifdef(`$1',,
861 `m4_error(`$1 is not defined.
862         "configure" should have extracted this from gmp-mparam.h and put it
863         in config.m4, but somehow this has failed.
864 ')m4exit(1)')')
865
866
867 dnl  Usage: defreg(name,reg)
868 dnl
869 dnl  Give a name to a $ style register.  For example,
870 dnl
871 dnl         defreg(foo,$12)
872 dnl
873 dnl  defreg() inserts an extra pair of quotes after the $ so that it's not
874 dnl  interpreted as an m4 macro parameter, ie. foo is actually $`'12.  m4
875 dnl  strips those quotes when foo is expanded.
876 dnl
877 dnl  deflit() is used to make the new definition, so it will expand
878 dnl  literally even if followed by parentheses ie. foo(99) will become
879 dnl  $12(99).  (But there's nowhere that would be used is there?)
880 dnl
881 dnl  When making further definitions from existing defreg() macros, remember
882 dnl  to use defreg() again to protect the $ in the new definitions too.  For
883 dnl  example,
884 dnl
885 dnl         defreg(a0,$4)
886 dnl         defreg(a1,$5)
887 dnl         ...
888 dnl
889 dnl         defreg(PARAM_DST,a0)
890 dnl
891 dnl  This is only because a0 is expanding at the time the PARAM_DST
892 dnl  definition is made, leaving a literal $4 that must be re-quoted.  On
893 dnl  the other hand in something like the following ra is only expanded when
894 dnl  ret is used and its $`'31 protection will have its desired effect at
895 dnl  that time.
896 dnl
897 dnl         defreg(ra,$31)
898 dnl         ...
899 dnl         define(ret,`j ra')
900 dnl
901 dnl  Note that only $n forms are meant to be used here, and something like
902 dnl  128($30) doesn't get protected and will come out wrong.
903
904 define(defreg,
905 m4_assert_numargs(2)
906 `deflit(`$1',
907 substr(`$2',0,1)``''substr(`$2',1))')
908
909
910 dnl  Usage: m4_instruction_wrapper(num)
911 dnl
912 dnl  Put this, unquoted, on a line on its own, at the start of a macro
913 dnl  that's a wrapper around an assembler instruction.  It adds code to give
914 dnl  a descriptive error message if the macro is invoked without arguments.
915 dnl
916 dnl  For example, suppose jmp needs to be wrapped,
917 dnl
918 dnl         define(jmp,
919 dnl         m4_instruction_wrapper()
920 dnl         m4_assert_numargs(1)
921 dnl                 `.byte 0x42
922 dnl                 .long  $1
923 dnl                 nop')
924 dnl
925 dnl  The point of m4_instruction_wrapper is to get a better error message
926 dnl  than m4_assert_numargs would give if jmp is accidentally used as plain
927 dnl  "jmp foo" instead of the intended "jmp( foo)".  "jmp()" with no
928 dnl  argument also provokes the error message.
929 dnl
930 dnl  m4_instruction_wrapper should only be used with wrapped instructions
931 dnl  that take arguments, since obviously something meant to be used as
932 dnl  plain "ret", say, doesn't want to give an error when used that way.
933
934 define(m4_instruction_wrapper,
935 m4_assert_numargs(0)
936 ``m4_instruction_wrapper_internal'(m4_doublequote($`'0),dnl
937 m4_doublequote(ifdef(`__file__',__file__,`the m4 sources')),dnl
938 $`#',m4_doublequote($`'1))`dnl'')
939
940 dnl  Called: m4_instruction_wrapper_internal($0,`filename',$#,$1)
941 define(m4_instruction_wrapper_internal,
942 `ifelse(eval($3<=1 && m4_length(`$4')==0),1,
943 `m4_error(`$1 is a macro replacing that instruction and needs arguments, see $2 for details
944 ')')')
945
946
947 dnl  Usage: UNROLL_LOG2, UNROLL_MASK, UNROLL_BYTES
948 dnl         CHUNK_LOG2, CHUNK_MASK, CHUNK_BYTES
949 dnl
950 dnl  When code supports a variable amount of loop unrolling, the convention
951 dnl  is to define UNROLL_COUNT to the number of limbs processed per loop.
952 dnl  When testing code this can be varied to see how much the loop overhead
953 dnl  is costing.  For example,
954 dnl
955 dnl         deflit(UNROLL_COUNT, 32)
956 dnl
957 dnl  If the forloop() generating the unrolled loop has a pattern processing
958 dnl  more than one limb, the convention is to express this with CHUNK_COUNT.
959 dnl  For example,
960 dnl
961 dnl         deflit(CHUNK_COUNT, 2)
962 dnl
963 dnl  The LOG2, MASK and BYTES definitions below are derived from these COUNT
964 dnl  definitions.  If COUNT is redefined, the LOG2, MASK and BYTES follow
965 dnl  the new definition automatically.
966 dnl
967 dnl  LOG2 is the log base 2 of COUNT.  MASK is COUNT-1, which can be used as
968 dnl  a bit mask.  BYTES is BYTES_PER_MP_LIMB*COUNT, the number of bytes
969 dnl  processed in each unrolled loop.
970 dnl
971 dnl  BYTES_PER_MP_LIMB is defined in a CPU specific m4 include file.  It
972 dnl  exists only so the BYTES definitions here can be common to all CPUs.
973 dnl  In the actual code for a given CPU, an explicit 4 or 8 may as well be
974 dnl  used because the code is only for a particular CPU, it doesn't need to
975 dnl  be general.
976 dnl
977 dnl  Note that none of these macros do anything except give conventional
978 dnl  names to commonly used things.  You still have to write your own
979 dnl  expressions for a forloop() and the resulting address displacements.
980 dnl  Something like the following would be typical for 4 bytes per limb.
981 dnl
982 dnl         forloop(`i',0,UNROLL_COUNT-1,`
983 dnl                 deflit(`disp',eval(i*4))
984 dnl                 ...
985 dnl         ')
986 dnl
987 dnl  Or when using CHUNK_COUNT,
988 dnl
989 dnl         forloop(`i',0,UNROLL_COUNT/CHUNK_COUNT-1,`
990 dnl                 deflit(`disp0',eval(i*CHUNK_COUNT*4))
991 dnl                 deflit(`disp1',eval(disp0+4))
992 dnl                 ...
993 dnl         ')
994 dnl
995 dnl  Clearly `i' can be run starting from 1, or from high to low or whatever
996 dnl  best suits.
997
998 deflit(UNROLL_LOG2,
999 m4_assert_defined(`UNROLL_COUNT')
1000 `m4_log2(UNROLL_COUNT)')
1001
1002 deflit(UNROLL_MASK,
1003 m4_assert_defined(`UNROLL_COUNT')
1004 `eval(UNROLL_COUNT-1)')
1005
1006 deflit(UNROLL_BYTES,
1007 m4_assert_defined(`UNROLL_COUNT')
1008 m4_assert_defined(`BYTES_PER_MP_LIMB')
1009 `eval(UNROLL_COUNT * BYTES_PER_MP_LIMB)')
1010  
1011 deflit(CHUNK_LOG2,
1012 m4_assert_defined(`CHUNK_COUNT')
1013 `m4_log2(CHUNK_COUNT)')
1014
1015 deflit(CHUNK_MASK,
1016 m4_assert_defined(`CHUNK_COUNT')
1017 `eval(CHUNK_COUNT-1)')
1018
1019 deflit(CHUNK_BYTES,
1020 m4_assert_defined(`CHUNK_COUNT')
1021 m4_assert_defined(`BYTES_PER_MP_LIMB')
1022 `eval(CHUNK_COUNT * BYTES_PER_MP_LIMB)')
1023
1024
1025 dnl  Usage: MPN(name)
1026 dnl
1027 dnl  Add MPN_PREFIX to a name.
1028 dnl  MPN_PREFIX defaults to "__gmpn_" if not defined.
1029
1030 ifdef(`MPN_PREFIX',,
1031 `define(`MPN_PREFIX',`__gmpn_')')
1032
1033 define(MPN,
1034 m4_assert_numargs(1)
1035 `MPN_PREFIX`'$1')
1036
1037
1038 dnl  Usage: mpn_add_n, etc
1039 dnl
1040 dnl  Convenience definitions using MPN(), like the #defines in gmp.h.  Each
1041 dnl  function that might be implemented in assembler is here.
1042
1043 define(define_mpn,
1044 m4_assert_numargs(1)
1045 `define(`mpn_$1',`MPN(`$1')')')
1046
1047 define_mpn(add)
1048 define_mpn(add_1)
1049 define_mpn(add_n)
1050 define_mpn(add_nc)
1051 define_mpn(addmul_1)
1052 define_mpn(addmul_1c)
1053 define_mpn(addsub_n)
1054 define_mpn(addsub_nc)
1055 define_mpn(and_n)
1056 define_mpn(andn_n)
1057 define_mpn(bdivmod)
1058 define_mpn(cmp)
1059 define_mpn(com_n)
1060 define_mpn(copyd)
1061 define_mpn(copyi)
1062 define_mpn(divexact_by3c)
1063 define_mpn(divrem)
1064 define_mpn(divrem_1)
1065 define_mpn(divrem_1c)
1066 define_mpn(divrem_2)
1067 define_mpn(divrem_classic)
1068 define_mpn(divrem_newton)
1069 define_mpn(dump)
1070 define_mpn(gcd)
1071 define_mpn(gcd_1)
1072 define_mpn(gcdext)
1073 define_mpn(get_str)
1074 define_mpn(hamdist)
1075 define_mpn(invert_limb)
1076 define_mpn(ior_n)
1077 define_mpn(iorn_n)
1078 define_mpn(kara_mul_n)
1079 define_mpn(kara_sqr_n)
1080 define_mpn(lshift)
1081 define_mpn(lshiftc)
1082 define_mpn(mod_1)
1083 define_mpn(mod_1c)
1084 define_mpn(mul)
1085 define_mpn(mul_1)
1086 define_mpn(mul_1c)
1087 define_mpn(mul_basecase)
1088 define_mpn(mul_n)
1089 define_mpn(perfect_square_p)
1090 define_mpn(popcount)
1091 define_mpn(preinv_mod_1)
1092 define_mpn(nand_n)
1093 define_mpn(nior_n)
1094 define_mpn(random)
1095 define_mpn(random2)
1096 define_mpn(rshift)
1097 define_mpn(rshiftc)
1098 define_mpn(scan0)
1099 define_mpn(scan1)
1100 define_mpn(set_str)
1101 define_mpn(sqr_basecase)
1102 define_mpn(sub_n)
1103 define_mpn(sqrtrem)
1104 define_mpn(sub)
1105 define_mpn(sub_1)
1106 define_mpn(sub_n)
1107 define_mpn(sub_nc)
1108 define_mpn(submul_1)
1109 define_mpn(submul_1c)
1110 define_mpn(toom3_mul_n)
1111 define_mpn(toom3_sqr_n)
1112 define_mpn(umul_ppmm)
1113 define_mpn(udiv_qrnnd)
1114 define_mpn(xnor_n)
1115 define_mpn(xor_n)
1116
1117 define(`ASM_START',
1118         `')
1119
1120 define(`PROLOGUE',
1121         `
1122         TEXT
1123         ALIGN(4)
1124         GLOBL   GSYM_PREFIX`$1'
1125         TYPE(GSYM_PREFIX`$1',`function')
1126 GSYM_PREFIX`$1':')
1127
1128 define(`EPILOGUE',
1129         `
1130         SIZE(GSYM_PREFIX`$1',.-GSYM_PREFIX`$1')')
1131
1132 dnl  LSYM_PREFIX might be L$, so defn() must be used to quote it or the L
1133 dnl  will expand as the L macro, an infinite recursion.
1134 define(`L',`defn(`LSYM_PREFIX')$1')
1135
1136 define(`INT32',
1137         `
1138         ALIGN(4)
1139 $1:
1140         W32     $2
1141         ')
1142
1143 define(`INT64',
1144         `
1145         ALIGN(8)
1146 $1:
1147         W32     $2
1148         W32     $3
1149         ')
1150
1151
1152 dnl  Usage: ALIGN(bytes)
1153 dnl
1154 dnl  Emit a ".align" directive.  The alignment is specified in bytes, and
1155 dnl  will normally need to be a power of 2.  The actual ".align" generated
1156 dnl  is either bytes or logarithmic according to what ./configure detects.
1157 dnl
1158 dnl  ALIGN_FILL_0x90, if defined and equal to "yes", means a ", 0x90" should
1159 dnl  be appended (this is for x86).
1160
1161 define(ALIGN,
1162 m4_assert_numargs(1)
1163 m4_assert_defined(`ALIGN_LOGARITHMIC')
1164 `.align ifelse(ALIGN_LOGARITHMIC,yes,`m4_log2($1)',`eval($1)')dnl
1165 ifelse(ALIGN_FILL_0x90,yes,`, 0x90')')
1166
1167
1168 dnl  Usage: MULFUNC_PROLOGUE(function function...)
1169 dnl
1170 dnl  A dummy macro which is grepped for by ./configure to know what
1171 dnl  functions a multi-function file is providing.  Use this if there aren't
1172 dnl  explicit PROLOGUE()s for each possible function.
1173 dnl
1174 dnl  Multiple MULFUNC_PROLOGUEs can be used, or just one with the function
1175 dnl  names separated by spaces.
1176
1177 define(`MULFUNC_PROLOGUE',
1178 m4_assert_numargs(1)
1179 `')
1180
1181
1182 divert`'dnl