⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bn_asm.c

📁 RMI的处理器au1200系列所用的BOOTLOAD,包括SD卡启动USB启动硬盘启动网络启动,并初始化硬件的所有参数,支持内核调试.
💻 C
📖 第 1 页 / 共 2 页
字号:
	r[1] = (t1 - t2 - c) & BN_MASK2;	if (t1 != t2)	    c = (t1 < t2);	if (--n <= 0)	    break;	t1 = a[2];	t2 = b[2];	r[2] = (t1 - t2 - c) & BN_MASK2;	if (t1 != t2)	    c = (t1 < t2);	if (--n <= 0)	    break;	t1 = a[3];	t2 = b[3];	r[3] = (t1 - t2 - c) & BN_MASK2;	if (t1 != t2)	    c = (t1 < t2);	if (--n <= 0)	    break;	a += 4;	b += 4;	r += 4;    }    return (c);}#ifdef BN_MUL_COMBA#undef bn_mul_comba8#undef bn_mul_comba4#undef bn_sqr_comba8#undef bn_sqr_comba4/* mul_add_c(a,b,c0,c1,c2)  -- c+=a*b for three word number c=(c2,c1,c0) *//* mul_add_c2(a,b,c0,c1,c2) -- c+=2*a*b for three word number c=(c2,c1,c0) *//* sqr_add_c(a,i,c0,c1,c2)  -- c+=a[i]^2 for three word number c=(c2,c1,c0) *//* sqr_add_c2(a,i,c0,c1,c2) -- c+=2*a[i]*a[j] for three word number c=(c2,c1,c0) */#ifdef BN_LLONG#define mul_add_c(a,b,c0,c1,c2) \	t=(BN_ULLONG)a*b; \	t1=(BN_ULONG)Lw(t); \	t2=(BN_ULONG)Hw(t); \	c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \	c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define mul_add_c2(a,b,c0,c1,c2) \	t=(BN_ULLONG)a*b; \	tt=(t+t)&BN_MASK; \	if (tt < t) c2++; \	t1=(BN_ULONG)Lw(tt); \	t2=(BN_ULONG)Hw(tt); \	c0=(c0+t1)&BN_MASK2;  \	if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \	c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define sqr_add_c(a,i,c0,c1,c2) \	t=(BN_ULLONG)a[i]*a[i]; \	t1=(BN_ULONG)Lw(t); \	t2=(BN_ULONG)Hw(t); \	c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \	c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define sqr_add_c2(a,i,j,c0,c1,c2) \	mul_add_c2((a)[i],(a)[j],c0,c1,c2)#elif defined(BN_UMULT_HIGH)#define mul_add_c(a,b,c0,c1,c2)	{	\	BN_ULONG ta=(a),tb=(b);		\	t1 = ta * tb;			\	t2 = BN_UMULT_HIGH(ta,tb);	\	c0 += t1; t2 += (c0<t1)?1:0;	\	c1 += t2; c2 += (c1<t2)?1:0;	\	}#define mul_add_c2(a,b,c0,c1,c2) {	\	BN_ULONG ta=(a),tb=(b),t0;	\	t1 = BN_UMULT_HIGH(ta,tb);	\	t0 = ta * tb;			\	t2 = t1+t1; c2 += (t2<t1)?1:0;	\	t1 = t0+t0; t2 += (t1<t0)?1:0;	\	c0 += t1; t2 += (c0<t1)?1:0;	\	c1 += t2; c2 += (c1<t2)?1:0;	\	}#define sqr_add_c(a,i,c0,c1,c2)	{	\	BN_ULONG ta=(a)[i];		\	t1 = ta * ta;			\	t2 = BN_UMULT_HIGH(ta,ta);	\	c0 += t1; t2 += (c0<t1)?1:0;	\	c1 += t2; c2 += (c1<t2)?1:0;	\	}#define sqr_add_c2(a,i,j,c0,c1,c2)	\	mul_add_c2((a)[i],(a)[j],c0,c1,c2)#else				/* !BN_LLONG */#define mul_add_c(a,b,c0,c1,c2) \	t1=LBITS(a); t2=HBITS(a); \	bl=LBITS(b); bh=HBITS(b); \	mul64(t1,t2,bl,bh); \	c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \	c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define mul_add_c2(a,b,c0,c1,c2) \	t1=LBITS(a); t2=HBITS(a); \	bl=LBITS(b); bh=HBITS(b); \	mul64(t1,t2,bl,bh); \	if (t2 & BN_TBIT) c2++; \	t2=(t2+t2)&BN_MASK2; \	if (t1 & BN_TBIT) t2++; \	t1=(t1+t1)&BN_MASK2; \	c0=(c0+t1)&BN_MASK2;  \	if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \	c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define sqr_add_c(a,i,c0,c1,c2) \	sqr64(t1,t2,(a)[i]); \	c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \	c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define sqr_add_c2(a,i,j,c0,c1,c2) \	mul_add_c2((a)[i],(a)[j],c0,c1,c2)#endif				/* !BN_LLONG */void bn_mul_comba8(BN_ULONG * r, BN_ULONG * a, BN_ULONG * b){#ifdef BN_LLONG    BN_ULLONG t;#else    BN_ULONG bl, bh;#endif    BN_ULONG t1, t2;    BN_ULONG c1, c2, c3;    c1 = 0;    c2 = 0;    c3 = 0;    mul_add_c(a[0], b[0], c1, c2, c3);    r[0] = c1;    c1 = 0;    mul_add_c(a[0], b[1], c2, c3, c1);    mul_add_c(a[1], b[0], c2, c3, c1);    r[1] = c2;    c2 = 0;    mul_add_c(a[2], b[0], c3, c1, c2);    mul_add_c(a[1], b[1], c3, c1, c2);    mul_add_c(a[0], b[2], c3, c1, c2);    r[2] = c3;    c3 = 0;    mul_add_c(a[0], b[3], c1, c2, c3);    mul_add_c(a[1], b[2], c1, c2, c3);    mul_add_c(a[2], b[1], c1, c2, c3);    mul_add_c(a[3], b[0], c1, c2, c3);    r[3] = c1;    c1 = 0;    mul_add_c(a[4], b[0], c2, c3, c1);    mul_add_c(a[3], b[1], c2, c3, c1);    mul_add_c(a[2], b[2], c2, c3, c1);    mul_add_c(a[1], b[3], c2, c3, c1);    mul_add_c(a[0], b[4], c2, c3, c1);    r[4] = c2;    c2 = 0;    mul_add_c(a[0], b[5], c3, c1, c2);    mul_add_c(a[1], b[4], c3, c1, c2);    mul_add_c(a[2], b[3], c3, c1, c2);    mul_add_c(a[3], b[2], c3, c1, c2);    mul_add_c(a[4], b[1], c3, c1, c2);    mul_add_c(a[5], b[0], c3, c1, c2);    r[5] = c3;    c3 = 0;    mul_add_c(a[6], b[0], c1, c2, c3);    mul_add_c(a[5], b[1], c1, c2, c3);    mul_add_c(a[4], b[2], c1, c2, c3);    mul_add_c(a[3], b[3], c1, c2, c3);    mul_add_c(a[2], b[4], c1, c2, c3);    mul_add_c(a[1], b[5], c1, c2, c3);    mul_add_c(a[0], b[6], c1, c2, c3);    r[6] = c1;    c1 = 0;    mul_add_c(a[0], b[7], c2, c3, c1);    mul_add_c(a[1], b[6], c2, c3, c1);    mul_add_c(a[2], b[5], c2, c3, c1);    mul_add_c(a[3], b[4], c2, c3, c1);    mul_add_c(a[4], b[3], c2, c3, c1);    mul_add_c(a[5], b[2], c2, c3, c1);    mul_add_c(a[6], b[1], c2, c3, c1);    mul_add_c(a[7], b[0], c2, c3, c1);    r[7] = c2;    c2 = 0;    mul_add_c(a[7], b[1], c3, c1, c2);    mul_add_c(a[6], b[2], c3, c1, c2);    mul_add_c(a[5], b[3], c3, c1, c2);    mul_add_c(a[4], b[4], c3, c1, c2);    mul_add_c(a[3], b[5], c3, c1, c2);    mul_add_c(a[2], b[6], c3, c1, c2);    mul_add_c(a[1], b[7], c3, c1, c2);    r[8] = c3;    c3 = 0;    mul_add_c(a[2], b[7], c1, c2, c3);    mul_add_c(a[3], b[6], c1, c2, c3);    mul_add_c(a[4], b[5], c1, c2, c3);    mul_add_c(a[5], b[4], c1, c2, c3);    mul_add_c(a[6], b[3], c1, c2, c3);    mul_add_c(a[7], b[2], c1, c2, c3);    r[9] = c1;    c1 = 0;    mul_add_c(a[7], b[3], c2, c3, c1);    mul_add_c(a[6], b[4], c2, c3, c1);    mul_add_c(a[5], b[5], c2, c3, c1);    mul_add_c(a[4], b[6], c2, c3, c1);    mul_add_c(a[3], b[7], c2, c3, c1);    r[10] = c2;    c2 = 0;    mul_add_c(a[4], b[7], c3, c1, c2);    mul_add_c(a[5], b[6], c3, c1, c2);    mul_add_c(a[6], b[5], c3, c1, c2);    mul_add_c(a[7], b[4], c3, c1, c2);    r[11] = c3;    c3 = 0;    mul_add_c(a[7], b[5], c1, c2, c3);    mul_add_c(a[6], b[6], c1, c2, c3);    mul_add_c(a[5], b[7], c1, c2, c3);    r[12] = c1;    c1 = 0;    mul_add_c(a[6], b[7], c2, c3, c1);    mul_add_c(a[7], b[6], c2, c3, c1);    r[13] = c2;    c2 = 0;    mul_add_c(a[7], b[7], c3, c1, c2);    r[14] = c3;    r[15] = c1;}void bn_mul_comba4(BN_ULONG * r, BN_ULONG * a, BN_ULONG * b){#ifdef BN_LLONG    BN_ULLONG t;#else    BN_ULONG bl, bh;#endif    BN_ULONG t1, t2;    BN_ULONG c1, c2, c3;    c1 = 0;    c2 = 0;    c3 = 0;    mul_add_c(a[0], b[0], c1, c2, c3);    r[0] = c1;    c1 = 0;    mul_add_c(a[0], b[1], c2, c3, c1);    mul_add_c(a[1], b[0], c2, c3, c1);    r[1] = c2;    c2 = 0;    mul_add_c(a[2], b[0], c3, c1, c2);    mul_add_c(a[1], b[1], c3, c1, c2);    mul_add_c(a[0], b[2], c3, c1, c2);    r[2] = c3;    c3 = 0;    mul_add_c(a[0], b[3], c1, c2, c3);    mul_add_c(a[1], b[2], c1, c2, c3);    mul_add_c(a[2], b[1], c1, c2, c3);    mul_add_c(a[3], b[0], c1, c2, c3);    r[3] = c1;    c1 = 0;    mul_add_c(a[3], b[1], c2, c3, c1);    mul_add_c(a[2], b[2], c2, c3, c1);    mul_add_c(a[1], b[3], c2, c3, c1);    r[4] = c2;    c2 = 0;    mul_add_c(a[2], b[3], c3, c1, c2);    mul_add_c(a[3], b[2], c3, c1, c2);    r[5] = c3;    c3 = 0;    mul_add_c(a[3], b[3], c1, c2, c3);    r[6] = c1;    r[7] = c2;}void bn_sqr_comba8(BN_ULONG * r, BN_ULONG * a){#ifdef BN_LLONG    BN_ULLONG t, tt;#else    BN_ULONG bl, bh;#endif    BN_ULONG t1, t2;    BN_ULONG c1, c2, c3;    c1 = 0;    c2 = 0;    c3 = 0;    sqr_add_c(a, 0, c1, c2, c3);    r[0] = c1;    c1 = 0;    sqr_add_c2(a, 1, 0, c2, c3, c1);    r[1] = c2;    c2 = 0;    sqr_add_c(a, 1, c3, c1, c2);    sqr_add_c2(a, 2, 0, c3, c1, c2);    r[2] = c3;    c3 = 0;    sqr_add_c2(a, 3, 0, c1, c2, c3);    sqr_add_c2(a, 2, 1, c1, c2, c3);    r[3] = c1;    c1 = 0;    sqr_add_c(a, 2, c2, c3, c1);    sqr_add_c2(a, 3, 1, c2, c3, c1);    sqr_add_c2(a, 4, 0, c2, c3, c1);    r[4] = c2;    c2 = 0;    sqr_add_c2(a, 5, 0, c3, c1, c2);    sqr_add_c2(a, 4, 1, c3, c1, c2);    sqr_add_c2(a, 3, 2, c3, c1, c2);    r[5] = c3;    c3 = 0;    sqr_add_c(a, 3, c1, c2, c3);    sqr_add_c2(a, 4, 2, c1, c2, c3);    sqr_add_c2(a, 5, 1, c1, c2, c3);    sqr_add_c2(a, 6, 0, c1, c2, c3);    r[6] = c1;    c1 = 0;    sqr_add_c2(a, 7, 0, c2, c3, c1);    sqr_add_c2(a, 6, 1, c2, c3, c1);    sqr_add_c2(a, 5, 2, c2, c3, c1);    sqr_add_c2(a, 4, 3, c2, c3, c1);    r[7] = c2;    c2 = 0;    sqr_add_c(a, 4, c3, c1, c2);    sqr_add_c2(a, 5, 3, c3, c1, c2);    sqr_add_c2(a, 6, 2, c3, c1, c2);    sqr_add_c2(a, 7, 1, c3, c1, c2);    r[8] = c3;    c3 = 0;    sqr_add_c2(a, 7, 2, c1, c2, c3);    sqr_add_c2(a, 6, 3, c1, c2, c3);    sqr_add_c2(a, 5, 4, c1, c2, c3);    r[9] = c1;    c1 = 0;    sqr_add_c(a, 5, c2, c3, c1);    sqr_add_c2(a, 6, 4, c2, c3, c1);    sqr_add_c2(a, 7, 3, c2, c3, c1);    r[10] = c2;    c2 = 0;    sqr_add_c2(a, 7, 4, c3, c1, c2);    sqr_add_c2(a, 6, 5, c3, c1, c2);    r[11] = c3;    c3 = 0;    sqr_add_c(a, 6, c1, c2, c3);    sqr_add_c2(a, 7, 5, c1, c2, c3);    r[12] = c1;    c1 = 0;    sqr_add_c2(a, 7, 6, c2, c3, c1);    r[13] = c2;    c2 = 0;    sqr_add_c(a, 7, c3, c1, c2);    r[14] = c3;    r[15] = c1;}void bn_sqr_comba4(BN_ULONG * r, BN_ULONG * a){#ifdef BN_LLONG    BN_ULLONG t, tt;#else    BN_ULONG bl, bh;#endif    BN_ULONG t1, t2;    BN_ULONG c1, c2, c3;    c1 = 0;    c2 = 0;    c3 = 0;    sqr_add_c(a, 0, c1, c2, c3);    r[0] = c1;    c1 = 0;    sqr_add_c2(a, 1, 0, c2, c3, c1);    r[1] = c2;    c2 = 0;    sqr_add_c(a, 1, c3, c1, c2);    sqr_add_c2(a, 2, 0, c3, c1, c2);    r[2] = c3;    c3 = 0;    sqr_add_c2(a, 3, 0, c1, c2, c3);    sqr_add_c2(a, 2, 1, c1, c2, c3);    r[3] = c1;    c1 = 0;    sqr_add_c(a, 2, c2, c3, c1);    sqr_add_c2(a, 3, 1, c2, c3, c1);    r[4] = c2;    c2 = 0;    sqr_add_c2(a, 3, 2, c3, c1, c2);    r[5] = c3;    c3 = 0;    sqr_add_c(a, 3, c1, c2, c3);    r[6] = c1;    r[7] = c2;}#else				/* !BN_MUL_COMBA *//* hmm... is it faster just to do a multiply? */#undef bn_sqr_comba4void bn_sqr_comba4(BN_ULONG * r, BN_ULONG * a){    BN_ULONG t[8];    bn_sqr_normal(r, a, 4, t);}#undef bn_sqr_comba8void bn_sqr_comba8(BN_ULONG * r, BN_ULONG * a){    BN_ULONG t[16];    bn_sqr_normal(r, a, 8, t);}void bn_mul_comba4(BN_ULONG * r, BN_ULONG * a, BN_ULONG * b){    r[4] = bn_mul_words(&(r[0]), a, 4, b[0]);    r[5] = bn_mul_add_words(&(r[1]), a, 4, b[1]);    r[6] = bn_mul_add_words(&(r[2]), a, 4, b[2]);    r[7] = bn_mul_add_words(&(r[3]), a, 4, b[3]);}void bn_mul_comba8(BN_ULONG * r, BN_ULONG * a, BN_ULONG * b){    r[8] = bn_mul_words(&(r[0]), a, 8, b[0]);    r[9] = bn_mul_add_words(&(r[1]), a, 8, b[1]);    r[10] = bn_mul_add_words(&(r[2]), a, 8, b[2]);    r[11] = bn_mul_add_words(&(r[3]), a, 8, b[3]);    r[12] = bn_mul_add_words(&(r[4]), a, 8, b[4]);    r[13] = bn_mul_add_words(&(r[5]), a, 8, b[5]);    r[14] = bn_mul_add_words(&(r[6]), a, 8, b[6]);    r[15] = bn_mul_add_words(&(r[7]), a, 8, b[7]);}#endif				/* !BN_MUL_COMBA */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -