Понимание инструкции приведения LLVM - PullRequest
0 голосов
/ 18 апреля 2020

Предположим, у меня есть два указателя значения llvm x и y, где x - двойное, а y - целое число со знаком. И я sh приведу y к типу x. Я должен был бы сделать

y = builder.CreateCast(Instruction::SIToFP, y, x->getType());

Или эквивалентно

y = builder.CreateCast(Instruction::SIToFP, y, Type::getDoubleTy(context));

Почему нужно явно указывать инструкцию? который в данном случае равен Instruction::SIToFP, вместо того, чтобы просто указывать значение для приведения и тип назначения . Это кажется мне излишним, так как нужно заранее знать типы x и y, чтобы указать правильную инструкцию.

1 Ответ

1 голос
/ 01 мая 2020

Вы не можете определить, является ли y целым числом со знаком или без знака, не передавая его явно, потому что целочисленные типы LLVM не являются ни знаковыми, ни беззнаковыми: они представляют операции с битовыми векторами фиксированной ширины, и это операций над этим типом которые либо подписаны, либо не подписаны. Это довольно стандартно, если рассуждать близко к уровню машины, потому что машина видит целые числа одинаково. Таким образом, LLVM упрощает рассуждения об оптимизации программ, одной из основных целей проектирования.

...