[英]Why does RISC-V not have an instruction to calculate carry out?
我需要在 RISC-V 上處理 bignum 計算(加法和減法,但我將減法視為等效於有符號加法),情況有點復雜。 我從半小時的互聯網研究中收集到的信息:
bltu
完成溢出處理。據我所知,這些分支確實很好地涵蓋了大多數場景,除了一個:(簽名)大數加法。 因為在那里,我們在熱循環中遇到了最慢的檢查路徑。
我對 ISA 設計知之甚少,但為什么它們不包含計算(a + b) >> 32
的指令(實際上是執行)? 有點像乘法指令也被拆分為mul
和mulh
。 這將允許始終使用兩條指令進行所需的計算。 更強大的微架構甚至可以檢測到序列並且只進行一次加法。
我是否遺漏了一些會使該指令過時(或等同於它)的技巧? 它有我監督的任何主要缺點嗎? 我沒有找到很多關於這個一般主題的好文檔。
add
/ sltu
為您提供總和和進位: https://godbolt.org/z/Y7f5dzj1P顯示 GCC 將其用於無符號數學: sum=a+b
/ carry = sum<a
。
但問題在於缺少 ILP:在add
結果准備好之前, sltu
無法啟動。 如果您可以直接從輸入中獲得結轉,則可以解決此問題; 好點子。 當然 add/sltu 的融合也可以解決這個問題; 也許這就是建築師的想法。
大於 2 個 reg-width 的 bignum的另一個主要問題是使用進位進行加法(在帶有進位標志和加法進位指令的 ISA 上)。 更糟糕的是,從那個 3 輸入加法中得到結轉。 (其中任何一部分都可以換行,因此 AFAIK 無法將其組合成一個添加和比較。這是adc
的純 C 實現的常見缺陷;對該鏈接答案的評論有效 C,但無法編譯非常有效)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.