Re: Dspic30f4011 Saturation 問題。

作者 W.W. 於 2019年03月21日 12:27:21
感謝 jason680 大的回覆,

以下是我 現在的 測試code寫法
(這版是最快的版本,前幾天才寫出來)

for(i= 0x8000; i < 0x7FFF; i+=1){
mulitp.ByteAccess = __builtin_mulss(b , i);
if(mulit1 > 0x0000)
d = 0x7FFF;
else if(mulit1 < (signed int)0xFFFF)
d = 0x8000;
else
d = b * i;}

其中 mulitp.ByteAccess = 是為了 將 long分成前後 16Bit做判斷。
int * int則是 直接打 乘號 (看 asm 會合出一樣的東西)
mulit1 則是事先定義好的 判斷 位元,即為long的前 16Bit (扣掉Sign BIT)。

所以想問問看有沒有像加法器一樣的 C flag的類似方法判斷是否staturation 或是 Mix C nad asm 的寫法加速。

另外,想延伸問一下四個問題,
Q1:mix c and asm 寫法下,只能用call function寫嗎?(參考 "XC16 C Compiler User's Guide" Ch16 範例)
Q2:這樣不就要多一個call function cycle?
Q3:XC16有 類似verilog的 bit cascade作法嗎?(Asm 可以這樣做,move bit就可以了)
Ex. {long[31:16] , long[15:0]} << for verilog
想寫出 {sign.Bit , int[14:0]} 類似這類型的 運算。
Q4:Shift right 是 >> operator,那shift left 有operator嗎?
還是只能 直接 乘 2的次方?這樣合乘不會使用乘法器?


P.S.上次回的可能有點小錯誤,那時候有加進迴圈的 cycle ,所以應該還要 再減掉 3個cycle。


謝謝。

來自: http://www.microchip.com.tw/newbb/viewtopic.php?forum=2&topic_id=22571&post_id=79385