|
|
Power 6/32 Unix version 1.2b
/* PUSHAB instruction test */ /* Privilege registers */ .set IPL,8 .set MAPEN,9 .set KSP,19 /* PSL fields */ .set IV,32 .set T,16 .set N,8 .set Z,4 .set V,2 .set C,1 /* constants */ .set DISABLE,0 .set ENABLE,1 .set MAXPOSW,0x7fff .set MAXNEGL,0x8000ffff .set HIGH,31 /* highest interrupt priority */ .set DISP,2 .set LONG,4 .set WORD,2 .set BYTE,1 .globl _pushab _pushab: callf $4,_setjmp /* save context for error return */ movab _pushab,_stpc /* save subtest starting address */ movl $1,_subtst /* subtest number */ movl $1,_no_opr /* number of operands in use */ movab tstloc,_opr /* first operand */ 0: bicpsw $(IV|T) /* disable exceptions */ /* */ pshab: /* MOVE ADDRESS FROM MEMORY TO STACK(R14) */ movab stk,r14 /* initialize stack */ movab stk,r10 bispsw $(N|Z|V ) /* set n,z,v flags */ bicpsw $Z pushab tstloc /* push address tstloc on stack */ jlss error1 /* error if any of the n,z,v */ jeql error1 /* flags still set */ jvs error1 jcc error1 /* error if c flag clear */ jmp 1f error1: movpsl _actual /* actual = psl MAYBE incorrect */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $2,_ercode /* error code flag failure */ jmp *badrtn 1: cmpl (r14),result /* check if stack has valid adr */ jeql 1f /* no error then continue */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $1,_ercode /* error code data miscompare */ movl (r14),_actual /* actual data */ movl result,_expected /* expected data */ jmp *badrtn 1: bicpsw $Z movab (r14),r13 decl r10 decl r10 decl r10 decl r10 cmpl r10,r13 /* check if stack get decrement */ jeql p2 /* if no error continue */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $1,_ercode /* error code data miscompare */ movl r10,_actual /* actual data */ movl r13,_expected /* expected data */ jmp *badrtn /* MOVE ADDRESS FROM REGISTER TO STACK */ p2: bbs $0,_force_lp,0b /* if set loop on last subtest */ ap2: callf $4,_setjmp /* save context for error return */ movab ap2,_stpc /* save subtest starting address */ movl $2,_subtst /* subtest number */ movl $1,_no_opr /* number of operands in use */ movl result,_opr /* first operand */ 0: movl result,r12 /* set r12 = address of tstloc */ pushab (r12) /* push address in r12 on stack */ cmpl (r14),result /* compare result */ jeql 1f /* no error then continue */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $1,_ercode /* error code data miscompare */ movl (r14),_actual /* actual data */ movl result,_expected /* expected data */ jmp *badrtn 1: bicpsw $Z movab (r14),r13 decl r10 decl r10 decl r10 decl r10 cmpl r10,r13 /* check if stack get decrement */ jeql chkflag /* no error then continue */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $1,_ercode /* error code data miscompare */ movl r10,_actual /* actual data */ movl r13,_expected /* expected data */ jmp *badrtn /* TESTING CONDITION FLAGS */ chkflag: bbs $0,_force_lp,0b /* if set loop on last subtest */ ap3: callf $4,_setjmp /* save context for error return */ movab ap3,_stpc /* save subtest starting address */ movl $3,_subtst /* subtest number */ movl $1,_no_opr /* number of operands in use */ movl $MAXNEGL,_opr /* first operand */ 0: movl $MAXNEGL,r13 /* set r13 = $MAXNEGL */ bispsw $(Z|V) /* set z,v flags */ bicpsw $(C|N) /* clear n,c flag */ pushab (r13) /* push adr. in r13 on stack */ jgeq error2 /* error if n flag clear */ jcc error2 /* error if c flag clear */ jeql error2 /* error if z flag still set */ jvs error2 /* error if v flag still set */ jmp 1f error2: movpsl _actual /* actual = psl MAYBE incorrect */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $2,_ercode /* error code flag failure */ jmp *badrtn 1: cmpl (r14),$MAXNEGL /* check address in temp */ jeql p4 /* no error then continue */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $1,_ercode /* error code data miscompare */ movl r10,_actual /* actual data */ movl r13,_expected /* expected data */ jmp *badrtn p4: bbs $0,_force_lp,0b /* if set loop on last subtest */ ap4: callf $4,_setjmp /* save context for error return */ movab ap4,_stpc /* save subtest starting address */ movl $4,_subtst /* subtest number */ movl $1,_no_opr /* number of operands in use */ movl $0,_opr /* first operand */ 0: movl $0,r11 /* set r11 = $0 */ bispsw $(N|V) /* set n,v flags */ bicpsw $(Z|C) /* clear z,c flag */ pushab (r11) /* push adr. in r11 on stack */ jcc error3 /* error if c flag clear */ jneq error3 /* error if z flag clear */ jlss error3 /* error if n flag still set */ jvs error3 /* error if v flag still set */ jmp 1f error3: movpsl _actual /* actual = psl MAYBE incorrect */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $2,_ercode /* error code flag failure */ jmp *badrtn 1: bicpsw $Z cmpl (r14),$0 /* check address in temp */ jeql p5 /* no error then continue */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $1,_ercode /* error code data miscompare */ movl (r14),_actual /* actual data */ movl $0,_expected /* expected data */ jmp *badrtn /* CHECKING INDEXING MODE */ p5: bbs $0,_force_lp,0b /* if set loop on last subtest */ ap5: callf $4,_setjmp /* save context for error return */ movab ap5,_stpc /* save subtest starting address */ movl $5,_subtst /* subtest number */ movl $1,_no_opr /* number of operands in use */ movl tstloc,_opr /* first operand */ 0: movl $DISP,r0 /* set r0 = DISP = 2 */ bispsw $(N|Z|V) /* set n,z,v flags */ bicpsw $Z pushab tstloc[r0] /* move address tstloc on stack */ jlss error4 /* error if any of the n,z,v */ jeql error4 /* flags still set */ jvs error4 jcc error4 /* error if c flag clear */ jmp 1f error4: movpsl _actual /* actual = psl MAYBE incorrect */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $2,_ercode /* error code flag failure */ jmp *badrtn 1: cmpl (r14),resul1 /* check if stack has valid adr */ jeql aldn /* no error then continue */ bbs $0,_scoplp,0b /* if set scope loop on error */ movl $1,_ercode /* error code data miscompare */ movl (r14),_actual /* actual data */ movl $0,_expected /* expected data */ jmp *badrtn aldn: bbs $0,_force_lp,0b /* if set loop on last subtest */ jmp *return /* good, return to monitor */ /* test data */ .align 2 /* align on longword boundery */ /* STACK SPACE */ .space 40 /* 10 long words for stack */ stk: .long 0 tstloc: .long 0 result: .long tstloc resul1: .long tstloc+(DISP*BYTE)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.