RValueTy CodeGenFunction::EmitIntrinsicCallCharacter(intrinsic::FunctionKind Func,
                                                     CharacterValueTy A1,
                                                     CharacterValueTy A2) {
  auto CharType = getContext().CharacterTy;
  CGFunction RuntimeFunc;
  switch(Func) {
  case intrinsic::INDEX: {
    RuntimeFunc = CGM.GetRuntimeFunction3(MANGLE_CHAR_FUNCTION("index", CharType),
                                          CharType, CharType, CGM.Int32Ty, CGM.SizeTy);
    return EmitScalarToScalarConversion(EmitCall3(RuntimeFunc, A1, A2, Builder.getInt32(0)).asScalar(),
                                        getContext().IntegerTy);
  }

  case intrinsic::LLE:
  case intrinsic::LLT:
  case intrinsic::LGE:
  case intrinsic::LGT:
    RuntimeFunc = CGM.GetRuntimeFunction2(MANGLE_CHAR_FUNCTION("lexcompare", CharType),
                                          CharType, CharType, CGM.Int32Ty);
    return ConvertComparisonResultToRelationalOp(GetLexicalComparisonOp(Func),
                                                 EmitCall2(RuntimeFunc, A1, A2).asScalar());
  default:
    llvm_unreachable("invalid character intrinsic");
  }
}
Beispiel #2
0
RValueTy CodeGenFunction::EmitImplicitConversion(RValueTy Val, QualType T) {
  if(Val.isScalar()) {
    if(T->isComplexType())
      return EmitScalarToComplexConversion(Val.asScalar(), T);
    return EmitScalarToScalarConversion(Val.asScalar(), T);
  }
  assert(Val.isComplex());
  if(T->isComplexType())
    return EmitComplexToComplexConversion(Val.asComplex(), T);
  return EmitComplexToScalarConversion(Val.asComplex(), T);
}
Beispiel #3
0
llvm::Value *CodeGenFunction::EmitComplexToScalarConversion(ComplexValueTy Value, QualType Target) {
  return EmitScalarToScalarConversion(Value.Re, Target);
}
Beispiel #4
0
ComplexValueTy CodeGenFunction::EmitScalarToComplexConversion(llvm::Value *Value, QualType Target) {
  auto ElementType = getContext().getComplexTypeElementType(Target);
  Value = EmitScalarToScalarConversion(Value, ElementType);
  return ComplexValueTy(Value, GetConstantZero(ElementType));
}
Beispiel #5
0
ComplexValueTy CodeGenFunction::EmitComplexToComplexConversion(ComplexValueTy Value, QualType Target) {
  auto ElementType = getContext().getComplexTypeElementType(Target);
  return ComplexValueTy(EmitScalarToScalarConversion(Value.Re, ElementType),
                        EmitScalarToScalarConversion(Value.Im, ElementType));
}