@@ -610,8 +610,6 @@ class ScalarExprEmitter
610
610
llvm::Value *EmitScalarPrePostIncDec (const UnaryOperator *E, LValue LV,
611
611
bool isInc, bool isPre);
612
612
613
- llvm::Value *EmitVectorElementConversion (QualType SrcType, QualType DstType,
614
- llvm::Value *Src);
615
613
616
614
Value *VisitUnaryAddrOf (const UnaryOperator *E) {
617
615
if (isa<MemberPointerType>(E->getType ())) // never sugared
@@ -1424,9 +1422,6 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
1424
1422
return Builder.CreateVectorSplat (NumElements, Src, " splat" );
1425
1423
}
1426
1424
1427
- if (SrcType->isExtVectorType () && DstType->isExtVectorType ())
1428
- return EmitVectorElementConversion (SrcType, DstType, Src);
1429
-
1430
1425
if (SrcType->isMatrixType () && DstType->isMatrixType ())
1431
1426
return EmitScalarCast (Src, SrcType, DstType, SrcTy, DstTy, Opts);
1432
1427
@@ -1706,14 +1701,10 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
1706
1701
}
1707
1702
1708
1703
Value *ScalarExprEmitter::VisitConvertVectorExpr (ConvertVectorExpr *E) {
1709
- QualType SrcType = E->getSrcExpr ()->getType (), DstType = E->getType ();
1710
- Value *Src = CGF.EmitScalarExpr (E->getSrcExpr ());
1711
- return EmitVectorElementConversion (SrcType, DstType, Src);
1712
- }
1704
+ QualType SrcType = E->getSrcExpr ()->getType (),
1705
+ DstType = E->getType ();
1713
1706
1714
- llvm::Value *ScalarExprEmitter::EmitVectorElementConversion (QualType SrcType,
1715
- QualType DstType,
1716
- Value *Src) {
1707
+ Value *Src = CGF.EmitScalarExpr (E->getSrcExpr ());
1717
1708
1718
1709
SrcType = CGF.getContext ().getCanonicalType (SrcType);
1719
1710
DstType = CGF.getContext ().getCanonicalType (DstType);
@@ -2415,6 +2406,12 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
2415
2406
CE->getExprLoc ());
2416
2407
2417
2408
case CK_IntegralCast: {
2409
+ if (E->getType ()->isExtVectorType () && DestTy->isExtVectorType ()) {
2410
+ QualType SrcElTy = E->getType ()->castAs <VectorType>()->getElementType ();
2411
+ return Builder.CreateIntCast (Visit (E), ConvertType (DestTy),
2412
+ SrcElTy->isSignedIntegerOrEnumerationType (),
2413
+ " conv" );
2414
+ }
2418
2415
ScalarConversionOpts Opts;
2419
2416
if (auto *ICE = dyn_cast<ImplicitCastExpr>(CE)) {
2420
2417
if (!ICE->isPartOfExplicitCast ())
@@ -2423,9 +2420,41 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
2423
2420
return EmitScalarConversion (Visit (E), E->getType (), DestTy,
2424
2421
CE->getExprLoc (), Opts);
2425
2422
}
2426
- case CK_IntegralToFloating:
2427
- case CK_FloatingToIntegral:
2428
- case CK_FloatingCast:
2423
+ case CK_IntegralToFloating: {
2424
+ if (E->getType ()->isExtVectorType () && DestTy->isExtVectorType ()) {
2425
+ QualType SrcElTy = E->getType ()->castAs <VectorType>()->getElementType ();
2426
+ if (SrcElTy->isSignedIntegerOrEnumerationType ())
2427
+ return Builder.CreateSIToFP (Visit (E), ConvertType (DestTy), " conv" );
2428
+ return Builder.CreateUIToFP (Visit (E), ConvertType (DestTy), " conv" );
2429
+ }
2430
+ CodeGenFunction::CGFPOptionsRAII FPOptsRAII (CGF, CE);
2431
+ return EmitScalarConversion (Visit (E), E->getType (), DestTy,
2432
+ CE->getExprLoc ());
2433
+ }
2434
+ case CK_FloatingToIntegral: {
2435
+ if (E->getType ()->isExtVectorType () && DestTy->isExtVectorType ()) {
2436
+ QualType DstElTy = DestTy->castAs <VectorType>()->getElementType ();
2437
+ if (DstElTy->isSignedIntegerOrEnumerationType ())
2438
+ return Builder.CreateFPToSI (Visit (E), ConvertType (DestTy), " conv" );
2439
+ return Builder.CreateFPToUI (Visit (E), ConvertType (DestTy), " conv" );
2440
+ }
2441
+ CodeGenFunction::CGFPOptionsRAII FPOptsRAII (CGF, CE);
2442
+ return EmitScalarConversion (Visit (E), E->getType (), DestTy,
2443
+ CE->getExprLoc ());
2444
+ }
2445
+ case CK_FloatingCast: {
2446
+ if (E->getType ()->isExtVectorType () && DestTy->isExtVectorType ()) {
2447
+ QualType SrcElTy = E->getType ()->castAs <VectorType>()->getElementType ();
2448
+ QualType DstElTy = DestTy->castAs <VectorType>()->getElementType ();
2449
+ if (DstElTy->castAs <BuiltinType>()->getKind () <
2450
+ SrcElTy->castAs <BuiltinType>()->getKind ())
2451
+ return Builder.CreateFPTrunc (Visit (E), ConvertType (DestTy), " conv" );
2452
+ return Builder.CreateFPExt (Visit (E), ConvertType (DestTy), " conv" );
2453
+ }
2454
+ CodeGenFunction::CGFPOptionsRAII FPOptsRAII (CGF, CE);
2455
+ return EmitScalarConversion (Visit (E), E->getType (), DestTy,
2456
+ CE->getExprLoc ());
2457
+ }
2429
2458
case CK_FixedPointToFloating:
2430
2459
case CK_FloatingToFixedPoint: {
2431
2460
CodeGenFunction::CGFPOptionsRAII FPOptsRAII (CGF, CE);
0 commit comments