llvm IRBuilder<> :: CreateUDiv / CreateSDiv / CreateExactUDiv

时间:2011-03-17 22:40:09

标签: c++ llvm

我已经看到创建分区操作有各种各样的可能性,UDiv / SDiv和ExactUDiv,

我推断U和S之间的区别代表无符号和有符号,但这意味着无符号会忽略符号吗?

另外,究竟什么意思?结果是浮动?

此外,NSWAdd和NUWAdd是什么意思?我找不到任何documentation

1 个答案:

答案 0 :(得分:3)

我假设LLVM使用two's complement来存储整数,在这种情况下,(带符号)负数看起来像是UDiv的大型无符号数(例如,32位-1的二进制补码表示是0xFFFFFFFF)。因此SDiv(-16, 2) == -8UDiv(-16, 2) == 2147483640

简而言之:不,这个符号不会因为无符号而被忽略。如果你想要,你需要通过获取有符号值的绝对值来解决它。

我可以从here推断出,当知道除法没有余数时,似乎确切的div指令。这使得更容易优化。

更多内容如here所述; NSW和NUW表示“No Signed Wrap”和“No Unsigned Wrap”,这意味着如果发生包装,则会生成陷阱值(请考虑UAdd(-1, -1)从上面获得的知识)。