mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Implement getIntegerCast and getFPCast for ConstantExpr. These are similar
to the createIntegerCast and createFPCast for CastInst instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32457 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6d81a7d2ae
commit
84f3eab017
@ -559,6 +559,19 @@ public:
|
||||
const Type *Ty ///< The type to which cast should be made
|
||||
);
|
||||
|
||||
/// @brief Create a ZExt, Bitcast or Trunc for integer -> integer casts
|
||||
static Constant *getIntegerCast(
|
||||
Constant *C, ///< The integer constant to be casted
|
||||
const Type *Ty, ///< The integer type to cast to
|
||||
bool isSigned ///< Whether C should be treated as signed or not
|
||||
);
|
||||
|
||||
/// @brief Create a FPExt, Bitcast or FPTrunc for fp -> fp casts
|
||||
static Constant *getFPCast(
|
||||
Constant *C, ///< The integer constant to be casted
|
||||
const Type *Ty ///< The integer type to cast to
|
||||
);
|
||||
|
||||
static Constant *getCast(Constant *C, const Type *Ty);
|
||||
|
||||
/// @brief Return true if this is a convert constant expression
|
||||
|
@ -1514,6 +1514,29 @@ Constant *ConstantExpr::getPointerCast(Constant *S, const Type *Ty) {
|
||||
return getCast(Instruction::BitCast, S, Ty);
|
||||
}
|
||||
|
||||
Constant *ConstantExpr::getIntegerCast(Constant *C, const Type *Ty,
|
||||
bool isSigned) {
|
||||
assert(C->getType()->isIntegral() && Ty->isIntegral() && "Invalid cast");
|
||||
unsigned SrcBits = C->getType()->getPrimitiveSizeInBits();
|
||||
unsigned DstBits = Ty->getPrimitiveSizeInBits();
|
||||
Instruction::CastOps opcode =
|
||||
(SrcBits == DstBits ? Instruction::BitCast :
|
||||
(SrcBits > DstBits ? Instruction::Trunc :
|
||||
(isSigned ? Instruction::SExt : Instruction::ZExt)));
|
||||
return getCast(opcode, C, Ty);
|
||||
}
|
||||
|
||||
Constant *ConstantExpr::getFPCast(Constant *C, const Type *Ty) {
|
||||
assert(C->getType()->isFloatingPoint() && Ty->isFloatingPoint() &&
|
||||
"Invalid cast");
|
||||
unsigned SrcBits = C->getType()->getPrimitiveSizeInBits();
|
||||
unsigned DstBits = Ty->getPrimitiveSizeInBits();
|
||||
Instruction::CastOps opcode =
|
||||
(SrcBits == DstBits ? Instruction::BitCast :
|
||||
(SrcBits > DstBits ? Instruction::FPTrunc : Instruction::FPExt));
|
||||
return getCast(opcode, C, Ty);
|
||||
}
|
||||
|
||||
Constant *ConstantExpr::getTrunc(Constant *C, const Type *Ty) {
|
||||
assert(C->getType()->isInteger() && "Trunc operand must be integer");
|
||||
assert(Ty->isIntegral() && "Trunc produces only integral");
|
||||
|
Loading…
Reference in New Issue
Block a user