|
|
1.1 root 1:
2: #include "fpp_defs.h"
3:
4:
5: /*****************************************************************************
6: *
7: * PIPELINE TEST #19
8: *
9: * LDD(op1), MULD(op2), STD op3, SUBD op3, STD
10: *
11: * -where the operands are the fmacro1 MULD data patterns. The SUBD operand
12: * is the stored result of the MULD.
13: * -If the 1st STD isn't completed before the SUBD data is fetched then we
14: * won't get a final accumulator of zero.
15: *****************************************************************************/
16: pipe_19()
17: {
18: asm(".globl _pipeline_19_t");
19: asm("_pipeline_19_t:");
20: if( (cycle == 1) && (prt_hdrs) ) /* print headers on 1st cycle */
21: writes(" PIPE_19");
22: force_loop = FALSE; /* clear force_loop flag */
23: for( index = 0; index <= max_muld_1_index; index++ ) {
24: dbl_value_1 = muld_1_data[index].op_1; /* get the data */
25: dbl_value_2 = muld_1_data[index].op_2; /* operands */
26: dbl_expected = muld_1_data[index].exp;
27: /*
28: * This is the start of the LOOP ON ERROR section
29: */
30: asm("_pipe19_1_lp:");
31: asm("ldd _dbl_value_1"); /* get the 1st operand */
32: asm("muld _dbl_value_2"); /* multiply by the 2nd op. */
33: asm("std _dbl_value_3"); /* save the MULD result */
34: asm("subd _dbl_value_3"); /* and subtract it again */
35: asm("std _dbl_st_acc"); /* save the final result */
36: if( force_loop )
37: asm("brb _pipe19_1_lp");; /* loop on the error */
38: /*
39: * Verify the results
40: */
41: if( (dbl_st_acc.m) || (dbl_st_acc.l) ) { /* the Acc s/b = 0 */
42: errcnt++; /* bump the error count */
43: if ( prt_error )
44: pipe19_print(); /* print the error mesage */
45: if ( halt_flg )
46: pipe19_halt( 1 ); /* halt on the error */
47: if ( loop_on_err ) {
48: force_loop = TRUE;
49: asm("jmp _pipe19_1_lp");;
50: }
51: }
52: }
53: asm("jmp *return"); /* return to the test monitor */
54: }
55:
56:
57:
58:
59: /*
60: **************************************************************************
61: *
62: * print an error message of the form
63: *
64: * cycle: xx Test xx (Pipe 19), error
65: * test sequence = LDD(op1), MULD(op2), STD(op3), SUBD(op3), STD
66: * operand 1 = xxxxxxxx xxxxxxxx, final Acc = xxxxxxxx xxxxxxxx, index = xx
67: * operand 2 = xxxxxxxx xxxxxxxx, expected Acc = xxxxxxxx xxxxxxxx
68: * operand 3 = xxxxxxxx xxxxxxxx, expected op3 = xxxxxxxx xxxxxxxx
69: **************************************************************************
70: */
71: pipe19_print()
72: {
73: writes(" \n"); /* start a new print line */
74: writes("cycle: ");
75: writed( cycle );
76: writes(" Test ");
77: writed( test_no );
78: writes(" (Pipe 19), error\n");
79: writes("LDD(op1), MULD(op2), STD(op3), SUBD(op3), STD\n");
80: writes("operand 1 = ");
81: write32h( dbl_value_1.m );
82: writec(' ');
83: write32h( dbl_value_1.l );
84: writes(", final Acc = ");
85: write32h( dbl_st_acc.m );
86: writec(' ');
87: write32h( dbl_st_acc.l );
88: writes(", index = ");
89: writed( index );
90: writes("\noperand 2 = ");
91: write32h( dbl_value_2.m );
92: writec(' ');
93: write32h( dbl_value_2.l );
94: writes(", expected Acc = ");
95: write32h( 0 );
96: writec(' ');
97: write32h( 0 );
98: writes("\noperand 3 = ");
99: write32h( dbl_value_3.m );
100: writec(' ');
101: write32h( dbl_value_3.l );
102: writes(", expected op3 = ");
103: write32h( dbl_expected.m );
104: writec(' ');
105: write32h( dbl_expected.l );
106: writec('\n');
107: }
108:
109:
110:
111: /*
112: **************************************************************************
113: *
114: * HALT ON AN ERROR
115: *
116: **************************************************************************
117: */
118: pipe19_halt()
119: {
120: sgl_value_1 = dbl_value_1.m;
121: sgl_value_2 = dbl_value_1.l;
122: sgl_value_3 = dbl_value_2.m;
123: sgl_value_4 = dbl_value_2.l;
124: sgl_value_5 = dbl_value_3.m;
125: sgl_value_6 = dbl_value_3.l;
126: asm("movl _test_no,r0"); /* r0 = test number */
127: asm("movl $1,r1"); /* r1 = subtest number */
128: asm("movl $1,r2"); /* r2 = error code */
129: asm("movl _cycle,r3"); /* r3 = cycle count */
130: asm("movl _sgl_value_1,r4"); /* r4 = MS of operand #1 */
131: asm("movl _sgl_value_2,r5"); /* r5 = LS of operand #1 */
132: asm("movl _sgl_value_3,r6"); /* r6 = MS of operand #2 */
133: asm("movl _sgl_value_4,r7"); /* r7 = LS of operand #2 */
134: asm("movl _sgl_value_5,r8"); /* r8 = MS of operand #3 */
135: asm("movl _sgl_value_6,r9"); /* r9 = LS of operand #3 */
136: sgl_value_1 = dbl_st_acc.m;
137: sgl_value_2 = dbl_st_acc.l;
138: asm("movl _sgl_value_1,r10"); /* r10 = MS of final value */
139: asm("movl _sgl_value_2,r11"); /* r11 = LS of final value */
140: asm("clrl r12"); /* r12 = MS exp value (0) */
141: asm("clrl r13"); /* r13 = LS exp value (0) */
142: asm("movl _index,r14"); /* r14 = data index */
143: asm("halt"); /* HALT ... */
144: }
145:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.