| divert(-1) |
| |
| |
| dnl Copyright 2000, 2002, 2003 Free Software Foundation, Inc. |
| |
| dnl This file is part of the GNU MP Library. |
| dnl |
| dnl The GNU MP Library is free software; you can redistribute it and/or modify |
| dnl it under the terms of either: |
| dnl |
| dnl * the GNU Lesser General Public License as published by the Free |
| dnl Software Foundation; either version 3 of the License, or (at your |
| dnl option) any later version. |
| dnl |
| dnl or |
| dnl |
| dnl * the GNU General Public License as published by the Free Software |
| dnl Foundation; either version 2 of the License, or (at your option) any |
| dnl later version. |
| dnl |
| dnl or both in parallel, as here. |
| dnl |
| dnl The GNU MP Library is distributed in the hope that it will be useful, but |
| dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
| dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| dnl for more details. |
| dnl |
| dnl You should have received copies of the GNU General Public License and the |
| dnl GNU Lesser General Public License along with the GNU MP Library. If not, |
| dnl see https://www.gnu.org/licenses/. |
| |
| |
| dnl ia64 assembler comments are C++ style "//" to the end of line. gas |
| dnl also accepts "#" as a comment, if it's the first non-blank on a line. |
| dnl |
| dnl BSD m4 can't handle a multi-character comment like "//" (see notes in |
| dnl mpn/asm-defs.m4). For now the default "#" is left, but with care taken |
| dnl not to put any macros after "foo#" (since of course they won't expand). |
| |
| |
| define(`ASM_START', |
| m4_assert_numargs(0) |
| `') |
| |
| |
| dnl Called: PROLOGUE_cpu(GSYM_PREFIX`'foo) |
| dnl EPILOGUE_cpu(GSYM_PREFIX`'foo) |
| dnl |
| dnl 32-byte alignment is used for the benefit of itanium-2, where the code |
| dnl fetcher will only take 2 bundles from a 32-byte aligned target. At |
| dnl 16mod32 it only reads 1 in the first cycle. This might not make any |
| dnl difference if the rotate buffers are full or there's other work holding |
| dnl up execution, but we use 32-bytes to give the best chance of peak |
| dnl throughput. |
| dnl |
| dnl We can use .align here despite the gas bug noted in mpn/ia64/README, |
| dnl since we're not expecting to execute across a PROLOGUE(), at least not |
| dnl currently. |
| |
| define(`PROLOGUE_cpu', |
| m4_assert_numargs(1) |
| ` |
| .text |
| .align 32 |
| .global $1# |
| .proc $1# |
| $1:') |
| |
| define(`EPILOGUE_cpu', |
| m4_assert_numargs(1) |
| ` |
| .endp $1# |
| ') |
| |
| define(`DATASTART', |
| `dnl |
| DATA |
| $1:') |
| define(`DATAEND',`dnl') |
| |
| define(`ASM_END',`dnl') |
| |
| |
| dnl Usage: ALIGN(bytes) |
| dnl |
| dnl Emit a ".align" directive. "bytes" is eval()ed, so can be an |
| dnl expression. |
| dnl |
| dnl This version overrides the definition in mpn/asm-defs.m4. We suppress |
| dnl any .align if the gas byte-swapped-nops bug was detected by configure |
| dnl GMP_ASM_IA64_ALIGN_OK. |
| |
| define(`ALIGN', |
| m4_assert_numargs(1) |
| m4_assert_defined(`IA64_ALIGN_OK') |
| `ifelse(IA64_ALIGN_OK,no,, |
| `.align eval($1)')') |
| |
| |
| dnl Usage: ASSERT([pr] [,code]) |
| dnl |
| dnl Require that the given predicate register is true after executing the |
| dnl test code. For example, |
| dnl |
| dnl ASSERT(p6, |
| dnl ` cmp.eq p6,p0 = r3, r4') |
| dnl |
| dnl If the predicate register argument is empty then nothing is tested, the |
| dnl code is just executed. This can be used for setups required by later |
| dnl ASSERTs. The code argument can be omitted to just test a predicate |
| dnl with no special setup code. |
| dnl |
| dnl For convenience, stops are inserted before and after the code emitted. |
| |
| define(ASSERT, |
| m4_assert_numargs_range(1,2) |
| m4_assert_defined(`WANT_ASSERT') |
| `ifelse(WANT_ASSERT,1, |
| ` ;; |
| ifelse(`$2',,, |
| `$2 |
| ;; |
| ') |
| ifelse(`$1',,, |
| `($1) br .LASSERTok`'ASSERT_label_counter ;; |
| cmp.ne p6,p6 = r0, r0 C illegal instruction |
| ;; |
| .LASSERTok`'ASSERT_label_counter: |
| define(`ASSERT_label_counter',eval(ASSERT_label_counter+1)) |
| ') |
| ')') |
| define(`ASSERT_label_counter',1) |
| |
| define(`getfsig', `getf.sig') |
| define(`setfsig', `setf.sig') |
| define(`cmpeq', `cmp.eq') |
| define(`cmpne', `cmp.ne') |
| define(`cmpltu', `cmp.ltu') |
| define(`cmpleu', `cmp.leu') |
| define(`cmpgtu', `cmp.gtu') |
| define(`cmpgeu', `cmp.geu') |
| define(`cmple', `cmp.le') |
| define(`cmpgt', `cmp.gt') |
| define(`cmpeqor', `cmp.eq.or') |
| define(`cmpequc', `cmp.eq.unc') |
| |
| divert |