<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/91840>91840</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            `multf3` has incorrect rounding on `aarch64` linux
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          tgross35
      </td>
    </tr>
</table>

<pre>
    Testing with the following program:

```
#define __STDC_WANT_IEC_60559_TYPES_EXT__

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

#if defined(__clang__) && (defined(__i386) || defined(__x86_64))
#define _Float128 __float128
#endif

typedef struct {
    uint64_t lower, upper;
} u128;


void f128_print(_Float128 val) {
    u128 ival = *((u128 *)(&val));

    #ifndef __clang__
    char buf[1024];
    strfromf128(buf, sizeof(buf), "%.32g", val);
 printf("%#018" PRIx64 "%016" PRIx64 " %s\n", ival.upper, ival.lower, buf);
    #else
    printf("%#018" PRIx64 "%016" PRIx64 " %lf\n", ival.upper, ival.lower, (double)val);
 #endif
}

_Float128 new_f128(uint64_t upper, uint64_t lower) {
 u128 val;
    val.lower = lower;
    val.upper = upper;
    return *((_Float128 *)(&val));
}

int main() {
    _Float128 a = new_f128(0x00007fffffffffff, 0xffffffffffffffff);
    _Float128 b = new_f128(0x40007fffffffffff, 0xffffffffffffffff);
    f128_print(a);
 f128_print(b);
    _Float128 c = a * b;
    f128_print(c);

 return 0;
}
```

Using the builtin version of Clang that links against system libraries gets the multf3 symbol from either `/usr/lib/gcc/aarch64-linux-gnu/11/libgcc.a` or `/usr/lib/llvm-14/lib/clang/14.0.0/lib/linux/libclang_rt.builtins-aarch64.a`. This is the output, which is correct:

```sh
$ clang f128_demo.c -o f128_demo
$ ./f128_demo
0x00007fffffffffffffffffffffffffff 0.000000
0x40007fffffffffffffffffffffffffff 3.000000
0x00017ffffffffffffffffffffffffffc 0.000000
```

However, building with the current `multf3.c` produces an incorrect value (note the ending `b`):

```sh
$ clang f128_demo.c llvm-project/compiler-rt/lib/builtins/multf3.c -o f128_demo_current_rt
$ ./f128_demo_current_rt
0x00007fffffffffffffffffffffffffff 0.000000
0x40007fffffffffffffffffffffffffff 3.000000
0x00017ffffffffffffffffffffffffffb 0.000000
```

This was just tested in a ubuntu docker container which has clang 14.0.0 and gcc 11.4.0
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVkuP2zgS_jX0pdACRT1sH3xI7DY2l0Ww6cXunASKoiQmNGnw0e6eXz8gJUu2unsmyFxGEASxXvyq6lNR1FrRKc53qPiMisOKetdrs3Od0dZmxarWzevuiVsnVAcX4XpwPYdWS6kvQXQ2ujP0hLJPCB8Qvj5LPN7DkmQNb4XiUFXfng776n-f_v1UfXncVyUuim319NvXx2_V4_-fquouCsmEYtI3HFC2t64ROulR9viBVor6Q7VQzr2eub01mMxaGNA1iGyqikmquqpCZAuIlIiUgMjm1kBkmzJq13u03t_5vmzKqswR2YZ7mfpRaupSsoGqasfXyYarRrS3uALahrdgnfHMAVp_HuQAAF4oV-aVA6kv3CCyB38-c4Oy0QatD-BD9Elw83zWooE2JZvqbIRyAfYE7JnKIbHbzYJCPFMJKDsAIp8Q2SCyieK42kZBOfiG-37XECMWWYV05vJOStZTA7VvUfE5xSRHxWGKENTWmdboU0CMyCbYkT1Y8TvX7XW9DSJECCJFkpEuvu3HZOZYMd02gg2WiGQ4De_w9T9fXsp8DIDT8l4GiBQWFXs1hg2lSIZ6X1dTG0Y0t_BDb6Xls-BvwJDtT-IIhNW-lhyR7bIMC7KtD7fNmqmg-KUaaz7RbdptScBbyvgrkW6rMKGLJBq8lvoYPerv2Rz0hjtv1My-GedfUPA-PaEcnKhQ0XzB8zkkjSBuCoBfMMZ43c5XKAJ-aRfXsvdzyPptyPyXQt59uPROe6eqP8bCIhYaKgf1x8HZO5_y2Ab8Tn0XAz8-_2vDCRHOi9oL6YSCZ26s0Ap0C_swB8D11IEU6ocF2lGhrAP7ah0_gRS1oUZwCx13NkY5eenaDOzrqdYSwlQALlwfWFNiRI7eGkSOUtSIHDvGEDlSalhf5g9SKP_y0CmPyDFNB6OOsYSiEoN-z1_K59NDmk_rOLaCd57gBM9mIfCwGgabccmYrH0Yd4-7JPDUCwtiyER7d_YutPzSC9YHMdPGcOY-Okhtfz0rcog7Dd1q-EknDB70vJztEkSOC_FbKi8vwAmO19VhSdQ3DtnCAWOc_okDW-zwLnX-pS_8-TpUhWzu_j6YN4YrF7o2UCJhoY9noxvPuAWqQKixnmG0eB4motKOR_cw_lQXvOvY9-2v1Twy5Gz099A1cmT6dBaSmwfjJnZcmYDI8Qr0rlXVmEll3Adde2PxD2hg_TMNjGy_UAvfvXXguHW8AaGAgq-9ch4azX5wA0wrR4XiZvwSemrHWg9fGlDVQMcYpGmSJ3jV7LJmm23piu_SdVrkuEiL9arfsfWG1hnftLxpCMuyPCeYlHXWFJyRNW9XYkcwCeYpLkhRrJNsXZdbsm1ok27bnJUox_xEhUxCYxNtupWw1vPdNt3keCVpzaWNf8mEKH6BqAxncXFYmV0kQ-07i3IshXV2juKEk3w3cTUwNSQ5M9RoPzBSq0DKcWoEuzhdVt7IXe_c2QaekmMYbsL1vk6YPo2T6jqwZjpGeIF4Ef4fAQAA__-7g3Q4">