KGC_TEST/miracl/source/cs.mcs

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