On Jan 22, 2011, at 4:32 AM, Anton Yartsev wrote:
> On 14.12.2010 19:08, Douglas Gregor wrote:
>> On Nov 28, 2010, at 7:56 PM, Anton Yartsev wrote:
>>
>>> Support of ++/-- for AltiVec vectors according to "C/C++ Language
>>> Extensions for CBEA(Version 2.6)" section 10.3
>> A few comments.
>>
>> Index: lib/CodeGen/CGExprScalar.cpp
>> ===================================================================
>> --- lib/CodeGen/CGExprScalar.cpp (revision 120239)
>> +++ lib/CodeGen/CGExprScalar.cpp (working copy)
>> @@ -1257,10 +1257,11 @@
>> // An interesting aspect of this is that increment is always true.
>> // Decrement does not have this property.
>> NextVal = llvm::ConstantInt::getTrue(VMContext);
>> - } else if (isa<llvm::IntegerType>(InVal->getType())) {
>> + } else if (isa<llvm::IntegerType>(InVal->getType()) ||
>> + ValTy->isVectorType()&& ValTy->hasIntegerRepresentation()) {
>> NextVal = llvm::ConstantInt::get(InVal->getType(), AmountVal);
>> -
>> - if (!ValTy->isSignedIntegerType())
>> +
>> + if (!ValTy->hasSignedIntegerRepresentation())
>> // Unsigned integer inc is always two's complement.
>> NextVal = Builder.CreateAdd(InVal, NextVal, isInc ? "inc" : "dec");
>> else {
>> @@ -1292,6 +1293,8 @@
>> NextVal =
>> llvm::ConstantFP::get(VMContext,
>> llvm::APFloat(static_cast<double>(AmountVal)));
>> + else if (ValTy->isVectorType()&& ValTy->hasFloatingRepresentation())
>> + NextVal = llvm::ConstantFP::get(InVal->getType(), AmountVal);
>> else {
>> llvm::APFloat F(static_cast<float>(AmountVal));
>> bool ignored;
>>
>> This looks a bit tangled... please completely separate out the vector case,
>> rather than lumping it in with the integer case.
>>
>> Index: lib/Sema/SemaExpr.cpp
>> ===================================================================
>> --- lib/Sema/SemaExpr.cpp (revision 120239)
>> +++ lib/Sema/SemaExpr.cpp (working copy)
>> @@ -6931,6 +6931,8 @@
>> if (PR.isInvalid()) return QualType();
>> return CheckIncrementDecrementOperand(S, PR.take(), VK, OpLoc,
>> isInc, isPrefix);
>> + } else if (ResType->isVectorType()&& S.getLangOptions().AltiVec) {
>> + // OK! ( C/C++ Language Extensions for CBEA(Version 2.6) 10.3 )
>> } else {
>> S.Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
>> << ResType<< int(isInc)<< Op->getSourceRange();
>>
>> Please check S.getLangOptions().AltiVec first, since the isVectorType()
>> check is more expensive.
>>
>> Could you add some test cases that ensure that ++ and -- on vectors work
>> properly in C++? Things to consider:
>> - Test that the result is an lvalue, such that you can assign to it,
>> assign to its components, etc.
>> - Test that ++/-- work in templates, both with an arbitrary type 'T'
>> that gets instantiated to an AltiVec vector, and when we have an AltiVec
>> vector of dependent size (e.g., the size is N, a non-type template parameter
>> of type unsigned).
>>
>> - Doug
> Here is the new patch.
Looks good, thanks! I've forgotten: do you have commit access?
> Took into account the comments, but have not got how to create AltiVec vector
> of dependent size. Did you mean creating gcc vector with the vector_size
> attribute?
I was thinking of:
template<int N>
struct X {
typedef float type __attribute__((ext_vector_type(N)));
};
X<4>::type v = { 1, 2, 3, 4};
But I've completely forgotten how or if ext_vector_type relates to AltiVec
vectors! ;)
- Doug
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits