On Sat, Feb 15, 2014 at 12:16 AM, Matthew Fortune <matthew.fort...@imgtec.com> wrote: >> On Fri, Feb 14, 2014 at 2:17 AM, Matthew Fortune >> <matthew.fort...@imgtec.com> wrote: >> > MIPS is currently evaluating the benefit of using SIMD registers to pass >> vector data by value. It is currently unclear how important it is for vector >> data >> to be passed in SIMD registers. I.e. the need for passing vector data by >> value >> in real world code is not immediately obvious. The performance advantage is >> therefore also unclear. >> > >> > Can anyone offer insight in the rationale behind decision decisions made >> for other architectures ABIs? For example, the x86 and x86_64 calling >> convention for vector data types presumes that they will passed in SSE/AVX >> registers and raises warnings if passed when sse/avx support is not enabled. >> This is what MIPS is currently considering however there are two concerns: >> > >> > 1) What about the ability to create architecture/implementation >> independent APIs that may include vector types in the prototypes. Such APIs >> may be built for varying levels of hardware support to make the most of a >> specific architecture implementation but be called from otherwise >> implementation agnostic code. To support such a scenario we would need to >> use a common calling convention usable on all architecture variants. >> > 2) Although vector types are not specifically covered by existing ABI >> definitions for MIPS we have unfortunately got a defacto standard for how >> to pass these by value. Vector types are simply considered to be small >> structures and passed as such following normal ABI rules. This is still a >> concern even though it is generally accepted that there is some room for >> change when it comes to vector data types in an existing ABI. >> > >> > If anyone could offer a brief history the x86 ABI with respect to vector >> > data >> types that may also be interesting. One question would be whether the use >> of vector registers in the calling convention was only enabled by default >> once >> there was a critical mass of implementations, and therefore the default ABI >> was changed to start making assumptions about the availability of features >> like SSE and AVX. >> > >> > Comments from any other architecture that has had to make such changes >> over time would also be welcome. >> >> PPC and arm and AARCH64 are common targets where vectors are >> passed/return via value. The idea is simple, sometimes you have functions >> like vector float vsinf(vector float a) where you want to be faster and >> avoid a >> round trip to L1 (or even L2). These kind of functions are common for vector >> programming. That is extending the scalar versions to the vector versions. > > I suppose this cost (L1/L2) is mitigated to some extent if the base ABI were > to pass a vector in multiple GP/FP register rather than via the stack. There > would of course still be a cost to marshall the data between GP/FP and SIMD > registers. For such a support routine like vsinf I would expect it also needs > a reduced clobber set to ensure that the caller's live SIMD registers don't > need saving/restoring, such registers would normally be caller-saved. If the > routine were to clobber all SIMD registers anyway then the improvement in > argument passing seems negligible. > > Do you/anyone know of any open source projects, which have started adopting > generic vector types, and show the use of this kind of construct?
Yes glibc provides these functions on x86 now. Thanks, Andrew > > Thanks for your input. > > Matthew > >> >> Thanks, >> Andrew Pinski >> >> > >> > Thanks in advance, >> > Matthew >> >