<div dir="ltr">Hi,<div><br></div><div>  I have been developing a modula3 ir to llvm ir which is going pretty well. During testing</div><div>of one of the extended float types I am getting wrong results. Consider this code snippet</div><div><div><br></div><div><div>entry:</div><div>  %x = alloca fp128, align 16</div><div>  %y = alloca fp128, align 16</div><div>  %z = alloca fp128, align 16</div><div>  %l = alloca double, align 16</div><div>  store fp128 0xL00000000000000004001800000000000, fp128* %y, align 16</div><div>  store fp128 0xL00000000000000004000000000000000, fp128* %x, align 16</div><div>  store fp128 0xL00000000000000004001000000000000, fp128* %z, align 16</div><div>  %v.29 = load fp128* %z, align 16</div><div>  %v.27 = load fp128* %x, align 16</div><div>  %fadd = fadd fp128 %v.29, %v.27</div><div>  store fp128 %fadd, fp128* %y, align 16</div><div>  %v.28 = load fp128* %y, align 16</div><div>  %ftrunc = fptrunc fp128 %v.28 to double</div><div>  store double %ftrunc, double* %l, align 8</div></div></div><div><br></div><div>which is y = x + z  x is 2.0  and z 4.0 </div><div><br></div><div>on x86-64 compiling with llc the code generated is </div><div><br></div><div><div><span class="" style="white-space:pre">     </span>subq<span class="" style="white-space:pre">      </span>$72, %rsp</div><div>.Ltmp22:</div><div><span class="" style="white-space:pre">   </span>.cfi_def_cfa_offset 80</div><div><span class="" style="white-space:pre">     </span>movabsq<span class="" style="white-space:pre">   </span>$4612108230892453888, %rax # imm = 0x4001800000000000</div><div><span class="" style="white-space:pre">      </span>movq<span class="" style="white-space:pre">      </span>%rax, 40(%rsp)</div><div><span class="" style="white-space:pre">     </span>movq<span class="" style="white-space:pre">      </span>$0, 32(%rsp)</div><div><span class="" style="white-space:pre">       </span>movabsq<span class="" style="white-space:pre">   </span>$4611686018427387904, %rax # imm = 0x4000000000000000</div><div><span class="" style="white-space:pre">      </span>movq<span class="" style="white-space:pre">      </span>%rax, 56(%rsp)</div><div><span class="" style="white-space:pre">     </span>movq<span class="" style="white-space:pre">      </span>$0, 48(%rsp)</div><div><span class="" style="white-space:pre">       </span>movabsq<span class="" style="white-space:pre">   </span>$4611967493404098560, %rcx # imm = 0x4001000000000000</div><div><span class="" style="white-space:pre">      </span>movq<span class="" style="white-space:pre">      </span>%rcx, 24(%rsp)</div><div><span class="" style="white-space:pre">     </span>movq<span class="" style="white-space:pre">      </span>$0, 16(%rsp)</div><div><span class="" style="white-space:pre">       </span>movq<span class="" style="white-space:pre">      </span>48(%rsp), %rdi</div><div><span class="" style="white-space:pre">     </span>movq<span class="" style="white-space:pre">      </span>56(%rsp), %rsi</div><div><span class="" style="white-space:pre">     </span>xorl<span class="" style="white-space:pre">      </span>%edx, %edx</div><div><span class="" style="white-space:pre"> </span>callq<span class="" style="white-space:pre">     </span>__addtf3</div><div><span class="" style="white-space:pre">   </span>movq<span class="" style="white-space:pre">      </span>%rdx, 40(%rsp)</div><div><span class="" style="white-space:pre">     </span>movq<span class="" style="white-space:pre">      </span>%rax, 32(%rsp)</div><div><span class="" style="white-space:pre">     </span>movq<span class="" style="white-space:pre">      </span>%rax, %rdi</div><div><span class="" style="white-space:pre"> </span>movq<span class="" style="white-space:pre">      </span>%rdx, %rsi</div><div><span class="" style="white-space:pre"> </span>callq<span class="" style="white-space:pre">     </span>__trunctfdf2</div><div><span class="" style="white-space:pre">       </span>movsd<span class="" style="white-space:pre">     </span>%xmm0, 8(%rsp)</div><div><span class="" style="white-space:pre">     </span>movl<span class="" style="white-space:pre">      </span>$M_Const+232, %edi</div></div><div><br></div><div>Examining the stack after the return from __addtf3 y seems to be 0xfffffffffff (roughly)<br></div><div><br></div><div>This is linking in the gcc lib versions of __addtf3 and __trunctfdf2 which</div><div>do the software emulation of 128bit add and trunc to double.</div><div>I'm no expert in assembly but it looks like __addtf3 is not being passed enough</div><div>data. A similar piece of C code using __float128 types seems to pass its parameters in</div><div>a couple of xmm registers.</div><div><br></div><div>Should I be linking in the compiler_rt lib ? I would have thought these low</div><div>level float functions would be compatible with gcc libraries. Maybe there is</div><div>a flag for llc that I should be using.</div><div><br></div><div>I'm using llvm 3.5.</div><div><br></div><div>Regards Peter</div><div><br></div></div>