277 lines
3.5 KiB
Plaintext
277 lines
3.5 KiB
Plaintext
; Comba/KCM Macros for C
|
|
;
|
|
; This version assumes the use of a base in the call to mirsys(.)
|
|
; which allows the sum of partial products to be stored in an mr_large
|
|
; for example 2^26 for a 32-bit processor (like a Pentium)
|
|
;
|
|
; In mirdef.h -
|
|
; #define MR_NOASM
|
|
; #define MR_NOFULLWIDTH
|
|
;
|
|
; Note that:
|
|
; mr_small is a word length unsigned type
|
|
; mr_large is a double word length unsigned type
|
|
;
|
|
; In this case the Triple register is just the variable sum
|
|
;
|
|
; See makemcs.txt for more information about this file
|
|
;
|
|
MACRO MUL_START
|
|
sum=0;
|
|
ENDM
|
|
;
|
|
; STEP macros
|
|
;
|
|
MACRO STEP
|
|
sum+=(mr_large)a[%d]*b[%d];
|
|
ENDM
|
|
;
|
|
; MFIN macro
|
|
;
|
|
MACRO MFIN
|
|
c[%d]=(mr_small)sum&mr_mip->base_mask;
|
|
sum>>=mr_mip->lg2b;
|
|
ENDM
|
|
;
|
|
; LAST
|
|
;
|
|
MACRO LAST
|
|
sum+=(mr_large)a[%d]*b[%d];
|
|
ENDM
|
|
;
|
|
; MULE
|
|
;
|
|
MACRO MUL_END
|
|
c[%d]=(mr_small)sum&mr_mip->base_mask;
|
|
ENDM
|
|
;
|
|
; SQR_START
|
|
;
|
|
MACRO SQR_START
|
|
sum=0;
|
|
ENDM
|
|
;
|
|
; DSTEP
|
|
;
|
|
MACRO DSTEP
|
|
pp1=(mr_large)a[%d]*a[%d];
|
|
sum+=pp1;
|
|
sum+=pp1;
|
|
ENDM
|
|
;
|
|
; SELF
|
|
;
|
|
MACRO SELF
|
|
pp1=(mr_large)a[%d];
|
|
pp1*=pp1;
|
|
sum+=pp1;
|
|
ENDM
|
|
;
|
|
; SFIN
|
|
;
|
|
MACRO SFIN
|
|
c[%d]=(mr_small)sum&mr_mip->base_mask;
|
|
sum>>=mr_mip->lg2b;
|
|
ENDM
|
|
;
|
|
; SQR_END
|
|
;
|
|
MACRO SQR_END
|
|
c[%d]=(mr_small)sum&mr_mip->base_mask;
|
|
ENDM
|
|
;
|
|
; REDC_START
|
|
;
|
|
MACRO REDC_START
|
|
sum=a[0];
|
|
ENDM
|
|
;
|
|
; RFINU macro
|
|
;
|
|
MACRO RFINU
|
|
sp=(mr_small)sum*ndash;
|
|
sp&=mr_mip->base_mask;
|
|
a[%d]=sp;
|
|
|
|
sum+=(mr_large)sp*b[0];
|
|
|
|
sum>>=mr_mip->lg2b;
|
|
|
|
sum+=(mr_large)a[%d+1];
|
|
ENDM
|
|
;
|
|
; RFIND macro
|
|
;
|
|
MACRO RFIND
|
|
a[%d]=(mr_small)sum&mr_mip->base_mask;
|
|
sum>>=mr_mip->lg2b;
|
|
sum+=(mr_large)a[%d+1];
|
|
ENDM
|
|
;
|
|
; REDC_END macro
|
|
;
|
|
MACRO REDC_END
|
|
a[%d]=(mr_small)sum&mr_mip->base_mask;
|
|
a[%d+1]=(mr_small)(sum>>mr_mip->lg2b);
|
|
ENDM
|
|
;
|
|
; ADD_START macro
|
|
;
|
|
MACRO ADD_START
|
|
|
|
c[0]=a[0]+b[0];
|
|
carry=(c[0]>>mr_mip->lg2b);
|
|
c[0]&=mr_mip->base_mask;
|
|
ENDM
|
|
;
|
|
; ADD macro - c[.]=a[.]+b[.]
|
|
;
|
|
MACRO ADD
|
|
su=a[%d]+b[%d]+carry;
|
|
c[%d]=su&mr_mip->base_mask;
|
|
carry=(su>>mr_mip->lg2b);
|
|
ENDM
|
|
;
|
|
; ADD_END macro.
|
|
;
|
|
MACRO ADD_END
|
|
ENDM
|
|
;
|
|
; DOUBLE_START macro
|
|
;
|
|
MACRO DOUBLE_START
|
|
a[0]+=a[0];
|
|
carry=(a[0]>>mr_mip->lg2b);
|
|
a[0]&=mr_mip->base_mask;
|
|
ENDM
|
|
;
|
|
; DOUBLE macro
|
|
;
|
|
MACRO DOUBLE
|
|
su=a[%d];
|
|
su+=su;
|
|
su+=carry;
|
|
a[%d]=su&mr_mip->base_mask;
|
|
carry=(su>>mr_mip->lg2b);
|
|
ENDM
|
|
;
|
|
; DOUBLE_END
|
|
;
|
|
MACRO DOUBLE_END
|
|
ENDM
|
|
;
|
|
; INC_START macro. Do first one.
|
|
;
|
|
MACRO INC_START
|
|
a[0]+=b[0];
|
|
carry=(a[0]>>mr_mip->lg2b);
|
|
a[0]&=mr_mip->base_mask;
|
|
ENDM
|
|
;
|
|
; INC macro a[.]+=b[.]
|
|
;
|
|
MACRO INC
|
|
su=a[%d]+b[%d]+carry;
|
|
a[%d]=su&mr_mip->base_mask;
|
|
carry=(su>>mr_mip->lg2b);
|
|
ENDM
|
|
MACRO INC_END
|
|
ENDM
|
|
MACRO SUB_START
|
|
c[0]=a[0]-b[0];
|
|
carry=(c[0]>>mr_mip->lg2b)&1;
|
|
c[0]&=mr_mip->base_mask;
|
|
ENDM
|
|
;
|
|
; SUB macro - c[.]=a[.]-b[.]
|
|
;
|
|
MACRO SUB
|
|
su=a[%d]-b[%d]-carry;
|
|
c[%d]=su&mr_mip->base_mask;
|
|
carry=(su>>mr_mip->lg2b)&1;
|
|
ENDM
|
|
MACRO SUB_END
|
|
ENDM
|
|
;
|
|
; DEC_START macro
|
|
;
|
|
MACRO DEC_START
|
|
a[0]-=b[0];
|
|
carry=(a[0]>>mr_mip->lg2b)&1;
|
|
a[0]&=mr_mip->base_mask;
|
|
|
|
ENDM
|
|
;
|
|
; DEC macro a[.]-=b[.]
|
|
;
|
|
MACRO DEC
|
|
su=a[%d]-b[%d]-carry;
|
|
a[%d]=su&mr_mip->base_mask;
|
|
carry=(su>>mr_mip->lg2b)&1;
|
|
ENDM
|
|
;
|
|
; DEC_END macro
|
|
;
|
|
MACRO DEC_END
|
|
ENDM
|
|
;
|
|
; KADD_START macro. Zero Carry
|
|
;
|
|
MACRO KADD_START
|
|
carry=0;
|
|
k%d:
|
|
ENDM
|
|
;
|
|
; KASL macro
|
|
;
|
|
MACRO KASL
|
|
n--;
|
|
if (n==0) goto k%d;
|
|
a+=%d;
|
|
b+=%d;
|
|
c+=%d;
|
|
goto k%d;
|
|
k%d:
|
|
ENDM
|
|
;
|
|
; KADD_END macro
|
|
;
|
|
MACRO KADD_END
|
|
ENDM
|
|
;
|
|
; KINC_START macro
|
|
;
|
|
MACRO KINC_START
|
|
carry=0;
|
|
k%d:
|
|
ENDM
|
|
;
|
|
; KIDL macro
|
|
;
|
|
MACRO KIDL
|
|
n--;
|
|
if (n==0) goto k%d;
|
|
a+=%d;
|
|
b+=%d;
|
|
goto k%d;
|
|
k%d:
|
|
ENDM
|
|
;
|
|
; KINC_END macro
|
|
;
|
|
MACRO KINC_END
|
|
ENDM
|
|
;
|
|
; KDEC_START macro. Zero carry
|
|
;
|
|
MACRO KDEC_START
|
|
carry=0;
|
|
k%d:
|
|
ENDM
|
|
;
|
|
; KDEC_END macro
|
|
;
|
|
MACRO KDEC_END
|
|
ENDM
|
|
|