|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.