llvm IRBuilder <> :: CreateUDiv / CreateSDiv / CreateExactUDiv - PullRequest
1 голос
/ 18 марта 2011

Я видел, что для создания операций деления существует множество возможностей, UDiv / SDiv и ExactUDiv,

. Я предполагаю, что разница между U и S обозначает Unsigned и Signed, но это означает, чтознак игнорируется для Unsigned?

также, что означает Exact?что результат - это число с плавающей точкой?

Кроме того, что означает NSWAdd и NUWAdd?я не смог найти документацию

1 Ответ

3 голосов
/ 18 марта 2011

Я предполагаю, что LLVM использует два дополнения для хранения целых чисел, и в этом случае (подписанное) отрицательное число будет выглядеть как большое число без знака для UDiv (например, представление дополнения двух для 32-битного -1 is 0xFFFFFFFF).Таким образом, SDiv(-16, 2) == -8 while UDiv(-16, 2) == 2147483640.

Короче говоря: нет, знак не просто игнорируется для неподписанного.Если вы хотите решить эту проблему, взяв для этого абсолютное значение со знаком.

То, что я могу вывести из здесь , кажется, точные инструкции div - это когда известночто у подразделения нет остатка.Это облегчает оптимизацию.

Далее, как указано здесь ;NSW и NUW означают «No Signed Wrap» и «No Unsigned Wrap», что означает, что значение прерывания генерируется, если происходит перенос (рассмотрим UAdd(-1, -1) с учетом знаний, полученных выше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...