|
|
1.1 root 1: #include "fpp_defs.h"
2:
3: /*****************************************************************************
4: *
5: * PIPELINE TEST #9
6: *
7: * LDF(op1), MULF(op2), CVFL r0, SUBF operand[r0], STF
8: *
9: * -where the operands are the fmacro1 MULF data patterns. The SUBF operand's
10: * address is based on the result of the CVFL.
11: * -The load, multiply, and convert will be done twice. The first time will
12: * be to get the index and the data to subtract. The data to subtract will
13: * be the same as the accumulator so we'll expect a reasult of zero. The
14: * data will be stored based on the 1st CVFL result.
15: * -If the 2nd CVFL doesn't get done before the SUBF operand is fetched then
16: * we won't get a final accumulator of zero.
17: * -For size reasons, only the MULF data with a result between -100 and +100
18: * will be used for this test.
19: *****************************************************************************/
20: pipe_9()
21: {
22: asm(".globl _pipeline_9_t");
23: asm("_pipeline_9_t:");
24: if( (cycle == 1) && (prt_hdrs) ) /* print headers on 1st cycle */
25: writes(" PIPE_9 ");
26: force_loop = FALSE; /* clear force_loop flag */
27: for( index = 0; index <= max_mulf_1_index; index++ ) {
28: sgl_value_1 = mulf_1_data[index].op_1; /* get the data */
29: sgl_value_2 = mulf_1_data[index].op_2; /* operands */
30: sgl_expected = mulf_1_data[index].exp;
31: asm("ldf _sgl_value_1");
32: asm("mulf _sgl_value_2");
33: asm("cvfl _index2");
34: asm("nop");
35: if( (index2 >= -99) && (index2 <= 99) ) {
36: if( index2 ) {
37: sgl_value_5 = 0; /* set a dummy index */
38: adr_pipe_ops[sgl_value_5] = 0;
39: } else {
40: sgl_value_5 = 6; /* set a dummy index */
41: adr_pipe_ops[sgl_value_5] = 0xabadbabe;
42: }
43: asm("movl _index2,r0"); /* save the index */
44: asm("stf _pipe_ops[r0]"); /* save the Acc's value */
45: asm("stf _sgl_value_4"); /* save this value */
46: /*
47: * This is the start of the LOOP ON ERROR section
48: */
49: asm("_pipe9_1_lp:");
50: asm("movl _sgl_value_5,r0"); /* save the bum index */
51: asm("ldf _sgl_value_1");
52: asm("mulf _sgl_value_2");
53: asm("cvfl r0"); /* set up the index to use */
54: asm("subf _pipe_ops[r0]"); /* subtract saved value */
55: asm("stf _sgl_st_acc");
56: asm("movl r0,_sgl_value_6"); /* save the index used */
57: if( force_loop )
58: asm("brb _pipe9_1_lp");; /* loop on the error */
59: /*
60: * Verify the results
61: */
62: if( sgl_st_acc ) { /* the Acc s/b cleared */
63: errcnt++; /* bump the error count */
64: if ( prt_error )
65: pipe9_print(); /* print the error mesage */
66: if ( halt_flg )
67: pipe9_halt( 1 ); /* halt on the error */
68: if ( loop_on_err ) {
69: force_loop = 1;
70: asm("jmp _pipe9_1_lp");;
71: }
72: }
73: }
74: };
75: asm("jmp *return"); /* return to the test monitor */
76: }
77:
78:
79:
80:
81: /***************************************************************************
82: *
83: * print an error message of the form
84: *
85: * cycle: xx Test xx, (Pipe 9), error
86: * test sequence = LDF(op1), MULF(op2), CVFL r0, SUBF operand[r0], STF
87: * op #1 = xxxxxxxx, final Acc = xxxxxxxx, data index = xxxxxxxx
88: * op #2 = xxxxxxxx, expected Acc = xxxxxxxx
89: * op #3 = xxxxxxxx, CVFL result = xxxxxxxx
90: * int expected = xxxxxxxx
91: ***************************************************************************/
92: pipe9_print()
93: {
94: writes("\n"); /* start a new print line */
95: writes("cycle: ");
96: writed( cycle );
97: writes(" Test ");
98: writed( test_no );
99: writes(" (Pipe 9), error\n");
100: writes(" LDF(op1), MULF(op2), CVFL(r0), SUBF(op3), STF\n");
101: writes("operand 1 = ");
102: write32h( sgl_value_1 );
103: writes(", final Acc = ");
104: write32h( sgl_st_acc );
105: writes(", data index = ");
106: writed( index );
107: writec('\n');
108: writes("operand 2 = ");
109: write32h( sgl_value_2 );
110: writes(", expected Acc = ");
111: write32h( sgl_expected );
112: writec('\n');
113: writes("operand 3 = ");
114: write32h( sgl_value_4 );
115: writes(", CVFL result = ");
116: write32h( sgl_value_6 );
117: writec('\n');
118: writes(" int expected = ");
119: write32h( index2 );
120: writec('\n');
121:
122:
123: }
124:
125:
126:
127: /*
128: **************************************************************************
129: *
130: * HALT ON AN ERROR
131: *
132: **************************************************************************
133: */
134: pipe9_halt()
135: {
136: asm("movl _test_no,r0"); /* r0 = test number */
137: asm("movl $1,r1"); /* r1 = subtest number */
138: asm("movl $1,r2"); /* r2 = error code */
139: asm("movl _cycle,r3"); /* r3 = cycle count */
140: asm("movl _sgl_value_1,r4"); /* r4 = sgl operand #1 */
141: asm("movl _sgl_value_2,r5"); /* r5 = sgl operand #2 */
142: asm("movl _sgl_st_acc,r6"); /* r6 = sgl stored */
143: asm("movl _sgl_expected,r7"); /* r7 = sgl expected */
144: asm("movl _sgl_value_6,r8"); /* r8 = CVFL int actual */
145: asm("movl _index2,r9"); /* r9 = CVFL int expected */
146: asm("movl _index,r10"); /* r10 = data index */
147: asm("halt"); /* HALT ... */
148: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.