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"); } }
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); }
llvm::Value *CodeGenFunction::EmitComplexToScalarConversion(ComplexValueTy Value, QualType Target) { return EmitScalarToScalarConversion(Value.Re, Target); }
ComplexValueTy CodeGenFunction::EmitScalarToComplexConversion(llvm::Value *Value, QualType Target) { auto ElementType = getContext().getComplexTypeElementType(Target); Value = EmitScalarToScalarConversion(Value, ElementType); return ComplexValueTy(Value, GetConstantZero(ElementType)); }
ComplexValueTy CodeGenFunction::EmitComplexToComplexConversion(ComplexValueTy Value, QualType Target) { auto ElementType = getContext().getComplexTypeElementType(Target); return ComplexValueTy(EmitScalarToScalarConversion(Value.Re, ElementType), EmitScalarToScalarConversion(Value.Im, ElementType)); }