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

📄 aix_ppc32.s

📁 cryptlib安全工具包
💻 S
📖 第 1 页 / 共 3 页
字号:
	lwz	r7,12(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r10,r10,r8	adde	r11,r11,r9	addze	r12,r12					#mul_add_c(a[7],b[2],c1,c2,c3);	lwz	r6,28(r4)	lwz	r7,8(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r10,r10,r8	adde	r11,r11,r9	addze	r12,r12	stw	r10,36(r3)	#r[9]=c1;					#mul_add_c(a[7],b[3],c2,c3,c1);	lwz	r7,12(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r11,r11,r8	adde	r12,r12,r9	addze	r10,r0					#mul_add_c(a[6],b[4],c2,c3,c1);	lwz	r6,24(r4)	lwz	r7,16(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r11,r11,r8	adde	r12,r12,r9	addze	r10,r10					#mul_add_c(a[5],b[5],c2,c3,c1);	lwz	r6,20(r4)	lwz	r7,20(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r11,r11,r8	adde	r12,r12,r9	addze	r10,r10					#mul_add_c(a[4],b[6],c2,c3,c1);	lwz	r6,16(r4)	lwz	r7,24(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r11,r11,r8	adde	r12,r12,r9	addze	r10,r10					#mul_add_c(a[3],b[7],c2,c3,c1);	lwz	r6,12(r4)	lwz	r7,28(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r11,r11,r8	adde	r12,r12,r9	addze	r10,r10	stw	r11,40(r3)	#r[10]=c2;					#mul_add_c(a[4],b[7],c3,c1,c2);	lwz	r6,16(r4)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r12,r12,r8	adde	r10,r10,r9	addze	r11,r0					#mul_add_c(a[5],b[6],c3,c1,c2);	lwz	r6,20(r4)	lwz	r7,24(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r12,r12,r8	adde	r10,r10,r9	addze	r11,r11					#mul_add_c(a[6],b[5],c3,c1,c2);	lwz	r6,24(r4)	lwz	r7,20(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r12,r12,r8	adde	r10,r10,r9	addze	r11,r11					#mul_add_c(a[7],b[4],c3,c1,c2);	lwz	r6,28(r4)	lwz	r7,16(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r12,r12,r8	adde	r10,r10,r9	addze	r11,r11	stw	r12,44(r3)	#r[11]=c3;					#mul_add_c(a[7],b[5],c1,c2,c3);	lwz	r7,20(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r10,r10,r8	adde	r11,r11,r9	addze	r12,r0					#mul_add_c(a[6],b[6],c1,c2,c3);	lwz	r6,24(r4)	lwz	r7,24(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r10,r10,r8	adde	r11,r11,r9	addze	r12,r12					#mul_add_c(a[5],b[7],c1,c2,c3);	lwz	r6,20(r4)	lwz	r7,28(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r10,r10,r8	adde	r11,r11,r9	addze	r12,r12	stw	r10,48(r3)	#r[12]=c1;					#mul_add_c(a[6],b[7],c2,c3,c1);	lwz	r6,24(r4)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r11,r11,r8	adde	r12,r12,r9	addze	r10,r0					#mul_add_c(a[7],b[6],c2,c3,c1);	lwz	r6,28(r4)	lwz	r7,24(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r11,r11,r8	adde	r12,r12,r9	addze	r10,r10	stw	r11,52(r3)	#r[13]=c2;					#mul_add_c(a[7],b[7],c3,c1,c2);	lwz	r7,28(r5)	mullw	r8,r6,r7	mulhwu	r9,r6,r7	addc	r12,r12,r8	adde	r10,r10,r9	stw	r12,56(r3)	#r[14]=c3;	stw	r10,60(r3)	#r[15]=c1;	bclr	BO_ALWAYS,CR0_LT	.long	0x00000000##	NOTE:	The following label name should be changed to#		"bn_sub_words" i.e. remove the first dot#		for the gcc compiler. This should be automatically#		done in the build##.align	4.bn_sub_words:##	Handcoded version of bn_sub_words##BN_ULONG bn_sub_words(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n)##	r3 = r#	r4 = a#	r5 = b#	r6 = n##       Note:	No loop unrolling done since this is not a performance#               critical loop.	xor	r0,r0,r0	#set r0 = 0##	check for r6 = 0 AND set carry bit.#	subfc.	r7,r0,r6        # If r6 is 0 then result is 0.				# if r6 > 0 then result !=0				# In either case carry bit is set.	bc	BO_IF,CR0_EQ,Lppcasm_sub_adios	addi	r4,r4,-4	addi	r3,r3,-4	addi	r5,r5,-4	mtctr	r6Lppcasm_sub_mainloop:		lwzu	r7,4(r4)	lwzu	r8,4(r5)	subfe	r6,r8,r7	# r6 = r7+carry bit + onescomplement(r8)				# if carry = 1 this is r7-r8. Else it				# is r7-r8 -1 as we need.	stwu	r6,4(r3)	bc	BO_dCTR_NZERO,CR0_EQ,Lppcasm_sub_mainloopLppcasm_sub_adios:		subfze	r3,r0		# if carry bit is set then r3 = 0 else -1	andi.	r3,r3,1         # keep only last bit.	bclr	BO_ALWAYS,CR0_LT	.long	0x00000000##	NOTE:	The following label name should be changed to#		"bn_add_words" i.e. remove the first dot#		for the gcc compiler. This should be automatically#		done in the build#.align	4.bn_add_words:##	Handcoded version of bn_add_words##BN_ULONG bn_add_words(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n)##	r3 = r#	r4 = a#	r5 = b#	r6 = n##       Note:	No loop unrolling done since this is not a performance#               critical loop.	xor	r0,r0,r0##	check for r6 = 0. Is this needed?#	addic.	r6,r6,0		#test r6 and clear carry bit.	bc	BO_IF,CR0_EQ,Lppcasm_add_adios	addi	r4,r4,-4	addi	r3,r3,-4	addi	r5,r5,-4	mtctr	r6Lppcasm_add_mainloop:		lwzu	r7,4(r4)	lwzu	r8,4(r5)	adde	r8,r7,r8	stwu	r8,4(r3)	bc	BO_dCTR_NZERO,CR0_EQ,Lppcasm_add_mainloopLppcasm_add_adios:		addze	r3,r0			#return carry bit.	bclr	BO_ALWAYS,CR0_LT	.long	0x00000000##	NOTE:	The following label name should be changed to#		"bn_div_words" i.e. remove the first dot#		for the gcc compiler. This should be automatically#		done in the build#.align	4.bn_div_words:##	This is a cleaned up version of code generated by#	the AIX compiler. The only optimization is to use#	the PPC instruction to count leading zeros instead#	of call to num_bits_word. Since this was compiled#	only at level -O2 we can possibly squeeze it more?#	#	r3 = h#	r4 = l#	r5 = d		cmplwi	0,r5,0			# compare r5 and 0	bc	BO_IF_NOT,CR0_EQ,Lppcasm_div1	# proceed if d!=0	li	r3,-1			# d=0 return -1	bclr	BO_ALWAYS,CR0_LT	Lppcasm_div1:	xor	r0,r0,r0		#r0=0	li	r8,32	cntlzw.	r7,r5			#r7 = num leading 0s in d.	bc	BO_IF,CR0_EQ,Lppcasm_div2	#proceed if no leading zeros	subf	r8,r7,r8		#r8 = BN_num_bits_word(d)	srw.	r9,r3,r8		#are there any bits above r8'th?	tw	16,r9,r0		#if there're, signal to dump core...Lppcasm_div2:	cmpl	0,0,r3,r5			#h>=d?	bc	BO_IF,CR0_LT,Lppcasm_div3	#goto Lppcasm_div3 if not	subf	r3,r5,r3		#h-=d ; Lppcasm_div3:				#r7 = BN_BITS2-i. so r7=i	cmpi	0,0,r7,0		# is (i == 0)?	bc	BO_IF,CR0_EQ,Lppcasm_div4	slw	r3,r3,r7		# h = (h<< i)	srw	r8,r4,r8		# r8 = (l >> BN_BITS2 -i)	slw	r5,r5,r7		# d<<=i	or	r3,r3,r8		# h = (h<<i)|(l>>(BN_BITS2-i))	slw	r4,r4,r7		# l <<=iLppcasm_div4:	srwi	r9,r5,16		# r9 = dh					# dl will be computed when needed					# as it saves registers.	li	r6,2			#r6=2	mtctr	r6			#counter will be in count.Lppcasm_divouterloop: 	srwi	r8,r3,16		#r8 = (h>>BN_BITS4)	srwi	r11,r4,16	#r11= (l&BN_MASK2h)>>BN_BITS4					# compute here for innerloop.	cmpl	0,0,r8,r9			# is (h>>BN_BITS4)==dh	bc	BO_IF_NOT,CR0_EQ,Lppcasm_div5	# goto Lppcasm_div5 if not	li	r8,-1	clrlwi	r8,r8,16		#q = BN_MASK2l 	b	Lppcasm_div6Lppcasm_div5:	divwu	r8,r3,r9		#q = h/dhLppcasm_div6:	mullw	r12,r9,r8		#th = q*dh	clrlwi	r10,r5,16	#r10=dl	mullw	r6,r8,r10		#tl = q*dl	Lppcasm_divinnerloop:	subf	r10,r12,r3		#t = h -th	srwi	r7,r10,16	#r7= (t &BN_MASK2H), sort of...	addic.	r7,r7,0			#test if r7 == 0. used below.					# now want to compute					# r7 = (t<<BN_BITS4)|((l&BN_MASK2h)>>BN_BITS4)					# the following 2 instructions do that	slwi	r7,r10,16	# r7 = (t<<BN_BITS4)	or	r7,r7,r11		# r7|=((l&BN_MASK2h)>>BN_BITS4)	cmpl	1,0,r6,r7			# compare (tl <= r7)	bc	BO_IF_NOT,CR0_EQ,Lppcasm_divinnerexit	bc	BO_IF_NOT,CR1_FEX,Lppcasm_divinnerexit	addi	r8,r8,-1		#q--	subf	r12,r9,r12		#th -=dh	clrlwi	r10,r5,16	#r10=dl. t is no longer needed in loop.	subf	r6,r10,r6		#tl -=dl	b	Lppcasm_divinnerloopLppcasm_divinnerexit:	srwi	r10,r6,16	#t=(tl>>BN_BITS4)	slwi	r11,r6,16	#tl=(tl<<BN_BITS4)&BN_MASK2h;	cmpl	1,0,r4,r11		# compare l and tl	add	r12,r12,r10		# th+=t	bc	BO_IF_NOT,CR1_FX,Lppcasm_div7  # if (l>=tl) goto Lppcasm_div7	addi	r12,r12,1		# th++Lppcasm_div7:	subf	r11,r11,r4		#r11=l-tl	cmpl	1,0,r3,r12		#compare h and th	bc	BO_IF_NOT,CR1_FX,Lppcasm_div8	#if (h>=th) goto Lppcasm_div8	addi	r8,r8,-1		# q--	add	r3,r5,r3		# h+=dLppcasm_div8:	subf	r12,r12,r3		#r12 = h-th	slwi	r4,r11,16	#l=(l&BN_MASK2l)<<BN_BITS4					# want to compute					# h = ((h<<BN_BITS4)|(l>>BN_BITS4))&BN_MASK2					# the following 2 instructions will do this.	insrwi	r11,r12,16,16	# r11 is the value we want rotated 32/2.	rotlwi	r3,r11,16	# rotate by 32/2 and store in r3	bc	BO_dCTR_ZERO,CR0_EQ,Lppcasm_div9#if (count==0) break ;	slwi	r0,r8,16		#ret =q<<BN_BITS4	b	Lppcasm_divouterloopLppcasm_div9:	or	r3,r8,r0	bclr	BO_ALWAYS,CR0_LT	.long	0x00000000##	NOTE:	The following label name should be changed to#		"bn_sqr_words" i.e. remove the first dot#		for the gcc compiler. This should be automatically#		done in the build#.align	4.bn_sqr_words:##	Optimized version of bn_sqr_words##	void bn_sqr_words(BN_ULONG *r, BN_ULONG *a, int n)##	r3 = r#	r4 = a#	r5 = n##	r6 = a[i].#	r7,r8 = product.##	No unrolling done here. Not performance critical.	addic.	r5,r5,0			#test r5.	bc	BO_IF,CR0_EQ,Lppcasm_sqr_adios	addi	r4,r4,-4	addi	r3,r3,-4	mtctr	r5Lppcasm_sqr_mainloop:						#sqr(r[0],r[1],a[0]);	lwzu	r6,4(r4)	mullw	r7,r6,r6	mulhwu  r8,r6,r6	stwu	r7,4(r3)	stwu	r8,4(r3)	bc	BO_dCTR_NZERO,CR0_EQ,Lppcasm_sqr_mainloopLppcasm_sqr_adios:		bclr	BO_ALWAYS,CR0_LT	.long	0x00000000##	NOTE:	The following label name should be changed to#		"bn_mul_words" i.e. remove the first dot#		for the gcc compiler. This should be automatically#		done in the build#.align	4	.bn_mul_words:## BN_ULONG bn_mul_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w)## r3 = rp# r4 = ap# r5 = num# r6 = w	xor	r0,r0,r0	xor	r12,r12,r12		# used for carry	rlwinm.	r7,r5,30,2,31		# num >> 2	bc	BO_IF,CR0_EQ,Lppcasm_mw_REM	mtctr	r7Lppcasm_mw_LOOP:						#mul(rp[0],ap[0],w,c1);	lwz	r8,0(r4)	mullw	r9,r6,r8	mulhwu  r10,r6,r8	addc	r9,r9,r12	#addze	r10,r10			#carry is NOT ignored.					#will be taken care of					#in second spin below					#using adde.	stw	r9,0(r3)					#mul(rp[1],ap[1],w,c1);	lwz	r8,4(r4)		mullw	r11,r6,r8	mulhwu  r12,r6,r8	adde	r11,r11,r10	#addze	r12,r12	stw	r11,4(r3)					#mul(rp[2],ap[2],w,c1);	lwz	r8,8(r4)	mullw	r9,r6,r8	mulhwu  r10,r6,r8	adde	r9,r9,r12	#addze	r10,r10	stw	r9,8(r3)					#mul_add(rp[3],ap[3],w,c1);	lwz	r8,12(r4)	mullw	r11,r6,r8	mulhwu  r12,r6,r8	adde	r11,r11,r10	addze	r12,r12			#this spin we collect carry into					#r12	stw	r11,12(r3)		addi	r3,r3,16	addi	r4,r4,16	bc	BO_dCTR_NZERO,CR0_EQ,Lppcasm_mw_LOOPLppcasm_mw_REM:	andi.	r5,r5,0x3	bc	BO_IF,CR0_EQ,Lppcasm_mw_OVER					#mul(rp[0],ap[0],w,c1);	lwz	r8,0(r4)	mullw	r9,r6,r8	mulhwu  r10,r6,r8	addc	r9,r9,r12	addze	r10,r10	stw	r9,0(r3)	addi	r12,r10,0		addi	r5,r5,-1	cmpli	0,0,r5,0	bc	BO_IF,CR0_EQ,Lppcasm_mw_OVER						#mul(rp[1],ap[1],w,c1);	lwz	r8,4(r4)		mullw	r9,r6,r8	mulhwu  r10,r6,r8	addc	r9,r9,r12	addze	r10,r10	stw	r9,4(r3)	addi	r12,r10,0		addi	r5,r5,-1	cmpli	0,0,r5,0	bc	BO_IF,CR0_EQ,Lppcasm_mw_OVER						#mul_add(rp[2],ap[2],w,c1);	lwz	r8,8(r4)	mullw	r9,r6,r8	mulhwu  r10,r6,r8	addc	r9,r9,r12	addze	r10,r10	stw	r9,8(r3)	addi	r12,r10,0		Lppcasm_mw_OVER:		addi	r3,r12,0	bclr	BO_ALWAYS,CR0_LT	.long	0x00000000##	NOTE:	The following label name should be changed to#		"bn_mul_add_words" i.e. remove the first dot#		for the gcc compiler. This should be automatically#		done in the build#.align	4.bn_mul_add_words:## BN_ULONG bn_mul_add_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w)## r3 = rp# r4 = ap# r5 = num# r6 = w## empirical evidence suggests that unrolled version performs best!!#	xor	r0,r0,r0		#r0 = 0	xor	r12,r12,r12  		#r12 = 0 . used for carry			rlwinm.	r7,r5,30,2,31		# num >> 2	bc	BO_IF,CR0_EQ,Lppcasm_maw_leftover	# if (num < 4) go LPPCASM_maw_leftover	mtctr	r7Lppcasm_maw_mainloop:						#mul_add(rp[0],ap[0],w,c1);	lwz	r8,0(r4)	lwz	r11,0(r3)	mullw	r9,r6,r8	mulhwu  r10,r6,r8	addc	r9,r9,r12		#r12 is carry.	addze	r10,r10	addc	r9,r9,r11	#addze	r10,r10					#the above instruction addze					#is NOT needed. Carry will NOT					#be ignored. It's not affected					#by multiply and will be collected					#in the next spin	stw	r9,0(r3)						#mul_add(rp[1],ap[1],w,c1);	lwz	r8,4(r4)		lwz	r9,4(r3)	mullw	r11,r6,r8	mulhwu  r12,r6,r8	adde	r11,r11,r10		#r10 is carry.	addze	r12,r12	addc	r11,r11,r9	#addze	r12,r12	stw	r11,4(r3)						#mul_add(rp[2],ap[2],w,c1);	lwz	r8,8(r4)	mullw	r9,r6,r8	lwz	r11,8(r3)	mulhwu  r10,r6,r8	adde	r9,r9,r12	addze	r10,r10	addc	r9,r9,r11	#addze	r10,r10	stw	r9,8(r3)						#mul_add(rp[3],ap[3],w,c1);	lwz	r8,12(r4)	mullw	r11,r6,r8	lwz	r9,12(r3)	mulhwu  r12,r6,r8	adde	r11,r11,r10	addze	r12,r12	addc	r11,r11,r9	addze	r12,r12	stw	r11,12(r3)	addi	r3,r3,16	addi	r4,r4,16	bc	BO_dCTR_NZERO,CR0_EQ,Lppcasm_maw_mainloop	Lppcasm_maw_leftover:	andi.	r5,r5,0x3	bc	BO_IF,CR0_EQ,Lppcasm_maw_adios	addi	r3,r3,-4	addi	r4,r4,-4					#mul_add(rp[0],ap[0],w,c1);	mtctr	r5	lwzu	r8,4(r4)	mullw	r9,r6,r8	mulhwu  r10,r6,r8	lwzu	r11,4(r3)	addc	r9,r9,r11	addze	r10,r10	addc	r9,r9,r12	addze	r12,r10	stw	r9,0(r3)		bc	BO_dCTR_ZERO,CR0_EQ,Lppcasm_maw_adios					#mul_add(rp[1],ap[1],w,c1);	lwzu	r8,4(r4)		mullw	r9,r6,r8	mulhwu  r10,r6,r8	lwzu	r11,4(r3)	addc	r9,r9,r11	addze	r10,r10	addc	r9,r9,r12	addze	r12,r10	stw	r9,0(r3)		bc	BO_dCTR_ZERO,CR0_EQ,Lppcasm_maw_adios					#mul_add(rp[2],ap[2],w,c1);	lwzu	r8,4(r4)	mullw	r9,r6,r8	mulhwu  r10,r6,r8	lwzu	r11,4(r3)	addc	r9,r9,r11	addze	r10,r10	addc	r9,r9,r12	addze	r12,r10	stw	r9,0(r3)		Lppcasm_maw_adios:		addi	r3,r12,0	bclr	BO_ALWAYS,CR0_LT	.long	0x00000000	.align	4

⌨️ 快捷键说明

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