labath added a comment.

In https://reviews.llvm.org/D32813#746012, @tberghammer wrote:

> I am a bit confused by the correlation between your change and commit 
> message. In the commit message you say that 32 byte structs


I mean 32-byte vectors. I.e. variables declared as `float foo 
__attribute__((__vector_size__(32)));`

> are passed as x8 pointers but the implementation of 
> LoadValueFromConsecutiveGPRRegisters seems to read it out from the v0-v8 
> registers for vectors of up to 8 elements independently of there size.

LoadValueFromConsecutiveGPRRegisters does this for "homogeneous structs", which 
is a different concept than vector: """Note that for short-vector types the 
fundamental types are 64-bit vector and 128-bit vector; the type of the 
elements in the short vector does not form part of the test for homogeneity. """

So an 8-byte and 16-byte vector (and probably structures containing them) are 
passed in v0..v7 registers. However, a 32-byte vector is not a short-vector 
type, nor a homogeneous aggregate, so it is passed as a generic struct, via the 
v8 pointer.

Also based on that code I have the suspicion that the first branch (where 
byte_size <= 16) is not actually used or necessary and also I don't see 
anything in the ABI documentation indicating otherwise (it would be a pretty 
crazy ABI if they say that if you have 4 double then passed in a single 32 byte 
register while if you have 8 double then passed in 8 different 32 byte 
registers). Can you make sure that branch is necessary (e.g. removing it breaks 
at least 1 test)?

Removing the branch makes the test for 8 and 16-byte vectors fail.


https://reviews.llvm.org/D32813



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to