55 fold(
const std::vector<llvm::Constant*>& args,
56 const SignatureT& function,
60 assert(I-1 < args.size());
61 llvm::Constant* constant = args[I-1];
62 const llvm::Type* type = constant->getType();
63 if (type->isIntegerTy()) {
64 assert(llvm::isa<llvm::ConstantInt>(constant));
65 llvm::ConstantInt* cint =
66 llvm::cast<llvm::ConstantInt>(constant);
67 const uint64_t val = cint->getLimitedValue();
68 return call<uint64_t, ArgumentValueType>(args, function, C, val, ts...);
70 else if (type->isFloatTy() || type->isDoubleTy()) {
71 assert(llvm::isa<llvm::ConstantFP>(constant));
72 llvm::ConstantFP* cfp =
73 llvm::cast<llvm::ConstantFP>(constant);
74 const llvm::APFloat& apf = cfp->getValueAPF();
75 if (type->isFloatTy()) {
76 const float val = apf.convertToFloat();
77 return call<float, ArgumentValueType>(args, function, C, val, ts...);
79 if (type->isDoubleTy()) {
80 const double val = apf.convertToDouble();
81 return call<double, ArgumentValueType>(args, function, C, val, ts...);
84 else if (type->isArrayTy()) {
104 return Next::fold(args, function, C, Out(arg), ts...);