KGC_TEST/miracl/source/gcc386.mcs

473 lines
9.1 KiB
Plaintext

; MCS file for Gnu GCC 80386-Pentium compiler
;
; *IMPORTANT*
; The optimizer may not like the generated code - if so switch it off
; Or try -fomit-frame-pointer. Or -fno-omit-frame-pointer
; With gcc V4.7 [-O2 -fno-omit-frame-pointer] works OK
;
; Sorry about all the %'s! Each % must be input here as %%
; Triple register is cl|edi|ebp
; MUL_START. Initialise registers. Make ebx and esi point to multipliers a
; and b. edi points at result c. Note edi is shared.
; Initialise Triple register to 0
; See makemcs.txt for more information about this file
;
MACRO PMUL_START
ASM (
"pushl %%%%ebp\n"
"pushl %%%%edi\n"
"pushl %%%%esi\n"
"movl %%0,%%%%ebx\n"
"movl %%1,%%%%esi\n"
"movl %%2,%%%%edi\n"
"xorl %%%%ecx,%%%%ecx\n"
"movl %%3,%%%%ebp\n"
ENDM
MACRO PMUL
"movl %%%%ebp,%%%%eax\n"
"mull 4*%d(%%%%ebx)\n"
"addl %%%%ecx,%%%%eax\n"
"adcl $0,%%%%edx\n"
"movl %%%%edx,%%%%ecx\n"
"movl $0,4*%d(%%%%esi)\n"
"movl %%%%eax,4*%d(%%%%edi)\n"
ENDM
MACRO PMUL_END
"movl %%%%ebp,%%%%eax\n"
"mull %%%%ecx\n"
"movl %%%%eax,(%%%%esi)\n"
"movl %%%%edx,4(%%%%esi)\n"
"popl %%%%esi\n"
"popl %%%%edi\n"
"popl %%%%ebp\n"
:
:"m"(a),"m"(b),"m"(c),"m"(sn)
:"eax","edi","esi","ebx","ecx","edx","memory"
);
ENDM
MACRO MUL_START
ASM (
"pushl %%%%ebp\n"
"pushl %%%%edi\n"
"pushl %%%%esi\n"
"movl %%0,%%%%ebx\n"
"movl %%1,%%%%esi\n"
"movl %%2,%%%%edi\n"
"pushl %%%%edi\n"
"xorl %%%%ecx,%%%%ecx\n"
"xorl %%%%edi,%%%%edi\n"
"xorl %%%%ebp,%%%%ebp\n"
ENDM
;
; STEP macro. Calculates a double-register partial product
; and adds it to the triple register total
; Parameters 1 & 2: Indices i and j for partial product multipliers a[i]
; and b[j]
MACRO STEP
"movl 4*%d(%%%%ebx),%%%%eax\n"
"mull 4*%d(%%%%esi)\n"
"addl %%%%eax,%%%%ebp\n"
"adcl %%%%edx,%%%%edi\n"
"adc %%%%ch,%%%%cl\n"
ENDM
;
; LAST
;
MACRO LAST
"movl 4*%d(%%%%ebx),%%%%eax\n"
"mull 4*%d(%%%%esi)\n"
"addl %%%%eax,%%%%ebp\n"
ENDM
;
; MFIN macro. Finish column calculation. Store Sum for this column
; and get Carry for next
; Parameter 1: Index k for Column Sum c[k]
MACRO MFIN
"movl %%%%edi,%%%%edx\n"
"popl %%%%edi\n"
"movl %%%%ebp,4*%d(%%%%edi)\n"
"pushl %%%%edi\n"
"movl %%%%edx,%%%%ebp\n"
"movl %%%%ecx,%%%%edi\n"
"xor %%%%cl,%%%%cl\n"
ENDM
;
; MUL_END
; Parameter 1: Index for final carry c[.]
MACRO MUL_END
"popl %%%%edi\n"
"movl %%%%ebp,4*%d(%%%%edi)\n"
"popl %%%%esi\n"
"popl %%%%edi\n"
"popl %%%%ebp\n"
:
:"m"(a),"m"(b),"m"(c)
:"eax","edi","esi","ebx","ecx","edx","memory"
);
ENDM
;
; SQR_START
;
MACRO SQR_START
ASM (
"pushl %%%%ebp\n"
"pushl %%%%edi\n"
"pushl %%%%esi\n"
"movl %%0,%%%%ebx\n"
"movl %%1,%%%%esi\n"
"xorl %%%%ecx,%%%%ecx\n"
"xorl %%%%edi,%%%%edi\n"
"xorl %%%%ebp,%%%%ebp\n"
ENDM
;
; DSTEP macro. Calculates a double-register partial product
; and add it twice to a triple register total
; Parameters 1 & 2 : Indices of partial product multipliers
MACRO DSTEP
"movl 4*%d(%%%%ebx),%%%%eax\n"
"mull 4*%d(%%%%ebx)\n"
"addl %%%%eax,%%%%ebp\n"
"adcl %%%%edx,%%%%edi\n"
"adc %%%%ch,%%%%cl\n"
"addl %%%%eax,%%%%ebp\n"
"adcl %%%%edx,%%%%edi\n"
"adc %%%%ch,%%%%cl\n"
ENDM
;
; SELF macro. Calculate the double-register square and
; add it to a triple register total
; Parameter 1 : Index of diagonal element
MACRO SELF
"movl 4*%d(%%%%ebx),%%%%eax\n"
"mull %%%%eax\n"
"addl %%%%eax,%%%%ebp\n"
"adcl %%%%edx,%%%%edi\n"
"adc %%%%ch,%%%%cl\n"
ENDM
;
; SFIN macro. Finish column calculation for squaring. Store Sum
; and get Carry for next column.
; Parameter 1: Index of Column Sum
MACRO SFIN
"movl %%%%ebp,4*%d(%%%%esi)\n"
"movl %%%%edi,%%%%ebp\n"
"movl %%%%ecx,%%%%edi\n"
"xor %%%%cl,%%%%cl\n"
ENDM
;
; SQR_END
; Parameter 1: Index for final carry
MACRO SQR_END
"movl %%%%ebp,4*%d(%%%%esi)\n"
"popl %%%%esi\n"
"popl %%%%edi\n"
"popl %%%%ebp\n"
:
:"m"(a),"m"(c)
:"eax","edi","esi","ebx","ecx","edx","memory"
);
ENDM
;
; REDC_START
;
MACRO REDC_START
ASM (
"pushl %%%%ebp\n"
"pushl %%%%edi\n"
"pushl %%%%esi\n"
"movl %%0,%%%%ebx\n"
"movl %%1,%%%%esi\n"
"movl %%2,%%%%edx\n"
"pushl %%%%edx\n"
"xorl %%%%edi,%%%%edi\n"
"xorl %%%%ecx,%%%%ecx\n"
"movl (%%%%ebx),%%%%ebp\n"
ENDM
;
; RFINU macro
;
MACRO RFINU
"movl %%%%ebp,%%%%eax\n"
"popl %%%%edx\n"
"pushl %%%%edx\n"
"mull %%%%edx\n"
"movl %%%%eax,4*%d(%%%%ebx)\n"
"mull (%%%%esi)\n"
"addl %%%%eax,%%%%ebp\n"
"adcl %%%%edx,%%%%edi\n"
"adc %%%%ch,%%%%cl\n"
"movl %%%%edi,%%%%ebp\n"
"movl %%%%ecx,%%%%edi\n"
"xorl %%%%ecx,%%%%ecx\n"
"addl 4*(%d+1)(%%%%ebx),%%%%ebp\n"
"adcl %%%%ecx,%%%%edi\n"
ENDM
;
; RFIND macro
;
MACRO RFIND
"movl %%%%ebp,4*%d(%%%%ebx)\n"
"movl %%%%edi,%%%%ebp\n"
"movl %%%%ecx,%%%%edi\n"
"xorl %%%%ecx,%%%%ecx\n"
"addl 4*(%d+1)(%%%%ebx),%%%%ebp\n"
"adcl %%%%ecx,%%%%edi\n"
ENDM
;
; REDC_END
;
MACRO REDC_END
"movl %%%%ebp,4*%d(%%%%ebx)\n"
"movl %%%%edi,4*(%d+1)(%%%%ebx)\n"
"popl %%%%edx\n"
"popl %%%%esi\n"
"popl %%%%edi\n"
"popl %%%%ebp\n"
:
:"m"(a),"m"(b),"m"(ndash)
:"eax","edi","esi","ebx","ecx","edx","memory"
);
ENDM
;
; ADD_START macro - initialise for add. Do first one
;
MACRO ADD_START
ASM (
"pushl %%%%esi\n"
"pushl %%%%edi\n"
"movl %%0,%%%%esi\n"
"movl %%1,%%%%ebx\n"
"movl %%3,%%%%edi\n"
"movl (%%%%esi),%%%%eax\n"
"addl (%%%%ebx),%%%%eax\n"
"movl %%%%eax,(%%%%edi)\n"
ENDM
;
; ADD macro. Add two numbers from memory and store result in memory.
; Don't forget carry bit
;
MACRO ADD
"movl 4*%d(%%%%esi),%%%%eax\n"
"adcl 4*%d(%%%%ebx),%%%%eax\n"
"movl %%%%eax,4*%d(%%%%edi)\n"
ENDM
;
; ADD_END macro. Catch Carry
;
MACRO ADD_END
"movl $0,%%%%eax\n"
"adcl %%%%eax,%%%%eax\n"
"movl %%%%eax,%%2\n"
"popl %%%%edi\n"
"popl %%%%esi\n"
:
:"m"(a),"m"(b),"m"(carry),"m"(c)
:"eax","edi","esi","ebx","memory"
);
ENDM
;
; INC_START macro
;
MACRO INC_START
ASM (
"pushl %%%%edi\n"
"movl %%0,%%%%edi\n"
"movl %%1,%%%%ebx\n"
"movl (%%%%ebx),%%%%eax\n"
"addl %%%%eax,(%%%%edi)\n"
ENDM
;
; INC macro. Increment number in memory. Don't forget carry
;
MACRO INC
"movl 4*%d(%%%%ebx),%%%%eax\n"
"adcl %%%%eax,4*%d(%%%%edi)\n"
ENDM
;
; INC_END macro. Catch Carry
;
MACRO INC_END
"movl $0,%%%%eax\n"
"adcl %%%%eax,%%%%eax\n"
"movl %%%%eax,%%2\n"
"popl %%%%edi\n"
:
:"m"(a),"m"(b),"m"(carry)
:"eax","edi","ebx","memory"
);
ENDM
;
; SUB_START macro. Do first one.
;
MACRO SUB_START
ASM (
"pushl %%%%esi\n"
"pushl %%%%edi\n"
"movl %%0,%%%%esi\n"
"movl %%1,%%%%ebx\n"
"movl %%3,%%%%edi\n"
"movl (%%%%esi),%%%%eax\n"
"subl (%%%%ebx),%%%%eax\n"
"movl %%%%eax,(%%%%edi)\n"
ENDM
;
; SUB macro. Subtract two numbers in memory and store result in memory.
;
MACRO SUB
"movl 4*%d(%%%%esi),%%%%eax\n"
"sbbl 4*%d(%%%%ebx),%%%%eax\n"
"movl %%%%eax,4*%d(%%%%edi)\n"
ENDM
;
; SUB_END macro. Catch Carry
;
MACRO SUB_END
"movl $0,%%%%eax\n"
"adcl %%%%eax,%%%%eax\n"
"movl %%%%eax,%%2\n"
"popl %%%%edi\n"
"popl %%%%esi\n"
:
:"m"(a),"m"(b),"m"(carry),"m"(c)
:"eax","edi","esi","ebx","memory"
);
ENDM
;
; DEC_START macro. Do first one.
;
MACRO DEC_START
ASM (
"pushl %%%%edi\n"
"movl %%0,%%%%edi\n"
"movl %%1,%%%%ebx\n"
"movl (%%%%ebx),%%%%eax\n"
"subl %%%%eax,(%%%%edi)\n"
ENDM
;
; DEC macro. Decrement from number in memory. Don't forget borrow.
;
MACRO DEC
"movl 4*%d(%%%%ebx),%%%%eax\n"
"sbbl %%%%eax,4*%d(%%%%edi)\n"
ENDM
;
; DEC_END macro
;
MACRO DEC_END
"movl $0,%%%%eax\n"
"adcl %%%%eax,%%%%eax\n"
"movl %%%%eax,%%2\n"
"popl %%%%edi\n"
:
:"m"(a),"m"(b),"m"(carry)
:"eax","edi","ebx","memory"
);
ENDM
;
; KADD_START macro
;
MACRO KADD_START
ASM (
"pushl %%%%esi\n"
"pushl %%%%edi\n"
"movl %%0,%%%%esi\n"
"movl %%1,%%%%ebx\n"
"movl %%3,%%%%edi\n"
"movl %%4,%%%%ecx\n"
"xorl %%%%eax,%%%%eax\n"
"k%d:\n"
ENDM
;
; KASL macro
;
MACRO KASL
"decl %%%%ecx\n"
"je k%d\n"
"leal 4*%d(%%%%esi),%%%%esi\n"
"leal 4*%d(%%%%ebx),%%%%ebx\n"
"leal 4*%d(%%%%edi),%%%%edi\n"
"jmp k%d\n"
"k%d:\n"
ENDM
;
; KADD_END macro
;
MACRO KADD_END
"movl $0,%%%%eax\n"
"adcl %%%%eax,%%%%eax\n"
"movl %%%%eax,%%2\n"
"popl %%%%edi\n"
"popl %%%%esi\n"
:
:"m"(a),"m"(b),"m"(carry),"m"(c),"m"(n)
:"eax","edi","esi","ebx","ecx","memory"
);
ENDM
;
; KINC_START macro. Zero carry flag.
;
MACRO KINC_START
ASM (
"pushl %%%%edi\n"
"movl %%0,%%%%edi\n"
"movl %%1,%%%%ebx\n"
"movl %%3,%%%%ecx\n"
"xorl %%%%eax,%%%%eax\n"
"k%d:\n"
ENDM
;
; KIDL macro
;
MACRO KIDL
"decl %%%%ecx\n"
"je k%d\n"
"leal 4*%d(%%%%ebx),%%%%ebx\n"
"leal 4*%d(%%%%edi),%%%%edi\n"
"jmp k%d\n"
"k%d:\n"
ENDM
;
; KINC_END macro
;
MACRO KINC_END
"movl $0,%%%%eax\n"
"adcl %%%%eax,%%%%eax\n"
"movl %%%%eax,%%2\n"
"popl %%%%edi\n"
:
:"m"(a),"m"(b),"m"(carry),"m"(n)
:"eax","edi","ebx","ecx","memory"
);
ENDM
;
; KDEC_START macro
;
MACRO KDEC_START
ASM (
"pushl %%%%edi\n"
"movl %%0,%%%%edi\n"
"movl %%1,%%%%ebx\n"
"movl %%3,%%%%ecx\n"
"xorl %%%%eax,%%%%eax\n"
"k%d:\n"
ENDM
;
; KDEC_END macro
;
MACRO KDEC_END
"movl $0,%%%%eax\n"
"adcl %%%%eax,%%%%eax\n"
"movl %%%%eax,%%2\n"
"popl %%%%edi\n"
:
:"m"(a),"m"(b),"m"(carry),"m"(n)
:"eax","edi","ebx","ecx","memory"
);
ENDM