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

📄 milli64.s

📁 linux下的gcc编译器
💻 S
📖 第 1 页 / 共 5 页
字号:
	addc	retreg,retreg,retreg	/*  shift retreg with/into carry */	ds	temp,arg1,temp		/*  29th divide step */	addc	retreg,retreg,retreg	/*  shift retreg with/into carry */	ds	temp,arg1,temp		/*  30th divide step */	addc	retreg,retreg,retreg	/*  shift retreg with/into carry */	ds	temp,arg1,temp		/*  31st divide step */	addc	retreg,retreg,retreg	/*  shift retreg with/into carry */	ds	temp,arg1,temp		/*  32nd divide step, */	addc	retreg,retreg,retreg	/*  shift last retreg bit into retreg */	xor,>=	arg0,arg1,0		/*  get correct sign of quotient */	  sub	0,retreg,retreg		/*    based on operand signs */	MILLIRETN	nopLSYM(small_divisor)#if defined(pa64)/*  Clear the upper 32 bits of the arg1 register.  We are working with	*//*  small divisors (and 32 bit integers)   We must not be mislead  *//*  by "1" bits left in the upper 32 bits.  */	depd %r0,31,32,%r25#endif	blr,n	arg1,r0	nop/*  table for divisor == 0,1, ... ,15 */	addit,=	0,arg1,r0	/*  trap if divisor == 0 */	nop	MILLIRET		/*  divisor == 1 */	copy	arg0,retreg	MILLI_BEN($$divI_2)	/*  divisor == 2 */	nop	MILLI_BEN($$divI_3)	/*  divisor == 3 */	nop	MILLI_BEN($$divI_4)	/*  divisor == 4 */	nop	MILLI_BEN($$divI_5)	/*  divisor == 5 */	nop	MILLI_BEN($$divI_6)	/*  divisor == 6 */	nop	MILLI_BEN($$divI_7)	/*  divisor == 7 */	nop	MILLI_BEN($$divI_8)	/*  divisor == 8 */	nop	MILLI_BEN($$divI_9)	/*  divisor == 9 */	nop	MILLI_BEN($$divI_10)	/*  divisor == 10 */	nop	b	LREF(normal)		/*  divisor == 11 */	add,>=	0,arg0,retreg	MILLI_BEN($$divI_12)	/*  divisor == 12 */	nop	b	LREF(normal)		/*  divisor == 13 */	add,>=	0,arg0,retreg	MILLI_BEN($$divI_14)	/*  divisor == 14 */	nop	MILLI_BEN($$divI_15)	/*  divisor == 15 */	nopLSYM(negative1)	sub	0,arg0,retreg	/*  result is negation of dividend */	MILLIRET	addo	arg0,arg1,r0	/*  trap iff dividend==0x80000000 && divisor==-1 */	.exit	.procend	.end#endif#ifdef L_divU/* ROUTINE:	$$divU   .   .	Single precision divide for unsigned integers.   .   .	Quotient is truncated towards zero.   .	Traps on divide by zero.   INPUT REGISTERS:   .	arg0 ==	dividend   .	arg1 ==	divisor   .	mrp  == return pc   .	sr0  == return space when called externally   OUTPUT REGISTERS:   .	arg0 =	undefined   .	arg1 =	undefined   .	ret1 =	quotient   OTHER REGISTERS AFFECTED:   .	r1   =	undefined   SIDE EFFECTS:   .	Causes a trap under the following conditions:   .		divisor is zero   .	Changes memory at the following places:   .		NONE   PERMISSIBLE CONTEXT:   .	Unwindable.   .	Does not create a stack frame.   .	Suitable for internal or external millicode.   .	Assumes the special millicode register conventions.   DISCUSSION:   .	Branchs to other millicode routines using BE:   .		$$divU_# for 3,5,6,7,9,10,12,14,15   .   .	For selected small divisors calls the special divide by constant   .	routines written by Karl Pettis.  These are: 3,5,6,7,9,10,12,14,15.  */RDEFINE(temp,r1)RDEFINE(retreg,ret1)	/* r29 */RDEFINE(temp1,arg0)	SUBSPA_MILLI_DIV	ATTR_MILLI	.export $$divU,millicode	.import $$divU_3,millicode	.import $$divU_5,millicode	.import $$divU_6,millicode	.import $$divU_7,millicode	.import $$divU_9,millicode	.import $$divU_10,millicode	.import $$divU_12,millicode	.import $$divU_14,millicode	.import $$divU_15,millicode	.proc	.callinfo	millicode	.entryGSYM($$divU)/* The subtract is not nullified since it does no harm and can be used   by the two cases that branch back to "normal".  */	ldo	-1(arg1),temp		/* is there at most one bit set ? */	and,=	arg1,temp,r0		/* if so, denominator is power of 2 */	b	LREF(regular_seq)	addit,=	0,arg1,0		/* trap for zero dvr */	copy	arg0,retreg	extru,= arg1,15,16,temp		/* test denominator with 0xffff0000 */	extru	retreg,15,16,retreg	/* retreg = retreg >> 16 */	or	arg1,temp,arg1		/* arg1 = arg1 | (arg1 >> 16) */	ldi	0xcc,temp1		/* setup 0xcc in temp1 */	extru,= arg1,23,8,temp		/* test denominator with 0xff00 */	extru	retreg,23,24,retreg	/* retreg = retreg >> 8 */	or	arg1,temp,arg1		/* arg1 = arg1 | (arg1 >> 8) */	ldi	0xaa,temp		/* setup 0xaa in temp */	extru,= arg1,27,4,r0		/* test denominator with 0xf0 */	extru	retreg,27,28,retreg	/* retreg = retreg >> 4 */	and,=	arg1,temp1,r0		/* test denominator with 0xcc */	extru	retreg,29,30,retreg	/* retreg = retreg >> 2 */	and,=	arg1,temp,r0		/* test denominator with 0xaa */	extru	retreg,30,31,retreg	/* retreg = retreg >> 1 */	MILLIRETN	nop	LSYM(regular_seq)	comib,>=  15,arg1,LREF(special_divisor)	subi	0,arg1,temp		/* clear carry, negate the divisor */	ds	r0,temp,r0		/* set V-bit to 1 */LSYM(normal)	add	arg0,arg0,retreg	/* shift msb bit into carry */	ds	r0,arg1,temp		/* 1st divide step, if no carry */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 2nd divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 3rd divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 4th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 5th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 6th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 7th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 8th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 9th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 10th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 11th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 12th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 13th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 14th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 15th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 16th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 17th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 18th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 19th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 20th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 21st divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 22nd divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 23rd divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 24th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 25th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 26th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 27th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 28th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 29th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 30th divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 31st divide step */	addc	retreg,retreg,retreg	/* shift retreg with/into carry */	ds	temp,arg1,temp		/* 32nd divide step, */	MILLIRET	addc	retreg,retreg,retreg	/* shift last retreg bit into retreg *//* Handle the cases where divisor is a small constant or has high bit on.  */LSYM(special_divisor)/*	blr	arg1,r0 *//*	comib,>,n  0,arg1,LREF(big_divisor) ; nullify previous instruction *//* Pratap 8/13/90. The 815 Stirling chip set has a bug that prevents us from   generating such a blr, comib sequence. A problem in nullification. So I   rewrote this code.  */#if defined(pa64)/* Clear the upper 32 bits of the arg1 register.  We are working with   small divisors (and 32 bit unsigned integers)   We must not be mislead   by "1" bits left in the upper 32 bits.  */	depd %r0,31,32,%r25#endif	comib,>	0,arg1,LREF(big_divisor)	nop	blr	arg1,r0	nopLSYM(zero_divisor)	/* this label is here to provide external visibility */	addit,=	0,arg1,0		/* trap for zero dvr */	nop	MILLIRET			/* divisor == 1 */	copy	arg0,retreg	MILLIRET			/* divisor == 2 */	extru	arg0,30,31,retreg	MILLI_BEN($$divU_3)		/* divisor == 3 */	nop	MILLIRET			/* divisor == 4 */	extru	arg0,29,30,retreg	MILLI_BEN($$divU_5)		/* divisor == 5 */	nop	MILLI_BEN($$divU_6)		/* divisor == 6 */	nop	MILLI_BEN($$divU_7)		/* divisor == 7 */	nop	MILLIRET			/* divisor == 8 */	extru	arg0,28,29,retreg	MILLI_BEN($$divU_9)		/* divisor == 9 */	nop	MILLI_BEN($$divU_10)		/* divisor == 10 */	nop	b	LREF(normal)		/* divisor == 11 */	ds	r0,temp,r0		/* set V-bit to 1 */	MILLI_BEN($$divU_12)		/* divisor == 12 */	nop	b	LREF(normal)		/* divisor == 13 */	ds	r0,temp,r0		/* set V-bit to 1 */	MILLI_BEN($$divU_14)		/* divisor == 14 */	nop	MILLI_BEN($$divU_15)		/* divisor == 15 */	nop/* Handle the case where the high bit is on in the divisor.   Compute:	if( dividend>=divisor) quotient=1; else quotient=0;   Note:	dividend>==divisor iff dividend-divisor does not borrow   and		not borrow iff carry.  */LSYM(big_divisor)	sub	arg0,arg1,r0	MILLIRET	addc	r0,r0,retreg	.exit	.procend	.end#endif#ifdef L_remI/* ROUTINE:	$$remI   DESCRIPTION:   .	$$remI returns the remainder of the division of two signed 32-bit   .	integers.  The sign of the remainder is the same as the sign of   .	the dividend.   INPUT REGISTERS:   .	arg0 == dividend   .	arg1 == divisor   .	mrp  == return pc   .	sr0  == return space when called externally   OUTPUT REGISTERS:   .	arg0 = destroyed   .	arg1 = destroyed   .	ret1 = remainder   OTHER REGISTERS AFFECTED:   .	r1   = undefined   SIDE EFFECTS:   .	Causes a trap under the following conditions:  DIVIDE BY ZERO   .	Changes memory at the following places:  NONE   PERMISSIBLE CONTEXT:   .	Unwindable   .	Does not create a stack frame   .	Is usable for internal or external microcode   DISCUSSION:   .	Calls other millicode routines via mrp:  NONE   .	Calls other millicode routines:  NONE  */RDEFINE(tmp,r1)RDEFINE(retreg,ret1)	SUBSPA_MILLI	ATTR_MILLI	.proc	.callinfo millicode	.entryGSYM($$remI)GSYM($$remoI)	.export $$remI,MILLICODE	.export $$remoI,MILLICODE	ldo		-1(arg1),tmp		/*  is there at most one bit set ? */	and,<>		arg1,tmp,r0		/*  if not, don't use power of 2 */	addi,>		0,arg1,r0		/*  if denominator > 0, use power */						/*  of 2 */	b,n		LREF(neg_denom)LSYM(pow2)	comb,>,n	0,arg0,LREF(neg_num)	/*  is numerator < 0 ? */	and		arg0,tmp,retreg		/*  get the result */	MILLIRETNLSYM(neg_num)	subi		0,arg0,arg0		/*  negate numerator */	and		arg0,tmp,retreg		/*  get the result */	subi		0,retreg,retreg		/*  negate result */	MILLIRETNLSYM(neg_denom)	addi,<		0,arg1,r0		/*  if arg1 >= 0, it's not power */						/*  of 2 */	b,n		LREF(regular_seq)	sub		r0,arg1,tmp		/*  make denominator positive */	comb,=,n	arg1,tmp,LREF(regular_seq) /*  test against 0x80000000 and 0 */	ldo		-1(tmp),retreg		/*  is there at most one bit set ? */	and,=		tmp,retreg,r0		/*  if not, go to regular_seq */	b,n		LREF(regular_seq)	comb,>,n	0,arg0,LREF(neg_num_2)	/*  if arg0 < 0, negate it  */	and		arg0,retreg,retreg	MILLIRETNLSYM(neg_num_2)	subi		0,arg0,tmp		/*  test against 0x80000000 */	and		tmp,retreg,retreg	subi		0,retreg,retreg	MILLIRETNLSYM(regular_seq)	addit,=		0,arg1,0		/*  trap if div by zero */	add,>=		0,arg0,retreg		/*  move dividend, if retreg < 0, */	sub		0,retreg,retreg		/*    make it positive */	sub		0,arg1, tmp		/*  clear carry,  */						/*    negate the divisor */	ds		0, tmp,0		/*  set V-bit to the comple- */						/*    ment of the divisor sign */	or		0,0, tmp		/*  clear  tmp */	add		retreg,retreg,retreg	/*  shift msb bit into carry */	ds		 tmp,arg1, tmp		/*  1st divide step, if no carry */						/*    out, msb of quotient = 0 */	addc		retreg,retreg,retreg	/*  shift retreg with/into carry */LSYM(t1)	ds		 tmp,arg1, tmp		/*  2nd divide step */	addc		retreg,retreg,retreg	/*  shift retreg with/into carry */	ds		 tmp,arg1, tmp		/*  3rd divide step */	addc		retreg,retreg,retreg	/*  shift retreg with/into carry */	ds		 tmp,arg1, tmp		/*  4th divide step */	addc		retreg,retreg,retreg	/*  shift retreg with/into carry */	ds		 tmp,arg1, tmp		/*  5th divide step */	addc		retreg,retreg,retreg	/*  shift retreg with/into carry */	ds		 tmp,arg1, tmp		/*  6th divide step */	addc		retreg,retreg,retreg	/*  shift retreg with/into carry */	ds		 tmp,arg1, tmp		/*  7th divide step */	addc		retreg,retreg,retreg	/*  shift retreg with/into carry */	ds		 tmp,arg1, tmp		/*  8th divide step */

⌨️ 快捷键说明

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