Figure 1 rmvmul(y, A, x, ncA, nrA) float y[], A[], x[]; int ncA, nrA; { int i,j; float sum; int inca; /* Check for errors on dimensions. */ if (ncA <= 0 || nrA <= 0) return(-1); for (i = 0; i < nrA; i++) /* Step down a column. */ { inca = i * ncA; sum = 0.0; for (j = 0; j < ncA; j++) /* Step across a row. */ sum += A[inca + j] * x[j]; y[i] = sum; } return(0); } Figure 2 /* Check for errors on dimensions. */ if (ncA <= 0 || nrA <= 0) return(-1); { /* computations */ } return(0); Figure 3 _rmvmul: LDI *-FP(5),R0 ;R0 = ncA BLE LL3 LDI *-FP(6),R1 ;R1 = nrA BGT L1 LL3: LDI -1,R0 ;return(-1) B EPI0_2 L1: ; /* computations */ L3: LDI 0,R0 ;return(0) EPI0_2: SUBI 4,SP POP FP RETS Figure 4 LDI *-FP(3),R1 ;*-FP(3) = A[] ADDI *+FP(4),R1 ;*+FP(4) = inca ADDI R0,R1,AR0 ;R0 = j ADDI *-FP(4),R0 ;*-FP(4) = x[] LDI R0,AR1 MPYF *AR1,*AR0,R0 ;R0 = A[inca + j] * x[j] ADDF *+FP(3),R0 ;R0 += sum STF R0,*+FP(3) ;*+FP(3) = sum Figure 5 rmvmul(y, A, x, ncA, nrA) register float y[], A[], x[]; int ncA, nrA; { register int i,j; register float sum; int inca; { /* Error checking and computations */ } } Figure 6 LDI *+FP(1),R0 ;*+FP(1) = inca ADDI R0,AR5,R1 ;AR5 = A[] ADDI R5,R1,AR0 ;R5 = j ADDI R5,AR6,AR1 ;AR6 = x[] MPYF *AR1,*AR0,R1 ;R1 = A[inca + j] * x[j] ADDF R1,R6 ;R6 = sum Figure 7 ; Initialization _dotpr: PUSH FP ; Save the old FP. LDI SP,FP ; Point to the top of the stack. LDI *-FP(2), AR0 ; AR0 = x LDI *-FP(3), AR1 ; AR1 = y LDI *-FP(4), RC ; RC = n SUBI 1, RC ; RC = n-1 LDF 0.0, R0 ; R0 = 0 LDF 0.0, R2 ; R2 = 0 ; Dot product RPTS RC MPYF *AR0++, *AR1++, RO ; R0 = x[1++] * y[j++] || ADDF R0, R2 ; R2 = sum' = sum +R0 ADDF R0, R2 ; Last product. ; Return LDF R2, R0 ; Put the results in R0. POP FP ; Pop the old frame pointer. RETS Figure 8 rmvmul(y, A, x, ncA, nrA) register float y[], A[], x[]; register int ncA; int nrA; { register int i; float dotpr(); /* Check for errors on dimensions. */ if (ncA <= 0 || nrA <= 0) return(-1); for (i = 0; i < nrA; i++) /* Step down a column. */ y[i] = dotpr(x, &A[i * ncA], ncA); return(0); } Figure 9a main() { register float *x, *y; register float sum; register int i, N; sum = 0.0; for (i = 0; i < N; i++) sum += *x++ * *y++; } Figure 9b main() { register float *x, *y; register float sum; register float delta; register int i, N; sum = 0.0; for (i = 0; i < N; i++) { delta = *x++ - *y++; sum += delta * delta; } } Figure 9c main() { register float *x, *y, *z; register int i, N; for (i = 0; i < N; i++) *z++ = *x++ * *y++; }