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