tgross35 wrote: It seems like arguments aren't actually getting passed indirectly to libcalls. Simple test program
```c #include <stdint.h> #include <stdio.h> union ty128 { struct { uint64_t hi, lo; } u64x2; __float128 f128; }; void f128_add(__float128 a, __float128 b) { union ty128 cvt; cvt.f128 = a * b; printf("0x%016llx%016llx\n", cvt.u64x2.lo, cvt.u64x2.hi); } int main() { __float128 fa, fb; fa = 122134.345678901234; fb = 78.9012345678901234; f128_add(fa, fb); } ``` Checking right before the call to `__multf3`. Built with GCC `rcx` points to a return slot on the stack, `rdx` and `r8` point to the two float values (0x400f... and 0x4005...): ```text (gdb) x/2gx $rcx 0x7ffffcb30: 0x00000007ffffcbf0 0x00000007ffffcc85 (gdb) x/2gx $rdx 0x7ffffcb20: 0xb000000000000000 0x400fdd16587e6997 (gdb) x/2gx $r8 0x7ffffcb10: 0x8000000000000000 0x40053b9add3c0c73 ``` Built using this patch, it looks like Clang is putting the float arguments in `$rcx` and `$rdx` and not leaving a return slot pointer: ```text (gdb) x/2gx $rcx 0x5ffe70: 0xb000000000000000 0x400fdd16587e6997 (gdb) x/2gx $rdx 0x5ffe60: 0x8000000000000000 0x40053b9add3c0c73 (gdb) x/2gx $r8 0x622720: 0x0000000000622988 0x00000000006229a7 ``` Is libcall ABI handled elsewhere? https://github.com/llvm/llvm-project/pull/115052 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits