The Linux ABI requires that you set control register 6 before calling a variadic function with a float parameter. Similarly, it recommends that you clear it before calling a variadic function without one. A simple example is: #include <stdio.h> int main(void) { printf("%f\n", 1.2); return 0; } which will print "0.0" on PPC Linux. In the assembly, right before "bl printf", add "creqv 6,6,6" and it will work properly. This fix will require changes to the PPCISelLowering.cpp:LowerCALL function.
This works now, presumably through the many Linux/PPC patches by Nicolas Geoffray.