Hello! I would like to propose an ABI adjustment for the aloha OSF/1 ABI. To quote explanation in the patch: --q-- /* Pass float and _Complex float variable arguments by reference. This avoids 64-bit store from a FP register to a pretend args save area and subsequent 32-bit load from the saved location to a FP register. Note that 32-bit loads and stores to/from a FP register on alpha reorder bits to form a canonical 64-bit value in the FP register. This fact invalidates compiler assumption that 32-bit FP value lives in the lower 32-bits of the passed 64-bit FP value, so loading the 32-bit value from the stored 64-bit location using 32-bit FP load is invalid on alpha. This introduces sort of ABI incompatibility, but until _Float32 was introduced, C-family languages promoted 32-bit float variable arg to a 64-bit double, and it was not allowed to pass float as a varible argument. Passing _Complex float as a variable argument never worked on alpha. Thus, we have no backward compatibility issues to worry about, and passing un-promoted _Float32 and _Complex float as a variable argument will actually work in the future. */ --/q-- Another rationale for the adjustment is, that "other" compilers do not know about _Float32 and _Complex float, the official ABI pre-dates some of these types by a decade or more (I was not able to find the authoritative OSF/1 ABI document on the net...), and lastly ... gcc is the last compiler that keeps this dead architecture alive, so IMO we can consider it as a de-facto implementer of the ABI. Following this ABI adjustment, we can also fix libffi, where libffi.complex/cls_complex_va_float.c says: --q-- /* Alpha splits _Complex into two arguments. It's illegal to pass float through varargs, so _Complex float goes badly. In sort of gets passed as _Complex double, but the compiler doesn't agree with itself on this issue. */ /* { dg-do run { xfail alpha*-*-* } } */ --/q-- 2016-09-02 Uros Bizjak * config/alpha/alpha.c (alpha_pass_by_reference): Pass un-named SFmode and SCmode arguments by reference. Patch was bootstrapped and regression tested on alphaev68-linux-gnu for all default languages plus obj-c++ and go. Any comments? Uros.