408 lines
6.4 KiB
Plaintext
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
|