[an error occurred while processing this directive]
|
Вот маленький кусочек кода который вообще нужно оптимизировать, ой как надо... это всё производится в цикле и имеет существенные последствия на общее количество комманд...
Сначала маленько на Си:
For IP=2, 3, 4, ..., MH, do the following doubly indented lines
IB=MINC-IP+2
AA0=ATMP(IP)<<16 Load AA0 high word
P=RC*ATMP(IB) Q15 RC, so<<1
AA0=AA0+(P<<1)
If AA0 overflowed, then do the following triply indented lines
NRS=NRS+1
For LP=2, 3, ..., MINC, set ATMP(LP)=ATMP(LP)>>1
AA0=ATMP(IP)<<16 First re-scale ATMP
P=RC*ATMP(IB) Next re-calculate
AA0=AA0+(P<<1) overflowed AA0
AA1=ATMP(IB)<<16
P=RC*ATMP(IP)
AA1=AA1+(P<<1)
If AA1 overflowed, then do the following triply indented lines
NRS=NRS+1
For LP=2, 3, ..., MINC, set ATMP(LP)=ATMP(LP)>>1
AA0=ATMP(IP)<<16 First re-scale ATMP(IP)
P=RC*ATMP(IB) Next re-calculate AA0
AA0=AA0+(P<<1)
AA1=ATMP(IB)<<16 Next re-scale ATMP(IB)
P=RC*ATMP(IP) Next re-calculate
AA1=AA1+(P<<1) overflowed AA1
ATMP(IP)=RND(AA0)
ATMP(IB)=RND(AA1)
А теперь тоже самое на асме, причём те кусочки которые выполняются при переполнении аккумуляторов абсолютно не критичны по количеству машинных циклов, так как за всё общее количество повторения этого цикла (в общей сложности 625 раз) они выполняются не более 1-2 раз, поэтому всё остальное падает на вычисление округление и сохранение результатов:
;MH Start
LD MINC_MH,A
SFTA A,#-1
STLM A,BRC ;ñ÷¸ò÷èê öèêëà MH ðàç
NOP
RPTBD b_lev_MH? ;èíèöèàëèçàöèÿ öèêëà
MVMM AR1,AR3 ;ATMP(IP)
MVMM AR6,AR2 ;ATMP(IB)
MPY *AR2,A ;AA0=RC*ATMP(IB)
SFTA A,1 ;AA0<<1
ADD *AR3,16,A ;AA0=AA0+ATMP(IP)<<16
BC b_lev_1?,ANOV ;If AA0 overflowed...
ADDM #1,NRS
ADDM #-1,NRS_N
LD NRS_N,ASM
LD MINC,A
PSHM ST1
PSHM BRC
PSHM RSA
STLM A,BRC ;ñ÷¸ò÷èê öèêëà
PSHM REA
RPTBD b_lev_2? ;èíèöèàëèçàöèÿ öèêëà ñ delay
MVMM AR1,AR4
NOP
LD *AR4,A
b_lev_2?:
STH A,15,*AR4+
POPM REA
POPM RSA
POPM BRC
POPM ST1
MPY *AR2,A ;AA0=RC*ATMP(IB)
SFTA A,1 ;AA0<<1
ADD *AR3,16,A ;AA0=AA0+ATMP(IP)
b_lev_1?:
MPY *AR3,B ;AA1=RC*ATMP(IP)
SFTA B,1 ;AA1<<1
ADD *AR2,16,B ;AA1=AA1+ATMP(IB)<<16
BC b_lev_3?,BNOV ;if AA1 overflowed...
ADDM #1,NRS
ADDM #-1,NRS_N
LD NRS_N,ASM
LD MINC,A
PSHM ST1
PSHM BRC
PSHM RSA
STLM A,BRC ;ñ÷¸ò÷èê öèêëà
PSHM REA
RPTBD b_lev_4? ;èíèöèàëèçàöèÿ öèêëà ñ delay
MVMM AR1,AR4
NOP
LD *AR4,B
b_lev_4?:
STH B,15,*AR4+
POPM REA
POPM RSA
POPM BRC
POPM ST1
MPY *AR2,A ;AA0=RC*ATMP(IB)
SFTA A,1 ;AA0<<1
ADD *AR3,16,A ;AA0=AA0+ATMP(IP)<<160
MPY *AR3,B ;AA1=RC*ATMP(IP)
SFTA B,1 ;AA1<<1
ADD *AR2,16,B ;AA1=AA1+ATMP(IB)<<16
b_lev_3?:
ADD #2,14,A ;RND(AA0)
ADD #2,14,B ;RND(AA1)
STH A,*AR3+ ;ATMP(IP)=RND(AA0)
b_lev_MH?:
STH B,*AR2- ;ATMP(IB)=RND(AA1)
;MH End
Вот в общем и всё... Один цикл без переполнения аккумуляторов примерно занимает 25 МЦ (при 625 циклах получается 25*625=15625МЦ!!!), причём на команду BC приходится 10 МЦ!!! если это значение уменьшить хотя бы в 2 раза то есть BC=3МЦ то уже получается 21*625=13125МЦ!!! и это уже было бы весело, ну а если ещё меньше, то ещё веселее и т.д. и т.п.
E-mail: info@telesys.ru