1 1.1 mrg dnl AMD64 mpn_invert_limb -- Invert a normalized limb. 2 1.1 mrg 3 1.1.1.3 mrg dnl Contributed to the GNU project by Torbjorn Granlund and Niels Mller. 4 1.1 mrg 5 1.1.1.3 mrg dnl Copyright 2004, 2007-2009, 2011, 2012 Free Software Foundation, Inc. 6 1.1 mrg 7 1.1 mrg dnl This file is part of the GNU MP Library. 8 1.1.1.3 mrg dnl 9 1.1 mrg dnl The GNU MP Library is free software; you can redistribute it and/or modify 10 1.1.1.3 mrg dnl it under the terms of either: 11 1.1.1.3 mrg dnl 12 1.1.1.3 mrg dnl * the GNU Lesser General Public License as published by the Free 13 1.1.1.3 mrg dnl Software Foundation; either version 3 of the License, or (at your 14 1.1.1.3 mrg dnl option) any later version. 15 1.1.1.3 mrg dnl 16 1.1.1.3 mrg dnl or 17 1.1.1.3 mrg dnl 18 1.1.1.3 mrg dnl * the GNU General Public License as published by the Free Software 19 1.1.1.3 mrg dnl Foundation; either version 2 of the License, or (at your option) any 20 1.1.1.3 mrg dnl later version. 21 1.1.1.3 mrg dnl 22 1.1.1.3 mrg dnl or both in parallel, as here. 23 1.1.1.3 mrg dnl 24 1.1 mrg dnl The GNU MP Library is distributed in the hope that it will be useful, but 25 1.1 mrg dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 26 1.1.1.3 mrg dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 27 1.1.1.3 mrg dnl for more details. 28 1.1.1.3 mrg dnl 29 1.1.1.3 mrg dnl You should have received copies of the GNU General Public License and the 30 1.1.1.3 mrg dnl GNU Lesser General Public License along with the GNU MP Library. If not, 31 1.1.1.3 mrg dnl see https://www.gnu.org/licenses/. 32 1.1 mrg 33 1.1 mrg include(`../config.m4') 34 1.1 mrg 35 1.1 mrg 36 1.1 mrg C cycles/limb (approx) div 37 1.1.1.2 mrg C AMD K8,K9 48 71 38 1.1.1.2 mrg C AMD K10 48 77 39 1.1.1.2 mrg C Intel P4 135 161 40 1.1.1.2 mrg C Intel core2 69 116 41 1.1.1.2 mrg C Intel corei 55 89 42 1.1.1.2 mrg C Intel atom 129 191 43 1.1.1.2 mrg C VIA nano 79 157 44 1.1 mrg 45 1.1 mrg C rax rcx rdx rdi rsi r8 46 1.1 mrg 47 1.1.1.2 mrg ABI_SUPPORT(DOS64) 48 1.1.1.2 mrg ABI_SUPPORT(STD64) 49 1.1.1.2 mrg 50 1.1.1.2 mrg PROTECT(`mpn_invert_limb_table') 51 1.1 mrg 52 1.1 mrg ASM_START() 53 1.1 mrg TEXT 54 1.1 mrg ALIGN(16) 55 1.1 mrg PROLOGUE(mpn_invert_limb) C Kn C2 Ci 56 1.1.1.2 mrg FUNC_ENTRY(1) 57 1.1 mrg mov %rdi, %rax C 0 0 0 58 1.1 mrg shr $55, %rax C 1 1 1 59 1.1 mrg ifdef(`DARWIN',` 60 1.1.1.4 mrg lea mpn_invert_limb_table(%rip), %r8 61 1.1 mrg add $-512, %r8 62 1.1 mrg ',` 63 1.1.1.2 mrg lea -512+mpn_invert_limb_table(%rip), %r8 64 1.1 mrg ') 65 1.1 mrg movzwl (%r8,%rax,2), R32(%rcx) C %rcx = v0 66 1.1 mrg 67 1.1 mrg C v1 = (v0 << 11) - (v0*v0*d40 >> 40) - 1 68 1.1 mrg mov %rdi, %rsi C 0 0 0 69 1.1 mrg mov R32(%rcx), R32(%rax) C 4 5 5 70 1.1 mrg imul R32(%rcx), R32(%rcx) C 4 5 5 71 1.1 mrg shr $24, %rsi C 1 1 1 72 1.1 mrg inc %rsi C %rsi = d40 73 1.1 mrg imul %rsi, %rcx C 8 10 8 74 1.1 mrg shr $40, %rcx C 12 15 11 75 1.1 mrg sal $11, R32(%rax) C 5 6 6 76 1.1 mrg dec R32(%rax) 77 1.1 mrg sub R32(%rcx), R32(%rax) C %rax = v1 78 1.1 mrg 79 1.1.1.2 mrg C v2 = (v1 << 13) + (v1 * (2^60 - v1*d40) >> 47) 80 1.1 mrg mov $0x1000000000000000, %rcx 81 1.1 mrg imul %rax, %rsi C 14 17 13 82 1.1 mrg sub %rsi, %rcx 83 1.1 mrg imul %rax, %rcx 84 1.1 mrg sal $13, %rax 85 1.1 mrg shr $47, %rcx 86 1.1 mrg add %rax, %rcx C %rcx = v2 87 1.1 mrg 88 1.1.1.4 mrg C v3 = (v2 << 31) + (v2 * (2^96 - v2 * d63 + ((v2 >> 1) & mask)) >> 65) 89 1.1 mrg mov %rdi, %rsi C 0 0 0 90 1.1.1.2 mrg shr %rsi C d/2 91 1.1 mrg sbb %rax, %rax C -d0 = -(d mod 2) 92 1.1 mrg sub %rax, %rsi C d63 = ceil(d/2) 93 1.1 mrg imul %rcx, %rsi C v2 * d63 94 1.1 mrg and %rcx, %rax C v2 * d0 95 1.1.1.2 mrg shr %rax C (v2>>1) * d0 96 1.1 mrg sub %rsi, %rax C (v2>>1) * d0 - v2 * d63 97 1.1 mrg mul %rcx 98 1.1 mrg sal $31, %rcx 99 1.1.1.2 mrg shr %rdx 100 1.1 mrg add %rdx, %rcx C %rcx = v3 101 1.1 mrg 102 1.1 mrg mov %rdi, %rax 103 1.1 mrg mul %rcx 104 1.1 mrg add %rdi, %rax 105 1.1 mrg mov %rcx, %rax 106 1.1 mrg adc %rdi, %rdx 107 1.1 mrg sub %rdx, %rax 108 1.1 mrg 109 1.1.1.2 mrg FUNC_EXIT() 110 1.1 mrg ret 111 1.1 mrg EPILOGUE() 112 1.1 mrg ASM_END() 113