Skip to content
IntrinsicLowering.cpp 43.6 KiB
Newer Older
    }
    break;
  }
  case Intrinsic::exp: {
    static Constant *expfFCache = 0;
    static Constant *expFCache = 0;
    static Constant *expLDCache = 0;
    switch (CI->getOperand(1)->getType()->getTypeID()) {
    default: assert(0 && "Invalid type in exp"); abort();
    case Type::FloatTyID:
      ReplaceCallWith("expf", CI, CI->op_begin()+1, CI->op_end(),
                    Type::FloatTy, expfFCache);
      break;
    case Type::DoubleTyID:
      ReplaceCallWith("exp", CI, CI->op_begin()+1, CI->op_end(),
                    Type::DoubleTy, expFCache);
      break;
    case Type::X86_FP80TyID:
    case Type::FP128TyID:
    case Type::PPC_FP128TyID:
      ReplaceCallWith("expl", CI, CI->op_begin()+1, CI->op_end(),
                    CI->getOperand(1)->getType(), expLDCache);
      break;
    }
    break;
  }
  case Intrinsic::exp2: {
    static Constant *exp2fFCache = 0;
    static Constant *exp2FCache = 0;
    static Constant *exp2LDCache = 0;
    switch (CI->getOperand(1)->getType()->getTypeID()) {
    default: assert(0 && "Invalid type in exp2"); abort();
    case Type::FloatTyID:
      ReplaceCallWith("exp2f", CI, CI->op_begin()+1, CI->op_end(),
                    Type::FloatTy, exp2fFCache);
      break;
    case Type::DoubleTyID:
      ReplaceCallWith("exp2", CI, CI->op_begin()+1, CI->op_end(),
                    Type::DoubleTy, exp2FCache);
      break;
    case Type::X86_FP80TyID:
    case Type::FP128TyID:
    case Type::PPC_FP128TyID:
      ReplaceCallWith("exp2l", CI, CI->op_begin()+1, CI->op_end(),
                    CI->getOperand(1)->getType(), exp2LDCache);
      break;
    }
    break;
  }
  case Intrinsic::pow: {
    static Constant *powfFCache = 0;
    static Constant *powFCache = 0;
    static Constant *powLDCache = 0;
    switch (CI->getOperand(1)->getType()->getTypeID()) {
    default: assert(0 && "Invalid type in pow"); abort();
    case Type::FloatTyID:
      ReplaceCallWith("powf", CI, CI->op_begin()+1, CI->op_end(),
                    Type::FloatTy, powfFCache);
      break;
    case Type::DoubleTyID:
      ReplaceCallWith("pow", CI, CI->op_begin()+1, CI->op_end(),
                    Type::DoubleTy, powFCache);
      break;
    case Type::X86_FP80TyID:
    case Type::FP128TyID:
    case Type::PPC_FP128TyID:
      ReplaceCallWith("powl", CI, CI->op_begin()+1, CI->op_end(),
                    CI->getOperand(1)->getType(), powLDCache);
      break;
    }
    break;
  }
  case Intrinsic::flt_rounds:
     // Lower to "round to the nearest"
     if (CI->getType() != Type::VoidTy)
       CI->replaceAllUsesWith(ConstantInt::get(CI->getType(), 1));
     break;
  assert(CI->use_empty() &&
         "Lowering should have eliminated any uses of the intrinsic call!");