پاسخ : اموزش DSP
با سلام. و ادامه دستورات ضرب...
MPYS P,T,loc16 :
این دستور نتیجه ضرب قبلی که در رجیستر P قرار دارد را بعد از شیفت از رجیستر ACC کم می کند به علاوه محتوای علامت دار 16 بیتی رجیستر T را در محتوای ادرس ضرب می کند و نتیجه را در رجیستر P قرار می دهد.
MPYB ACC,T,#8bit :
این دستور محتوای رجیستر T را در عدد ثابت 8 بیتی بدون علامت ضرب می کند و نتیجه را در ACC قرار می دهد.
MPYU P,T,loc16 :
این دستور محتوای رجیستر T را در محتوای ادرس اشاره شده ضرب می کند و نتیجه 32 بیتی را در رجیستر P ذخیره می کند.
این دستور مانند دستور قبل می باشد با این تفاوت که نتیجه در رجیستر ACC قرار می گیرد.
MPYXU ACC,T,loc16 :
این دستور محتوای علامت دار رجیستر T را در محتوای بدون علامت ادرس اشاره شده ضرب ونتیجه را در رجیستر ACC قرار می دهد.
[left; Calculate signed using 16-bit multiply:
; Y32 = Y32 + (signed) X16 * (unsigned) M16
MOV T,@X16 ; T = X16
MPYXU ACC,T,@M16 ; ACC = T * M16
ADDL @Y32,ACC ; Y32 = Y32 + ACC][/left]
MPYXU P,T,loc16 :
این دستور نیز مانند دستور قبلی می باشد با این تفاوت که نتیجه در رجیستر P قرار می گیرد.
با سلام. و ادامه دستورات ضرب...
MPYS P,T,loc16 :
این دستور نتیجه ضرب قبلی که در رجیستر P قرار دارد را بعد از شیفت از رجیستر ACC کم می کند به علاوه محتوای علامت دار 16 بیتی رجیستر T را در محتوای ادرس ضرب می کند و نتیجه را در رجیستر P قرار می دهد.
ACC = ACC − P << PM;
P = signed T * signed [loc16];
P = signed T * signed [loc16];
; Calculate using 16-bit multiply:
; Y = (X0*C0) >> 2) + (X1*C1 >> 2) + (X2*C2 >> 2)
SPM −2 ; Set product shift to >> 2
MOVP T,@X2 ; ACC = P, T = X2
MPYS P,T,@C2 ; ACC = ACC − P = 0, P = T*C2
MOV T,@X1 ; T = X1
MPYA P,T,@C1 ; ACC = X2*C2>>2, P = T*C1
MOV T,@X0 ; T = X0
MPYA P,T,@C0 ; ACC = X1*C1>>2 + X2*C2>>2, P = T*C0
ADDL ACC,P << PM ; ACC = X0*C0>>2 + X1*C1>>2 + X2*C2>>2
MOVL @Y,ACC ; Store result into Y
; Y = (X0*C0) >> 2) + (X1*C1 >> 2) + (X2*C2 >> 2)
SPM −2 ; Set product shift to >> 2
MOVP T,@X2 ; ACC = P, T = X2
MPYS P,T,@C2 ; ACC = ACC − P = 0, P = T*C2
MOV T,@X1 ; T = X1
MPYA P,T,@C1 ; ACC = X2*C2>>2, P = T*C1
MOV T,@X0 ; T = X0
MPYA P,T,@C0 ; ACC = X1*C1>>2 + X2*C2>>2, P = T*C0
ADDL ACC,P << PM ; ACC = X0*C0>>2 + X1*C1>>2 + X2*C2>>2
MOVL @Y,ACC ; Store result into Y
MPYB ACC,T,#8bit :
این دستور محتوای رجیستر T را در عدد ثابت 8 بیتی بدون علامت ضرب می کند و نتیجه را در ACC قرار می دهد.
ACC = signed T * 0:8bit
; Calculate signed using 16-bit multiply:
; Y32 = Y32 + (X16 * 5)
MOV T,@X16 ; T = X16
MPYB ACC,T,#5 ; ACC = T * 5
ADDL @Y32,ACC ; Y32 = Y32 + ACC
; Y32 = Y32 + (X16 * 5)
MOV T,@X16 ; T = X16
MPYB ACC,T,#5 ; ACC = T * 5
ADDL @Y32,ACC ; Y32 = Y32 + ACC
MPYU P,T,loc16 :
این دستور محتوای رجیستر T را در محتوای ادرس اشاره شده ضرب می کند و نتیجه 32 بیتی را در رجیستر P ذخیره می کند.
P = unsigned T * unsigned [loc16];
; Calculate unsigned value: Y32 = X16 * M16;
MOV T,@X16 ; T = X16
MPYU P,T,@M16 ; P = T * M16
MOVL @Y,P ; Store result into Y32
MPYU ACC,T,loc16 :MOV T,@X16 ; T = X16
MPYU P,T,@M16 ; P = T * M16
MOVL @Y,P ; Store result into Y32
این دستور مانند دستور قبل می باشد با این تفاوت که نتیجه در رجیستر ACC قرار می گیرد.
ACC = unsigned T * unsigned [loc16];
; Calculate unsigned using 16-bit multiply:
; Y32 = Y32 + X16*M16
MOV T,@X16 ; T = X16
MPYU ACC,T,@M16 ; ACC = T * M16
ADDL @Y32,ACC ; Y32 = Y32 + ACC
; Y32 = Y32 + X16*M16
MOV T,@X16 ; T = X16
MPYU ACC,T,@M16 ; ACC = T * M16
ADDL @Y32,ACC ; Y32 = Y32 + ACC
MPYXU ACC,T,loc16 :
این دستور محتوای علامت دار رجیستر T را در محتوای بدون علامت ادرس اشاره شده ضرب ونتیجه را در رجیستر ACC قرار می دهد.
ACC = signed T * unsigned [loc16];
[left; Calculate signed using 16-bit multiply:
; Y32 = Y32 + (signed) X16 * (unsigned) M16
MOV T,@X16 ; T = X16
MPYXU ACC,T,@M16 ; ACC = T * M16
ADDL @Y32,ACC ; Y32 = Y32 + ACC][/left]
MPYXU P,T,loc16 :
این دستور نیز مانند دستور قبلی می باشد با این تفاوت که نتیجه در رجیستر P قرار می گیرد.
P = signed T * unsigned [loc16];
; Calculate ”Y32 = X32 * M32” by parts using 16-bit multiply:
MOV T,@X32+0 ; T = unsigned low X32
MPYU ACC,T,@M32+0 ; ACC = T * unsigned low M32
MOV @Y32+0,AL ; Store low result into Y32
MOVU ACC,@AH ; Logical shift right ACC by 16
MOV T,@X32+1 ; T = signed high X32
MPYXU P,T,@M32+0 ; ACC = T * low unsigned M32
MOVA T,@M32+1 ; T = signed high M32, ACC += P
MPYXU P,T,@X32+0 ; ACC = T * low unsigned X32
ADDL ACC,@P ; Add P to ACC
MOV @Y32+1,AL ; Store high result into Y32
MOV T,@X32+0 ; T = unsigned low X32
MPYU ACC,T,@M32+0 ; ACC = T * unsigned low M32
MOV @Y32+0,AL ; Store low result into Y32
MOVU ACC,@AH ; Logical shift right ACC by 16
MOV T,@X32+1 ; T = signed high X32
MPYXU P,T,@M32+0 ; ACC = T * low unsigned M32
MOVA T,@M32+1 ; T = signed high M32, ACC += P
MPYXU P,T,@X32+0 ; ACC = T * low unsigned X32
ADDL ACC,@P ; Add P to ACC
MOV @Y32+1,AL ; Store high result into Y32
دیدگاه