/* This C language subroutine computes the multiplication of a matrix by a scaler. z(i,j) = a*x(i,j) The Run Time Library for the C Language. Gordon A. Sterling (617) 461 - 3076 DSP Development Tools Engineering Created on 5/25/90 Updated on 5/94 by AS Updated on 1/95 by AS - separated polymorphic functions #include
float matscalmult(float z[][], float x[][], float a, int r, int s); */ #include "lib_glob.h" #include "mat_glob.h" .SEGMENT/CODE Code_Space_Name; .FILE RTL_FILENAME; .GLOBAL _matscalmult; .GLOBAL ___matscalmultDD, ___matscalmultDP; .GLOBAL ___matscalmultPD, ___matscalmultPP; _matscalmult: ___matscalmultDD:JUMP (PC, smlt_core) (DB); pm_ptr=dd_smlt; pm_lnt=0; ___matscalmultDP:JUMP (PC, smlt_core) (DB); pm_ptr=dp_smlt; pm_lnt=0; ___matscalmultPD:JUMP (PC, smlt_core) (DB); pm_ptr=pd_smlt; pm_lnt=0; ___matscalmultPP:JUMP (PC, smlt_core) (DB); pm_ptr=pp_smlt; pm_lnt=0; smlt_core: R2=dma_i; put(R2); R2=pma_i; put(R2); readparam4(R0); JUMP (pm_0, pm_ptr) (DB); readparam5(R2); R0=R0*R2 (SSI), dm_lnt=dm_0; restore_state: FETCH_RETURN get(pma_i,1); get(dma_i,2); RETURN (DB); RESTORE_STACK RESTORE_FRAME dd_smlt: IF EQ JUMP (PC, restore_state) (DB); /* Error, says input is 0 sized */ dm_ptr=R8; /* Point to input */ dma_i=R4; /* Point to output */ R0=R0-1, F8=DM(dm_ptr, dm_1); /* Compute size of matrix */ IF EQ JUMP dd_finished; /* Only one element! */ LCNTR=R0, DO matrix_smultdd UNTIL LCE; F0=F8*F12, F8=DM(dm_ptr, dm_1); matrix_smultdd: DM(dma_i, dm_1)=F0; dd_finished: JUMP (PC, restore_state) (DB); F0=F8*F12; R0=PASS R4, DM(dma_i, dm_1)=F0; dp_smlt: IF EQ JUMP (PC, restore_state) (DB); /* Error, says input is 0 sized*/ pm_ptr=R8; /* Point to input */ dma_i=R4; /* Point to output */ R0=R0-1, F8=PM(pm_ptr, pm_1); /* Compute size of matrix */ IF EQ JUMP dp_finished; /* Only one element! */ LCNTR=R0, DO matrix_smultdp UNTIL LCE; F0=F8*F12, F8=PM(pm_ptr, pm_1); matrix_smultdp: DM(dma_i, dm_1)=F0; dp_finished: JUMP (PC, restore_state) (DB); F0=F8*F12; R0=PASS R4, DM(dma_i, dm_1)=F0; pd_smlt: IF EQ JUMP (PC, restore_state) (DB); /* Error, says input is 0 sized*/ dm_ptr=R8; /* Point to input */ pma_i=R4; /* Point to output */ R0=R0-1, F8=DM(dm_ptr, dm_1); /* Compute size of matrix */ IF EQ JUMP (PC, pd_finished); /* Only one element! */ LCNTR=R0, DO matrix_smultpd UNTIL LCE; F0=F8*F12, F8=DM(dm_ptr, dm_1); matrix_smultpd: PM(pma_i, pm_1)=F0; pd_finished: JUMP (PC, restore_state) (DB); F0=F8*F12; R0=PASS R4, PM(pma_i, pm_1)=F0; pp_smlt: IF EQ JUMP (PC, restore_state) (DB); /* Error, says input is 0 sized*/ pm_ptr=R8; /* Point to input */ pma_i=R4; /* Point to output */ R0=R0-1, F8=PM(pm_ptr, pm_1); /* Compute size of matrix */ IF EQ JUMP (PC, pp_finished); /* Only one element! */ LCNTR=R0, DO matrix_smultpp UNTIL LCE; F0=F8*F12, F8=PM(pm_ptr, pm_1); matrix_smultpp: PM(pma_i, pm_1)=F0; pp_finished: JUMP (PC, restore_state) (DB); F0=F8*F12; R0=PASS R4, PM(pma_i, pm_1)=F0; .ENDSEG;