Annotation of OpenXM_contrib/gmp/mpn/x86/pentium/aors_n.asm, Revision 1.1
1.1 ! maekawa 1: dnl Intel Pentium mpn_add_n/mpn_sub_n -- mpn addition and subtraction.
! 2: dnl
! 3: dnl P5: 2.375 cycles/limb
! 4:
! 5:
! 6: dnl Copyright (C) 1992, 1994, 1995, 1996, 1999, 2000 Free Software
! 7: dnl Foundation, Inc.
! 8: dnl
! 9: dnl This file is part of the GNU MP Library.
! 10: dnl
! 11: dnl The GNU MP Library is free software; you can redistribute it and/or
! 12: dnl modify it under the terms of the GNU Lesser General Public License as
! 13: dnl published by the Free Software Foundation; either version 2.1 of the
! 14: dnl License, or (at your option) any later version.
! 15: dnl
! 16: dnl The GNU MP Library is distributed in the hope that it will be useful,
! 17: dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
! 18: dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 19: dnl Lesser General Public License for more details.
! 20: dnl
! 21: dnl You should have received a copy of the GNU Lesser General Public
! 22: dnl License along with the GNU MP Library; see the file COPYING.LIB. If
! 23: dnl not, write to the Free Software Foundation, Inc., 59 Temple Place -
! 24: dnl Suite 330, Boston, MA 02111-1307, USA.
! 25:
! 26:
! 27: include(`../config.m4')
! 28:
! 29:
! 30: ifdef(`OPERATION_add_n',`
! 31: define(M4_inst, adcl)
! 32: define(M4_function_n, mpn_add_n)
! 33: define(M4_function_nc, mpn_add_nc)
! 34:
! 35: ',`ifdef(`OPERATION_sub_n',`
! 36: define(M4_inst, sbbl)
! 37: define(M4_function_n, mpn_sub_n)
! 38: define(M4_function_nc, mpn_sub_nc)
! 39:
! 40: ',`m4_error(`Need OPERATION_add_n or OPERATION_sub_n
! 41: ')')')
! 42:
! 43: MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc)
! 44:
! 45:
! 46: C mp_limb_t M4_function_n (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
! 47: C mp_size_t size);
! 48: C mp_limb_t M4_function_nc (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
! 49: C mp_size_t size, mp_limb_t carry);
! 50:
! 51: defframe(PARAM_CARRY,20)
! 52: defframe(PARAM_SIZE, 16)
! 53: defframe(PARAM_SRC2, 12)
! 54: defframe(PARAM_SRC1, 8)
! 55: defframe(PARAM_DST, 4)
! 56:
! 57: .text
! 58: ALIGN(8)
! 59: PROLOGUE(M4_function_nc)
! 60:
! 61: pushl %edi
! 62: pushl %esi
! 63: pushl %ebx
! 64: pushl %ebp
! 65: deflit(`FRAME',16)
! 66:
! 67: movl PARAM_DST,%edi
! 68: movl PARAM_SRC1,%esi
! 69: movl PARAM_SRC2,%ebp
! 70: movl PARAM_SIZE,%ecx
! 71:
! 72: movl (%ebp),%ebx
! 73:
! 74: decl %ecx
! 75: movl %ecx,%edx
! 76: shrl $3,%ecx
! 77: andl $7,%edx
! 78: testl %ecx,%ecx C zero carry flag
! 79: jz L(endgo)
! 80:
! 81: pushl %edx
! 82: FRAME_pushl()
! 83: movl PARAM_CARRY,%eax
! 84: shrl $1,%eax C shift bit 0 into carry
! 85: jmp LF(M4_function_n,oop)
! 86:
! 87: L(endgo):
! 88: deflit(`FRAME',16)
! 89: movl PARAM_CARRY,%eax
! 90: shrl $1,%eax C shift bit 0 into carry
! 91: jmp LF(M4_function_n,end)
! 92:
! 93: EPILOGUE()
! 94:
! 95:
! 96: ALIGN(8)
! 97: PROLOGUE(M4_function_n)
! 98:
! 99: pushl %edi
! 100: pushl %esi
! 101: pushl %ebx
! 102: pushl %ebp
! 103: deflit(`FRAME',16)
! 104:
! 105: movl PARAM_DST,%edi
! 106: movl PARAM_SRC1,%esi
! 107: movl PARAM_SRC2,%ebp
! 108: movl PARAM_SIZE,%ecx
! 109:
! 110: movl (%ebp),%ebx
! 111:
! 112: decl %ecx
! 113: movl %ecx,%edx
! 114: shrl $3,%ecx
! 115: andl $7,%edx
! 116: testl %ecx,%ecx C zero carry flag
! 117: jz L(end)
! 118: pushl %edx
! 119: FRAME_pushl()
! 120:
! 121: ALIGN(8)
! 122: L(oop): movl 28(%edi),%eax C fetch destination cache line
! 123: leal 32(%edi),%edi
! 124:
! 125: L(1): movl (%esi),%eax
! 126: movl 4(%esi),%edx
! 127: M4_inst %ebx,%eax
! 128: movl 4(%ebp),%ebx
! 129: M4_inst %ebx,%edx
! 130: movl 8(%ebp),%ebx
! 131: movl %eax,-32(%edi)
! 132: movl %edx,-28(%edi)
! 133:
! 134: L(2): movl 8(%esi),%eax
! 135: movl 12(%esi),%edx
! 136: M4_inst %ebx,%eax
! 137: movl 12(%ebp),%ebx
! 138: M4_inst %ebx,%edx
! 139: movl 16(%ebp),%ebx
! 140: movl %eax,-24(%edi)
! 141: movl %edx,-20(%edi)
! 142:
! 143: L(3): movl 16(%esi),%eax
! 144: movl 20(%esi),%edx
! 145: M4_inst %ebx,%eax
! 146: movl 20(%ebp),%ebx
! 147: M4_inst %ebx,%edx
! 148: movl 24(%ebp),%ebx
! 149: movl %eax,-16(%edi)
! 150: movl %edx,-12(%edi)
! 151:
! 152: L(4): movl 24(%esi),%eax
! 153: movl 28(%esi),%edx
! 154: M4_inst %ebx,%eax
! 155: movl 28(%ebp),%ebx
! 156: M4_inst %ebx,%edx
! 157: movl 32(%ebp),%ebx
! 158: movl %eax,-8(%edi)
! 159: movl %edx,-4(%edi)
! 160:
! 161: leal 32(%esi),%esi
! 162: leal 32(%ebp),%ebp
! 163: decl %ecx
! 164: jnz L(oop)
! 165:
! 166: popl %edx
! 167: FRAME_popl()
! 168: L(end):
! 169: decl %edx C test %edx w/o clobbering carry
! 170: js L(end2)
! 171: incl %edx
! 172: L(oop2):
! 173: leal 4(%edi),%edi
! 174: movl (%esi),%eax
! 175: M4_inst %ebx,%eax
! 176: movl 4(%ebp),%ebx
! 177: movl %eax,-4(%edi)
! 178: leal 4(%esi),%esi
! 179: leal 4(%ebp),%ebp
! 180: decl %edx
! 181: jnz L(oop2)
! 182: L(end2):
! 183: movl (%esi),%eax
! 184: M4_inst %ebx,%eax
! 185: movl %eax,(%edi)
! 186:
! 187: sbbl %eax,%eax
! 188: negl %eax
! 189:
! 190: popl %ebp
! 191: popl %ebx
! 192: popl %esi
! 193: popl %edi
! 194: ret
! 195:
! 196: EPILOGUE()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>