KGC_TEST/miracl/source/gccmsp430.mcs

408 lines
6.4 KiB
Plaintext

; Comba/KCM Macros for TI msp430
;
; Triple register is r11|r10|r9
;
; See makemcs.txt for more information about this file
;
; Contributed by Piotr Szczechowiak
; (uses hardware multiplier)
;
MACRO MUL_START
asm(
"mov %%[a],r13\n\t"
"mov %%[b],r14\n\t"
"mov %%[c],r15\n\t"
"clr r9\n\t"
"clr r10\n\t"
"clr r11\n\t"
"clr r12\n\t"
"push r2\n\t"
"dint\n\t"
"nop\n\t"
ENDM
;
; STEP macros
;
MACRO STEP
"mov 2*%d(r13),&__MPY\n\t"
"mov 2*%d(r14),&__OP2\n\t"
"add &__RESLO,r9\n\t"
"addc &__RESHI,r10\n\t"
"addc r12,r11\n\t"
ENDM
;
; MFIN macro
;
MACRO MFIN
"mov r9,2*%d(r15)\n\t"
"mov r10,r9\n\t"
"mov r11,r10\n\t"
"clr r11\n\t"
ENDM
;
; LAST
;
MACRO LAST
"mov 2*%d(r13),&__MPY\n\t"
"mov 2*%d(r14),&__OP2\n\t"
"add &__RESLO,r9\n\t"
ENDM
;
; MULE
;
MACRO MUL_END
"mov r9,2*%d(r15)\n\t"
"pop r2\n\t"
"eint\n\t"
:
: [a] "m" (a), [b] "m" (b), [c] "m" (c)
:"r9","r10","r11","r12","r13","r14","r15"
);
ENDM
;
; SQR_START
;
MACRO SQR_START
asm(
"mov %%[a],r14\n\t"
"mov %%[c],r15\n\t"
"clr r10\n\t"
"clr r11\n\t"
"clr r12\n\t"
"clr r13\n\t"
"push r2\n\t"
"dint\n\t"
"nop\n\t"
ENDM
;
; DSTEP
;
MACRO DSTEP
"mov 2*%d(r14),&__MPY\n\t"
"mov 2*%d(r14),&__OP2\n\t"
"add &__RESLO,r10\n\t"
"addc &__RESHI,r11\n\t"
"addc r13,r12\n\t"
"add &__RESLO,r10\n\t"
"addc &__RESHI,r11\n\t"
"addc r13,r12\n\t"
ENDM
;
; SELF
;
MACRO SELF
"mov 2*%d(r14),&__MPY\n\t"
"mov 2*%d(r14),&__OP2\n\t"
"add &__RESLO,r10\n\t"
"addc &__RESHI,r11\n\t"
"addc r13,r12\n\t"
ENDM
;
; SFIN
;
MACRO SFIN
"mov r10,2*%d(r15)\n\t"
"mov r11,r10\n\t"
"mov r12,r11\n\t"
"clr r12\n\t"
ENDM
;
; SQR_END
;
MACRO SQR_END
"mov r10,2*%d(r15)\n\t"
"pop r2\n\t"
"eint\n\t"
:
: [a] "m" (a), [c] "m" (c)
:"r10","r11","r12","r13","r14","r15"
);
ENDM
;
; REDC_START
;
MACRO REDC_START
asm(
"mov %%[a],r13\n\t"
"mov %%[b],r14\n\t"
"mov %%[ndash],r15\n\t"
"clr r9\n\t"
"clr r10\n\t"
"clr r11\n\t"
"clr r12\n\t"
"mov @r13,r9\n\t"
"push r2\n\t"
"dint\n\t"
"nop\n\t"
ENDM
;
; RFINU macro
;
MACRO RFINU
"mov r9,&__MPY\n\t"
"mov @r15,&__OP2\n\t"
"add &__RESLO,2*%d(r13)\n\t"
"mov @r14,&__MPY\n\t"
"mov &__RESLO,&__OP2\n\t"
"add &__RESLO,r9\n\t"
"addc &__RESHI,r10\n\t"
"addc r12,r11\n\t"
"mov r10,r9\n\t"
"mov r11,r10\n\t"
"clr r11\n\t"
"add 2*%d+1(r13),r9\n\t"
"addc r12,r10\n\t"
"clr r11\n\t"
ENDM
;
; RFIND macro
;
MACRO RFIND
"mov r9,2*%d(r13)\n\t"
"mov r10,r9\n\t"
"mov r11,r10\n\t"
"clr r11\n\t"
"add 2*%d+1(r13),r9\n\t"
"addc r12,r10\n\t"
"clr r11\n\t"
ENDM
;
; REDC_END macro
;
MACRO REDC_END
"mov r9,2*%d(r15)\n\t"
"mov r10,2*%d+1(r15)\n\t"
"pop r2\n\t"
"eint\n\t"
:
: [a] "m" (a), [b] "m" (b), [ndash] "m" (ndash)
:"r9","r10","r11","r12","r13","r14","r15"
);
ENDM
;
; ADD_START macro
;
MACRO ADD_START
asm(
"mov %%[a],r11\n\t"
"mov %%[b],r12\n\t"
"mov @r11+,r13\n\t"
"mov @r12+,r14\n\t"
"add r14,r13\n\t"
"mov %%[c],r15\n\t"
"mov r13,2*0(r15)\n\t"
ENDM
;
; ADD macro - c[.]=a[.]+b[.]
;
MACRO ADD
"mov @r11+,r13\n\t"
"mov @r12+,r14\n\t"
"addc r14,r13\n\t"
"mov r13,2*%d(r15)\n\t"
ENDM
;
; ADD_END macro.
;
MACRO ADD_END
"clr r14\n\t"
"adc r14\n\t"
"mov r14,%%[carry]\n\t"
: [carry] "=m" (carry)
: [a] "m" (a), [b] "m" (b), [c] "m" (c), "[carry]" (carry)
:"r11","r12","r13","r14","r15"
);
ENDM
;
; INC_START macro. Do first one.
;
MACRO INC_START
asm(
"mov %%[a],r12\n\t"
"mov %%[b],r13\n\t"
"mov 2*0(r12),r14\n\t"
"mov @r13+,r15\n\t"
"add r15,r14\n\t"
"mov r14,2*0(r12)\n\t"
ENDM
;
; INC macro a[.]+=b[.]
;
MACRO INC
"mov 2*%d(r12),r14\n\t"
"mov @r13+,r15\n\t"
"addc r15,r14\n\t"
"mov r14,2*%d(r12)\n\t"
ENDM
MACRO INC_END
"clr r15\n\t"
"adc r15\n\t"
"mov r15,%%[carry]\n\t"
: [carry] "=m" (carry)
: [a] "m" (a), [b] "m" (b), "[carry]" (carry)
:"r12","r13","r14","r15"
);
ENDM
MACRO SUB_START
asm(
"mov %%[a],r11\n\t"
"mov %%[b],r12\n\t"
"mov @r11+,r13\n\t"
"mov @r12+,r14\n\t"
"sub r14,r13\n\t"
"mov %%[c],r15\n\t"
"mov r13,2*0(r15)\n\t"
ENDM
;
; SUB macro - c[.]=a[.]-b[.]
;
MACRO SUB
"mov @r11+,r13\n\t"
"mov @r12+,r14\n\t"
"subc r14,r13\n\t"
"mov r13,2*%d(r15)\n\t"
ENDM
MACRO SUB_END
"clr r14\n\t"
"adc r14\n\t"
"xor.b #1,r14\n\t"
"mov r14,%%[carry]\n\t"
: [carry] "=m" (carry)
: [a] "m" (a), [b] "m" (b), [c] "m" (c), "[carry]" (carry)
:"r11","r12","r13","r14","r15"
);
ENDM
;
; DEC_START macro
;
MACRO DEC_START
asm(
"mov %%[a],r12\n\t"
"mov %%[b],r13\n\t"
"mov 2*0(r12),r14\n\t"
"mov @r13+,r15\n\t"
"sub r15,r14\n\t"
"mov r14,2*0(r12)\n\t"
ENDM
;
; DEC macro a[.]-=b[.]
;
MACRO DEC
"mov 2*%d(r12),r14\n\t"
"mov @r13+,r15\n\t"
"subc r15,r14\n\t"
"mov r14,2*%d(r12)\n\t"
ENDM
;
; DEC_END macro
;
MACRO DEC_END
"clr r15\n\t"
"adc r15\n\t"
"xor.b #1,r15\n\t"
"mov r15,%%[carry]\n\t"
: [carry] "=m" (carry)
: [a] "m" (a), [b] "m" (b), "[carry]" (carry)
:"r12","r13","r14","r15"
);
ENDM
;
; KADD_START macro. Zero Carry
;
MACRO KADD_START
asm(
"mov %%[a],r12\n\t"
"mov %%[b],r13\n\t"
"mov %%[c],r14\n\t"
"mov %%[n],r15\n\t"
"clrc\n\t"
"k%d:\n"
ENDM
;
; KASL macro
;
MACRO KASL
"dec r15\n\t"
"jz k%d\n\t"
"clr r11\n\t"
"adc r11\n\t"
"add #2*%d,r12\n\t"
"add #2*%d,r13\n\t"
"add #2*%d,r14\n\t"
"rrc r11\n\t"
"jmp k%d\n\t"
"k%d:\n\t"
ENDM
;
; KADD_END macro
;
MACRO KADD_END
"clr r11\n\t"
"adc r11\n\t"
"mov r11,%%[carry]\n\t"
: [carry] "=m" (carry)
: [a] "m" (a), [b] "m" (b), [c] "m" (c) , [n] "m" (n), "[carry]" (carry)
:"r11","r12","r13","r14","r15"
);
ENDM
;
; KINC_START macro
;
MACRO KINC_START
asm(
"mov %%[a],r12\n\t"
"mov %%[b],r13\n\t"
"mov %%[n],r15\n\t"
"clrc\n\t"
"k%d:\n"
ENDM
;
; KIDL macro
;
MACRO KIDL
"dec r15\n\t"
"jz k%d\n\t"
"clr r14\n\t"
"adc r14\n\t"
"add #2*%d,r12\n\t"
"add #2*%d,r13\n\t"
"rrc r14\n\t"
"jmp k%d\n\t"
"k%d:\n\t"
ENDM
;
; KINC_END macro
;
MACRO KINC_END
"clr r14\n\t"
"adc r14\n\t"
"mov r14,%%[carry]\n\t"
: [carry] "=m" (carry)
: [a] "m" (a), [b] "m" (b), [n] "m" (n), "[carry]" (carry)
:"r12","r13","r14","r15"
);
ENDM
;
; KDEC_START macro. Zero carry
;
MACRO KDEC_START
asm(
"mov %%[a],r12\n\t"
"mov %%[b],r13\n\t"
"mov %%[n],r15\n\t"
"clrc\n\t"
"k%d:\n"
ENDM
;
; KDEC_END macro
;
MACRO KDEC_END
"clr r14\n\t"
"adc r14\n\t"
"mov r14,%%[carry]\n\t"
: [carry] "=m" (carry)
: [a] "m" (a), [b] "m" (b), [n] "m" (n), "[carry]" (carry)
:"r12","r13","r14","r15"
);
ENDM