首先,請注意兩個任意大小的整數,並且不區分有符號和無符號整數是添加到LLVM 2.0中的修改。早期版本只有幾個整數類型,帶有有符號/無符號的區別。
現在,您的問題:
LLVM,但考慮到設計的C/C++,是不是針對這些語言。擁有更多可能的整數類型爲您提供更多的靈活當然,你不必使用這些類型 - 正如你所提到的,我猜測,LLVM(即Clang)的任何C/C++前端可能只會生成i1,i8,i16,i32和i64 。
編輯:顯然我錯了,Clang也使用了其他整數類型,請參見下面的Jens的評論。
是的,LLVM不區分有符號和無符號整數類型,所以兩者都將被降低到i32。不過,對無符號整數的操作將根據原始類型進行翻譯;例如無符號整數之間的劃分將是udiv
,而簽署之間的劃分將是sdiv
。因爲整數被表示爲two's complement,但是很多操作(例如add
)不關心簽名/未簽名,因此只有一個版本。
至於爲什麼沒有區別在LLVM符號和無符號之間進行的,讀the details on this enhancement request - 總之,同時具有符號和無符號版本導致了大量IR膨脹和不利於一些優化,因此它已被刪除。
最後,你問爲什麼沒有f32
- 答案是我不知道,也許它被認爲沒有任何大小的整數有用。但是請注意,f32
不是真正的描述 - 如果您想要任意浮點類型,您至少需要指定基數的大小和指數的大小,如f23e8
而不是float
和f52e11
而不是double
。如果你問我,這有點麻煩,儘管我猜float
和double
可能已經成爲這些的同義詞。
來源
2013-02-06 07:43:55
Oak
實際上'f32'確實存在浮點數。我問這個問題的原因是,我認爲如果有符號和無符號整數都可以用i32表示,那麼也可以用這種方式表示一個32位浮點數。我想這是你提到的一個詳細的設計決定。 –
@AliJ我沒有在[浮點類型的lang參考部分](http://llvm.org/docs/LangRef.html#floating-point-types)上列出'f32'列表...除非你意味着有一個與該名稱相關的通用實現? – Oak
非常感謝!碰巧,我碰到了Clang生成的兩條指令:'store i576%bla,i576 * bitcast(%class.Foo * @_Global to i576 *),align 8' and'%11 = load i384 *%10,對齊8'。我會假設它們被降低到使用SIMD類型的memcpy調用或者一系列的存儲/加載指令。 – Jens