File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / d / entry / ffs.s
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:24:19 2019 UTC (6 years, 11 months ago) by root
Branches: bsd, MAIN
CVS tags: v12b, v121, HEAD
Power 6/32 Unix version 1.2b


/*	FFS instruction test	*/
/*				*/
/*	constant definitions 	*/

	.set	HIGH,31
	.set	IPL,8
	.set	ZERO,0
	.set	ONES,0xffffffff
	.set	DV,128
	.set	FU,64
	.set	IV,32
	.set 	T,16
	.set	N,8
	.set	Z,4
	.set	V,2
	.set	C,1
	.set    NEGVAL,0xff0fffff
	.set	DAT4,0x0

	.globl	_ffs
_ffs:
	callf	$4,_setjmp	/* save context for error return */
	movab	_ffs,_stpc	/* save address of subtest start */
	movl	$1,_subtst	/* subtest number */
	movl	$1,_no_opr	/* number of operands in use */
	movl	dat0,_opr	/* first operand */
0:	bicpsw  $(IV|T)		/* disable overflow,trace exceptions	*/
	movl	dat0,r6		/* save source op		*/
	bispsw	$(Z|V)		/* set z,v flags      		*/
	bicpsw  $(N|C)		/* clear n,c flag		*/
	ffs	dat0,r4		/* find 1st bit clearin dat0	*/
	jlss	error1		/* error if n flag set		*/
	jeql	error1		/* error if z flag set		*/
	jvs	error1		/* error if v flag set  	*/
	jcc	error1		/* error if c flag not set	*/
	jmp	1f
error1:	movpsl	_actual		/* actual data */
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$2,_ercode	/* error code flag failure */
	jmp	*badrtn
1:	cmpl	expd0,r4	/* compare r4 to exp. result	*/
	jeql	1f
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$1,_ercode	/* error code data miscompare */
	movl	r4,_actual	/* actual data */
	movl	expd0,_expected	/* expected data */
	jmp	*badrtn
1:	cmpl	dat0,r6		/* make sure source unchanged   */
	jeql	f2
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$3,_ercode	/* error code operand was changed */
	movl	r6,_actual	/* actual data */
	movl	dat0,_expected	/* expected data */
	jmp	*badrtn

f2:
	bbs	$0,_force_lp,0b	/* if set loop on last subtest */
af2:	callf	$4,_setjmp	/* save context for error return */
	movab	af2,_stpc	/* save address of subtest start */
	movl	$2,_subtst	/* subtest number */
	movl	$1,_no_opr	/* number of operands in use */
	movl	dat1,_opr	/* first operand */
0:	movl	dat1,r6		/* save source op		*/
	bispsw	$(N|V)		/* set n,v flags      		*/
	bicpsw  $(Z|C)		/* clear z,c flag		*/
	ffs	dat1,r4		/* find 1st bit clear in dat1	*/
	jlss	error2		/* error if n flag set		*/
	jneq	error2		/* error if z flag not set	*/
	jvs	error2		/* error if v flag set  	*/
	jcc	error2		/* error if c flag not set	*/
	jmp	1f
error2:	movpsl	_actual		/* actual data */
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$2,_ercode	/* error code flag failure */
	jmp	*badrtn
1:	cmpl	expd1,r4	/* compare r4 to exp. result	*/
	jeql	1f
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$1,_ercode	/* error code data miscompare */
	movl	r4,_actual	/* actual data */
	movl	expd1,_expected	/* expected data */
	jmp	*badrtn
1:	cmpl	dat1,r6		/* make sure source unchanged   */
	jeql	f3
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$3,_ercode	/* error code operand was changed */
	movl	r6,_actual	/* actual data */
	movl	dat1,_expected	/* expected data */
	jmp	*badrtn

f3:
	bbs	$0,_force_lp,0b	/* if set loop on last subtest */
af3:	callf	$4,_setjmp	/* save context for error return */
	movab	af3,_stpc	/* save address of subtest start */
	movl	$3,_subtst	/* subtest number */
	movl	$1,_no_opr	/* number of operands in use */
	movl	dat2,_opr	/* first operand */
0:	movl	dat2,r3		/* save source op		*/
	bispsw	$(N|V)		/* set n,v flags      		*/
	bicpsw  $(Z|C)		/* clear z,c flag		*/
	ffs	r3,r4		/* find 1st bit clear	*/
	jlss	error3		/* error if n flag set		*/
	jeql	error3		/* error if z flag set	*/
	jvs	error3		/* error if v flag set  	*/
	jcc	error3		/* error if c flag not set	*/
	jmp	1f
error3:	movpsl	_actual		/* actual data */
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$2,_ercode	/* error code flag failure */
	jmp	*badrtn
1:	cmpl	expd2,r4	/* compare r4 to exp. result	*/
	jeql	1f
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$1,_ercode	/* error code data miscompare */
	movl	r4,_actual	/* actual data */
	movl	expd2,_expected	/* expected data */
	jmp	*badrtn
1:	cmpl	dat2,r3		/* make sure source unchanged   */
	jeql	f4
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$3,_ercode	/* error code operand was changed */
	movl	r3,_actual	/* actual data */
	movl	dat2,_expected	/* expected data */
	jmp	*badrtn

f4:
	bbs	$0,_force_lp,0b	/* if set loop on last subtest */
af4:	callf	$4,_setjmp	/* save context for error return */
	movab	af4,_stpc	/* save address of subtest start */
	movl	$4,_subtst	/* subtest number */
	movl	$1,_no_opr	/* number of operands in use */
	movl	dat3,_opr	/* first operand */
0:	movl	dat3,r3		/* save source op		*/
	bispsw	$(N|V)		/* set n,v flags      		*/
	bicpsw  $(Z|C)		/* clear z,c flag		*/
	ffs	r3,dest		/* find 1st bit clear	*/
	jlss	error4		/* error if n flag set		*/
	jeql	error4		/* error if z flag  set	*/
	jvs	error4		/* error if v flag set  	*/
	jcc	error4		/* error if c flag not set	*/
	jmp	1f
error4:	movpsl	_actual		/* actual data */
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$2,_ercode	/* error code flag failure */
	jmp	*badrtn
1:	cmpl	expd3,dest	/* compare  exp. result	*/
	jeql	1f
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$1,_ercode	/* error code data miscompare */
	movl	dest,_actual	/* actual data */
	movl	expd3,_expected	/* expected data */
	jmp	*badrtn
1:	cmpl	dat3,r3		/* make sure source unchanged   */
	jeql	f5
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$3,_ercode	/* error code operand was changed */
	movl	r3,_actual	/* actual data */
	movl	dat3,_expected	/* expected data */
	jmp	*badrtn

f5:
	bbs	$0,_force_lp,0b	/* if set loop on last subtest */
af5:	callf	$4,_setjmp	/* save context for error return */
	movab	af5,_stpc	/* save address of subtest start */
	movl	$5,_subtst	/* subtest number */
	movl	$1,_no_opr	/* number of operands in use */
	movl	$DAT4,_opr	/* first operand */
0:	bispsw	$(N|V)		/* set n,v flags      		*/
	bicpsw  $(Z|C)		/* clear z,c flag		*/
	ffs	$DAT4,dest	/* find 1st bit clear data to memory */
	jeql	error5		/* error if z flag  set	*/
	jgeq	error5		/* error if n flag not set	*/
	jvs	error5		/* error if v flag set  	*/
	jcc	error5		/* error if c flag not set	*/
	jmp	1f
error5:	movpsl	_actual		/* actual data */
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$2,_ercode	/* error code flag failure */
	jmp	*badrtn
1:	cmpl	expd4,dest	/* compare  exp. result	*/
	jeql	aldn
	bbs	$0,_scoplp,0b	/* if set scope loop on error */
	movl	$1,_ercode	/* error code data miscompare */
	movl	dest,_actual	/* actual data */
	movl	expd4,_expected	/* expected data */
	jmp	*badrtn

aldn:	bbs	$0,_force_lp,0b	/* if set loop on last subtest */
	jmp	*return

/*	test data		*/
	.align	2
dat0:	.long	0x80000000	/* Last bit set */
expd0:	.long	31
dat1:	.long	0x2ffffff1	/* First bit set */
expd1:	.long	0
dat2:	.long	0x40000000	/* Bit 30 set */
expd2:	.long	30
dat3:	.long	0x44441000	/* Bit 12 set */
expd3:	.long	12
dat4:	.long	0		/* All bit clear */
expd4:	.long	-1
dest:	.long	0

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.