|
|
Power 6/32 Unix version 1.2b
/* FFC 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 DAT3,0x4444efff .globl _ffc _ffc: callf $4,_setjmp /* save context for error return */ movab _ffc,_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 */ ffc dat0,r4 /* find 1st bit clearin dat0 mem to reg */ 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 = psl MAYBE it is incorrect */ bbs $0,_scoplp,0b /* if set scpe loop on error */ movl $2,_ercode /* error code flag failure */ jmp *badrtn 1: cmpl expd0,r4 /* compare r4 to exp. result */ jeql 1f /* if no error continue */ bbs $0,_scoplp,0b /* if set scpe 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 /* if no error continue */ bbs $0,_scoplp,0b /* if set scpe 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,r3 /* save source op */ bispsw $(N|V) /* set n,v flags */ bicpsw $(Z|C) /* clear z,c flag */ ffc r3,dest /* find 1st bit clear in dat1 reg to mem */ 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 = psl MAYBE it is incorrect */ bbs $0,_scoplp,0b /* if set scpe loop on error */ movl $2,_ercode /* error code flag failure */ jmp *badrtn 1: cmpl expd1,dest /* compare to exp. result */ jeql 1f /* if no error continue */ bbs $0,_scoplp,0b /* if set scpe loop on error */ movl $1,_ercode /* error code data miscompare */ movl dest,_actual /* actual data */ movl expd1,_expected /* expected data */ jmp *badrtn 1: cmpl dat1,r3 /* paranoid check of dat1 value */ jeql f3 /* if no error continue */ bbs $0,_scoplp,0b /* if set scpe loop on error */ movl $3,_ercode /* error code operand was changed */ movl r3,_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 */ ffc r3,r4 /* find 1st bit clear reg to reg */ 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 = psl MAYBE it is incorrect */ bbs $0,_scoplp,0b /* if set scpe loop on error */ movl $2,_ercode /* error code flag failure */ jmp *badrtn 1: cmpl expd2,r4 /* compare r4 to exp. result */ jeql 1f /* if no error continue */ bbs $0,_scoplp,0b /* if set scpe 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 /* if no error continue */ bbs $0,_scoplp,0b /* if set scpe 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: bispsw $(N|V) /* set n,v flags */ bicpsw $(Z|C) /* clear z,c flag */ ffc $DAT3,dest /* find 1st bit clear data to mem */ 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 = psl MAYBE it is incorrect */ bbs $0,_scoplp,0b /* if set scpe loop on error */ movl $2,_ercode /* error code flag failure */ jmp *badrtn 1: cmpl expd3,dest /* compare exp. result */ jeql f5 /* if no error continue */ bbs $0,_scoplp,0b /* if set scpe loop on error */ movl $1,_ercode /* error code data miscompare */ movl dest,_actual /* actual data */ movl expd3,_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 */ ffc dat4,dest /* find 1st bit clear mem to mem */ 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 = psl MAYBE it is incorrect */ bbs $0,_scoplp,0b /* if set scpe loop on error */ movl $2,_ercode /* error code flag failure */ jmp *badrtn 1: cmpl expd4,dest /* compare exp. result */ jeql aldn /* if no error continue */ bbs $0,_scoplp,0b /* if set scpe 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 0x7fffffff /* Last bit clear */ expd0: .long 31 dat1: .long 0xfffffffe /* First bit clear */ expd1: .long 0 dat2: .long 0x3fffffff /* Bit 30 clear */ expd2: .long 30 dat3: .long 0x4444efff /* Bit 12 clear */ expd3: .long 12 dat4: .long 0xffffffff /* All bit set */ expd4: .long -1 dest: .long 0 temp: .long 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.