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