summaryrefslogtreecommitdiff
path: root/mpn/x86_64/aorsmul_1.asm
diff options
context:
space:
mode:
Diffstat (limited to 'mpn/x86_64/aorsmul_1.asm')
-rw-r--r--mpn/x86_64/aorsmul_1.asm51
1 files changed, 38 insertions, 13 deletions
diff --git a/mpn/x86_64/aorsmul_1.asm b/mpn/x86_64/aorsmul_1.asm
index 9c64d56fc..a406bc9e8 100644
--- a/mpn/x86_64/aorsmul_1.asm
+++ b/mpn/x86_64/aorsmul_1.asm
@@ -1,6 +1,6 @@
dnl AMD64 mpn_addmul_1 and mpn_submul_1.
-dnl Copyright 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+dnl Copyright 2003, 2004, 2005, 2007, 2008, 2011 Free Software Foundation, Inc.
dnl This file is part of the GNU MP Library.
@@ -28,20 +28,27 @@ C Intel corei ?
C Intel atom 21.3
C VIA nano 5.5
-C The inner loop of this code is the result of running a code generation and
+C The loop of this code is the result of running a code generation and
C optimization tool suite written by David Harvey and Torbjorn Granlund.
-C TODO:
-C * The inner loop is great, but the prologue and epilogue code was
-C quickly written. Tune it!
+C TODO
+C * The loop is great, but the prologue and epilogue code was quickly written.
+C Tune it!
-C INPUT PARAMETERS
-define(`rp', `%rdi')
-define(`up', `%rsi')
-define(`n_param',`%rdx')
-define(`vl', `%rcx')
+define(`rp', `%rdi') C rcx
+define(`up', `%rsi') C rdx
+define(`n_param', `%rdx') C r8
+define(`vl', `%rcx') C r9
-define(`n', `%r11')
+define(`n', `%r11')
+
+ifdef(`HOST_DOS64',`
+ define(`IFDOS', `$1')
+ define(`IFELF', `')
+',`
+ define(`IFDOS', `')
+ define(`IFELF', `$1')
+')
ifdef(`OPERATION_addmul_1',`
define(`ADDSUB', `add')
@@ -52,17 +59,33 @@ ifdef(`OPERATION_submul_1',`
define(`func', `mpn_submul_1')
')
+ABI_SUPPORT(DOS64)
+ABI_SUPPORT(ELF64)
+
MULFUNC_PROLOGUE(mpn_addmul_1 mpn_submul_1)
+IFDOS(` define(`up', ``%rsi'') ') dnl
+IFDOS(` define(`rp', ``%rcx'') ') dnl
+IFDOS(` define(`vl', ``%r9'') ') dnl
+IFDOS(` define(`r9', ``rdi'') ') dnl
+IFDOS(` define(`n', ``%r8'') ') dnl
+IFDOS(` define(`r8', ``r11'') ') dnl
+
ASM_START()
TEXT
ALIGN(16)
PROLOGUE(func)
+
+IFDOS(``push %rsi '')
+IFDOS(``push %rdi '')
+IFDOS(``mov %rdx, %rsi '')
+
mov (up), %rax C read first u limb early
push %rbx
- mov n_param, %rbx C move away n from rdx, mul uses it
+IFELF(` mov n_param, %rbx ') C move away n from rdx, mul uses it
+IFDOS(` mov n, %rbx ')
mul vl
- mov %rbx, n
+IFELF(` mov %rbx, n ')
and $3, R32(%rbx)
jz L(b0)
@@ -145,5 +168,7 @@ L(ret): adc $0, %rdx
mov %rdx, %rax
pop %rbx
+IFDOS(``pop %rdi '')
+IFDOS(``pop %rsi '')
ret
EPILOGUE()