Skip to content

Commit 74218a9

Browse files
committed
[clang][Interp] Implement __builtin_convertvector
1 parent ff313ee commit 74218a9

File tree

3 files changed

+269
-0
lines changed

3 files changed

+269
-0
lines changed

clang/lib/AST/Interp/ByteCodeExprGen.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2498,6 +2498,39 @@ bool ByteCodeExprGen<Emitter>::VisitAddrLabelExpr(const AddrLabelExpr *E) {
24982498
return this->emitGetLocal(PT_Ptr, Offset, E);
24992499
}
25002500

2501+
template <class Emitter>
2502+
bool ByteCodeExprGen<Emitter>::VisitConvertVectorExpr(
2503+
const ConvertVectorExpr *E) {
2504+
assert(Initializing);
2505+
const auto *VT = E->getType()->castAs<VectorType>();
2506+
QualType ElemType = VT->getElementType();
2507+
PrimType ElemT = classifyPrim(ElemType);
2508+
const Expr *Src = E->getSrcExpr();
2509+
PrimType SrcElemT =
2510+
classifyPrim(Src->getType()->castAs<VectorType>()->getElementType());
2511+
2512+
unsigned SrcOffset = this->allocateLocalPrimitive(Src, PT_Ptr, true, false);
2513+
if (!this->visit(Src))
2514+
return false;
2515+
if (!this->emitSetLocal(PT_Ptr, SrcOffset, E))
2516+
return false;
2517+
2518+
for (unsigned I = 0; I != VT->getNumElements(); ++I) {
2519+
if (!this->emitGetLocal(PT_Ptr, SrcOffset, E))
2520+
return false;
2521+
if (!this->emitArrayElemPop(SrcElemT, I, E))
2522+
return false;
2523+
if (SrcElemT != ElemT) {
2524+
if (!this->emitPrimCast(SrcElemT, ElemT, ElemType, E))
2525+
return false;
2526+
}
2527+
if (!this->emitInitElem(ElemT, I, E))
2528+
return false;
2529+
}
2530+
2531+
return true;
2532+
}
2533+
25012534
template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) {
25022535
OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/true,
25032536
/*NewInitializing=*/false);

clang/lib/AST/Interp/ByteCodeExprGen.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>,
123123
bool VisitPackIndexingExpr(const PackIndexingExpr *E);
124124
bool VisitRecoveryExpr(const RecoveryExpr *E);
125125
bool VisitAddrLabelExpr(const AddrLabelExpr *E);
126+
bool VisitConvertVectorExpr(const ConvertVectorExpr *E);
126127

127128
protected:
128129
bool visitExpr(const Expr *E) override;

clang/test/AST/Interp/builtin-functions.cpp

Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,3 +639,238 @@ void test7(void) {
639639
/// the actual implementation uses analyze_os_log::computeOSLogBufferLayout(), which
640640
/// is tested elsewhere.
641641
static_assert(__builtin_os_log_format_buffer_size("%{mask.xyz}s", "abc") != 0, "");
642+
643+
/// Copied from test/Sema/constant_builtins_vector.cpp.
644+
/// Some tests are missing since we run this for multiple targets,
645+
/// some of which do not support _BitInt.
646+
#ifndef __AVR__
647+
namespace convertvector {
648+
typedef _BitInt(128) BitInt128;
649+
650+
typedef double vector4double __attribute__((__vector_size__(32)));
651+
typedef float vector4float __attribute__((__vector_size__(16)));
652+
typedef long long vector4long __attribute__((__vector_size__(32)));
653+
typedef int vector4int __attribute__((__vector_size__(16)));
654+
typedef short vector4short __attribute__((__vector_size__(8)));
655+
typedef char vector4char __attribute__((__vector_size__(4)));
656+
typedef BitInt128 vector4BitInt128 __attribute__((__vector_size__(64)));
657+
typedef double vector8double __attribute__((__vector_size__(64)));
658+
typedef float vector8float __attribute__((__vector_size__(32)));
659+
typedef long long vector8long __attribute__((__vector_size__(64)));
660+
typedef int vector8int __attribute__((__vector_size__(32)));
661+
typedef short vector8short __attribute__((__vector_size__(16)));
662+
typedef char vector8char __attribute__((__vector_size__(8)));
663+
typedef BitInt128 vector8BitInt128 __attribute__((__vector_size__(128)));
664+
665+
constexpr vector4double from_vector4double_to_vector4double_var =
666+
__builtin_convertvector((vector4double){0, 1, 2, 3}, vector4double);
667+
constexpr vector4float from_vector4double_to_vector4float_var =
668+
__builtin_convertvector((vector4double){0, 1, 2, 3}, vector4float);
669+
constexpr vector4long from_vector4double_to_vector4long_var =
670+
__builtin_convertvector((vector4double){0, 1, 2, 3}, vector4long);
671+
constexpr vector4int from_vector4double_to_vector4int_var =
672+
__builtin_convertvector((vector4double){0, 1, 2, 3}, vector4int);
673+
constexpr vector4short from_vector4double_to_vector4short_var =
674+
__builtin_convertvector((vector4double){0, 1, 2, 3}, vector4short);
675+
constexpr vector4char from_vector4double_to_vector4char_var =
676+
__builtin_convertvector((vector4double){0, 1, 2, 3}, vector4char);
677+
constexpr vector4BitInt128 from_vector4double_to_vector4BitInt128_var =
678+
__builtin_convertvector((vector4double){0, 1, 2, 3}, vector4BitInt128);
679+
constexpr vector4double from_vector4float_to_vector4double_var =
680+
__builtin_convertvector((vector4float){0, 1, 2, 3}, vector4double);
681+
constexpr vector4float from_vector4float_to_vector4float_var =
682+
__builtin_convertvector((vector4float){0, 1, 2, 3}, vector4float);
683+
constexpr vector4long from_vector4float_to_vector4long_var =
684+
__builtin_convertvector((vector4float){0, 1, 2, 3}, vector4long);
685+
constexpr vector4int from_vector4float_to_vector4int_var =
686+
__builtin_convertvector((vector4float){0, 1, 2, 3}, vector4int);
687+
constexpr vector4short from_vector4float_to_vector4short_var =
688+
__builtin_convertvector((vector4float){0, 1, 2, 3}, vector4short);
689+
constexpr vector4char from_vector4float_to_vector4char_var =
690+
__builtin_convertvector((vector4float){0, 1, 2, 3}, vector4char);
691+
constexpr vector4BitInt128 from_vector4float_to_vector4BitInt128_var =
692+
__builtin_convertvector((vector4float){0, 1, 2, 3}, vector4BitInt128);
693+
constexpr vector4double from_vector4long_to_vector4double_var =
694+
__builtin_convertvector((vector4long){0, 1, 2, 3}, vector4double);
695+
constexpr vector4float from_vector4long_to_vector4float_var =
696+
__builtin_convertvector((vector4long){0, 1, 2, 3}, vector4float);
697+
constexpr vector4long from_vector4long_to_vector4long_var =
698+
__builtin_convertvector((vector4long){0, 1, 2, 3}, vector4long);
699+
constexpr vector4int from_vector4long_to_vector4int_var =
700+
__builtin_convertvector((vector4long){0, 1, 2, 3}, vector4int);
701+
constexpr vector4short from_vector4long_to_vector4short_var =
702+
__builtin_convertvector((vector4long){0, 1, 2, 3}, vector4short);
703+
constexpr vector4char from_vector4long_to_vector4char_var =
704+
__builtin_convertvector((vector4long){0, 1, 2, 3}, vector4char);
705+
constexpr vector4BitInt128 from_vector4long_to_vector4BitInt128_var =
706+
__builtin_convertvector((vector4long){0, 1, 2, 3}, vector4BitInt128);
707+
constexpr vector4double from_vector4int_to_vector4double_var =
708+
__builtin_convertvector((vector4int){0, 1, 2, 3}, vector4double);
709+
constexpr vector4float from_vector4int_to_vector4float_var =
710+
__builtin_convertvector((vector4int){0, 1, 2, 3}, vector4float);
711+
constexpr vector4long from_vector4int_to_vector4long_var =
712+
__builtin_convertvector((vector4int){0, 1, 2, 3}, vector4long);
713+
constexpr vector4int from_vector4int_to_vector4int_var =
714+
__builtin_convertvector((vector4int){0, 1, 2, 3}, vector4int);
715+
constexpr vector4short from_vector4int_to_vector4short_var =
716+
__builtin_convertvector((vector4int){0, 1, 2, 3}, vector4short);
717+
constexpr vector4char from_vector4int_to_vector4char_var =
718+
__builtin_convertvector((vector4int){0, 1, 2, 3}, vector4char);
719+
constexpr vector4BitInt128 from_vector4int_to_vector4BitInt128_var =
720+
__builtin_convertvector((vector4int){0, 1, 2, 3}, vector4BitInt128);
721+
constexpr vector4double from_vector4short_to_vector4double_var =
722+
__builtin_convertvector((vector4short){0, 1, 2, 3}, vector4double);
723+
constexpr vector4float from_vector4short_to_vector4float_var =
724+
__builtin_convertvector((vector4short){0, 1, 2, 3}, vector4float);
725+
constexpr vector4long from_vector4short_to_vector4long_var =
726+
__builtin_convertvector((vector4short){0, 1, 2, 3}, vector4long);
727+
constexpr vector4int from_vector4short_to_vector4int_var =
728+
__builtin_convertvector((vector4short){0, 1, 2, 3}, vector4int);
729+
constexpr vector4short from_vector4short_to_vector4short_var =
730+
__builtin_convertvector((vector4short){0, 1, 2, 3}, vector4short);
731+
constexpr vector4char from_vector4short_to_vector4char_var =
732+
__builtin_convertvector((vector4short){0, 1, 2, 3}, vector4char);
733+
constexpr vector4BitInt128 from_vector4short_to_vector4BitInt128_var =
734+
__builtin_convertvector((vector4short){0, 1, 2, 3}, vector4BitInt128);
735+
constexpr vector4double from_vector4char_to_vector4double_var =
736+
__builtin_convertvector((vector4char){0, 1, 2, 3}, vector4double);
737+
constexpr vector4float from_vector4char_to_vector4float_var =
738+
__builtin_convertvector((vector4char){0, 1, 2, 3}, vector4float);
739+
constexpr vector4long from_vector4char_to_vector4long_var =
740+
__builtin_convertvector((vector4char){0, 1, 2, 3}, vector4long);
741+
constexpr vector4int from_vector4char_to_vector4int_var =
742+
__builtin_convertvector((vector4char){0, 1, 2, 3}, vector4int);
743+
constexpr vector4short from_vector4char_to_vector4short_var =
744+
__builtin_convertvector((vector4char){0, 1, 2, 3}, vector4short);
745+
constexpr vector4char from_vector4char_to_vector4char_var =
746+
__builtin_convertvector((vector4char){0, 1, 2, 3}, vector4char);
747+
constexpr vector8double from_vector8double_to_vector8double_var =
748+
__builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
749+
vector8double);
750+
constexpr vector8float from_vector8double_to_vector8float_var =
751+
__builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
752+
vector8float);
753+
constexpr vector8long from_vector8double_to_vector8long_var =
754+
__builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
755+
vector8long);
756+
constexpr vector8int from_vector8double_to_vector8int_var =
757+
__builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
758+
vector8int);
759+
constexpr vector8short from_vector8double_to_vector8short_var =
760+
__builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
761+
vector8short);
762+
constexpr vector8char from_vector8double_to_vector8char_var =
763+
__builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
764+
vector8char);
765+
constexpr vector8BitInt128 from_vector8double_to_vector8BitInt128_var =
766+
__builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
767+
vector8BitInt128);
768+
constexpr vector8double from_vector8float_to_vector8double_var =
769+
__builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
770+
vector8double);
771+
constexpr vector8float from_vector8float_to_vector8float_var =
772+
__builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
773+
vector8float);
774+
constexpr vector8long from_vector8float_to_vector8long_var =
775+
__builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
776+
vector8long);
777+
constexpr vector8int from_vector8float_to_vector8int_var =
778+
__builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);
779+
constexpr vector8short from_vector8float_to_vector8short_var =
780+
__builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
781+
vector8short);
782+
constexpr vector8char from_vector8float_to_vector8char_var =
783+
__builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
784+
vector8char);
785+
constexpr vector8BitInt128 from_vector8float_to_vector8BitInt128_var =
786+
__builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
787+
vector8BitInt128);
788+
constexpr vector8double from_vector8long_to_vector8double_var =
789+
__builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},
790+
vector8double);
791+
constexpr vector8float from_vector8long_to_vector8float_var =
792+
__builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},
793+
vector8float);
794+
constexpr vector8long from_vector8long_to_vector8long_var =
795+
__builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7}, vector8long);
796+
constexpr vector8int from_vector8long_to_vector8int_var =
797+
__builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);
798+
constexpr vector8short from_vector8long_to_vector8short_var =
799+
__builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},
800+
vector8short);
801+
constexpr vector8char from_vector8long_to_vector8char_var =
802+
__builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7}, vector8char);
803+
constexpr vector8double from_vector8int_to_vector8double_var =
804+
__builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7},
805+
vector8double);
806+
constexpr vector8float from_vector8int_to_vector8float_var =
807+
__builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8float);
808+
constexpr vector8long from_vector8int_to_vector8long_var =
809+
__builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8long);
810+
constexpr vector8int from_vector8int_to_vector8int_var =
811+
__builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);
812+
constexpr vector8short from_vector8int_to_vector8short_var =
813+
__builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8short);
814+
constexpr vector8char from_vector8int_to_vector8char_var =
815+
__builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8char);
816+
constexpr vector8double from_vector8short_to_vector8double_var =
817+
__builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
818+
vector8double);
819+
constexpr vector8float from_vector8short_to_vector8float_var =
820+
__builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
821+
vector8float);
822+
constexpr vector8long from_vector8short_to_vector8long_var =
823+
__builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
824+
vector8long);
825+
constexpr vector8int from_vector8short_to_vector8int_var =
826+
__builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);
827+
constexpr vector8short from_vector8short_to_vector8short_var =
828+
__builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
829+
vector8short);
830+
constexpr vector8char from_vector8short_to_vector8char_var =
831+
__builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
832+
vector8char);
833+
834+
constexpr vector8double from_vector8char_to_vector8double_var =
835+
__builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},
836+
vector8double);
837+
constexpr vector8float from_vector8char_to_vector8float_var =
838+
__builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},
839+
vector8float);
840+
constexpr vector8long from_vector8char_to_vector8long_var =
841+
__builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7}, vector8long);
842+
constexpr vector8int from_vector8char_to_vector8int_var =
843+
__builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);
844+
constexpr vector8short from_vector8char_to_vector8short_var =
845+
__builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},
846+
vector8short);
847+
constexpr vector8char from_vector8char_to_vector8char_var =
848+
__builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7}, vector8char);
849+
constexpr vector8double from_vector8BitInt128_to_vector8double_var =
850+
__builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
851+
vector8double);
852+
constexpr vector8float from_vector8BitInt128_to_vector8float_var =
853+
__builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
854+
vector8float);
855+
constexpr vector8long from_vector8BitInt128_to_vector8long_var =
856+
__builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
857+
vector8long);
858+
constexpr vector8int from_vector8BitInt128_to_vector8int_var =
859+
__builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
860+
vector8int);
861+
constexpr vector8short from_vector8BitInt128_to_vector8short_var =
862+
__builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
863+
vector8short);
864+
constexpr vector8char from_vector8BitInt128_to_vector8char_var =
865+
__builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
866+
vector8char);
867+
constexpr vector8BitInt128 from_vector8BitInt128_to_vector8BitInt128_var =
868+
__builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
869+
vector8BitInt128);
870+
static_assert(from_vector8BitInt128_to_vector8BitInt128_var[0] == 0, ""); // ref-error {{not an integral constant expression}}
871+
static_assert(from_vector8BitInt128_to_vector8BitInt128_var[1] == 1, ""); // ref-error {{not an integral constant expression}}
872+
static_assert(from_vector8BitInt128_to_vector8BitInt128_var[2] == 2, ""); // ref-error {{not an integral constant expression}}
873+
static_assert(from_vector8BitInt128_to_vector8BitInt128_var[3] == 3, ""); // ref-error {{not an integral constant expression}}
874+
static_assert(from_vector8BitInt128_to_vector8BitInt128_var[4] == 4, ""); // ref-error {{not an integral constant expression}}
875+
}
876+
#endif

0 commit comments

Comments
 (0)