290 const llvm::Type*
const targetType,
291 const std::string& twine =
"")
294#define BIND_ARITHMETIC_CAST_OP(Function, Twine) \
295 std::bind(&Function, \
296 std::placeholders::_1, \
297 std::placeholders::_2, \
298 std::placeholders::_3, \
301 if (targetType->isDoubleTy()) {
310 else if (targetType->isFloatTy()) {
319 else if (targetType->isHalfTy()) {
328 else if (targetType->isIntegerTy(64)) {
337 else if (targetType->isIntegerTy(32)) {
346 else if (targetType->isIntegerTy(16)) {
355 else if (targetType->isIntegerTy(8)) {
364 else if (targetType->isIntegerTy(1)) {
374#undef BIND_ARITHMETIC_CAST_OP
508 llvm::Type* targetElementType,
509 llvm::IRBuilder<>& builder)
511 OPENVDB_ASSERT(targetElementType && (targetElementType->isIntegerTy() ||
512 targetElementType->isFloatingPointTy()) &&
513 "Target element type is not a scalar type");
514 OPENVDB_ASSERT(ptrToArray && ptrToArray->getType()->isPointerTy() &&
515 "Input to arrayCast is not a pointer type.");
517 llvm::Type* arrayType = ptrToArray->getType()->getContainedType(0);
518 OPENVDB_ASSERT(arrayType && llvm::isa<llvm::ArrayType>(arrayType));
521 llvm::Type* sourceElementType = arrayType->getArrayElementType();
522 OPENVDB_ASSERT(sourceElementType && (sourceElementType->isIntegerTy() ||
523 sourceElementType->isFloatingPointTy()) &&
524 "Source element type is not a scalar type");
526 if (sourceElementType == targetElementType)
return ptrToArray;
530 const size_t elementSize = arrayType->getArrayNumElements();
531 llvm::Value* targetArray =
533 llvm::ArrayType::get(targetElementType, elementSize));
535 for (
size_t i = 0; i < elementSize; ++i) {
538 source =
ir_load(builder, source);
539 source = llvmCastFunction(builder, source, targetElementType);
540 builder.CreateStore(source, target);