[llvm-commits] [dragonegg] r127161 - in /dragonegg/trunk: llvm-convert.cpp llvm-internal.h
Duncan Sands
baldrick at free.fr
Mon Mar 7 07:56:08 PST 2011
Author: baldrick
Date: Mon Mar 7 09:56:08 2011
New Revision: 127161
URL: http://llvm.org/viewvc/llvm-project?rev=127161&view=rev
Log:
Add a separate routine for turning INTEGER_CST into a constant of register
type. This results in duplicated code, but I plan to transmogrify the
original version into something completely different.
Modified:
dragonegg/trunk/llvm-convert.cpp
dragonegg/trunk/llvm-internal.h
Modified: dragonegg/trunk/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=127161&r1=127160&r2=127161&view=diff
==============================================================================
--- dragonegg/trunk/llvm-convert.cpp (original)
+++ dragonegg/trunk/llvm-convert.cpp Mon Mar 7 09:56:08 2011
@@ -5881,8 +5881,7 @@
llvm_unreachable("Unhandled GIMPLE constant!");
case INTEGER_CST:
- C = TreeConstantToLLVM::ConvertINTEGER_CST(reg);
- break;
+ return EmitRegisterIntegerConstant(reg);
case REAL_CST:
C = TreeConstantToLLVM::ConvertREAL_CST(reg);
break;
@@ -5905,6 +5904,34 @@
return Mem2Reg(C, TREE_TYPE(reg), *TheFolder);
}
+/// EmitRegisterIntegerConstant - Turn the given INTEGER_CST into an LLVM
+/// constant of the corresponding register type.
+Constant *TreeToLLVM::EmitRegisterIntegerConstant(tree reg) {
+ unsigned Precision = TYPE_PRECISION(TREE_TYPE(reg));
+
+ ConstantInt *CI;
+ if (HOST_BITS_PER_WIDE_INT < integerPartWidth) {
+ assert(2 * HOST_BITS_PER_WIDE_INT <= integerPartWidth &&
+ "Unsupported host integer precision!");
+ unsigned ShiftAmt = HOST_BITS_PER_WIDE_INT;
+ integerPart Val = (integerPart)(unsigned HOST_WIDE_INT)TREE_INT_CST_LOW(reg)
+ + ((integerPart)(unsigned HOST_WIDE_INT)TREE_INT_CST_HIGH(reg) << ShiftAmt);
+ CI = ConstantInt::get(Context, APInt(Precision, Val));
+ } else {
+ assert(HOST_BITS_PER_WIDE_INT == integerPartWidth &&
+ "The engines cannae' take it captain!");
+ integerPart Parts[] = { TREE_INT_CST_LOW(reg), TREE_INT_CST_HIGH(reg) };
+ CI = ConstantInt::get(Context, APInt(Precision, 2, Parts));
+ }
+
+ // The destination can be a pointer, integer or floating point type so we need
+ // a generalized cast here
+ const Type *Ty = GetRegType(TREE_TYPE(reg));
+ Instruction::CastOps opcode = CastInst::getCastOpcode(CI, false, Ty,
+ !TYPE_UNSIGNED(TREE_TYPE(reg)));
+ return TheFolder->CreateCast(opcode, CI, Ty);
+}
+
/// Mem2Reg - Convert a value of in-memory type (that given by ConvertType)
/// to in-register type (that given by GetRegType).
Value *TreeToLLVM::Mem2Reg(Value *V, tree_node *type, LLVMBuilder &Builder) {
Modified: dragonegg/trunk/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-internal.h?rev=127161&r1=127160&r2=127161&view=diff
==============================================================================
--- dragonegg/trunk/llvm-internal.h (original)
+++ dragonegg/trunk/llvm-internal.h Mon Mar 7 09:56:08 2011
@@ -782,6 +782,10 @@
/// to an LLVM constant. Creates no code, only constants.
Constant *EmitRegisterConstant(tree_node *reg);
+ /// EmitRegisterIntegerConstant - Turn the given INTEGER_CST into an LLVM
+ /// constant of the corresponding register type.
+ Constant *EmitRegisterIntegerConstant(tree_node *reg);
+
/// Mem2Reg - Convert a value of in-memory type (that given by ConvertType)
/// to in-register type (that given by GetRegType). TODO: Eliminate these
/// methods: "memory" values should never be held in registers. Currently
More information about the llvm-commits
mailing list