https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122871

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Even the initialize expansion for __int128 on aarch64 is bad.
testcase:
```
#if __SIZEOF_INT128__ != 16
typedef long long large_t;
#else
typedef __int128 large_t;
#endif
large_t ashll_fn (large_t a)
{
  large_t c;

  c = a << (sizeof(large_t)*8/2+1);
  c += a;
  return c;
}
```

```
(insn 6 3 7 2 (set (reg:DI 108)
        (high:DI (symbol_ref/u:DI ("*.LC0") [flags 0x82])))
"/app/example.cpp":11:5 -1
     (nil))
(insn 7 6 8 2 (set (reg/f:DI 107)
        (lo_sum:DI (reg:DI 108)
            (symbol_ref/u:DI ("*.LC0") [flags 0x82]))) "/app/example.cpp":11:5
-1
     (expr_list:REG_EQUAL (symbol_ref/u:DI ("*.LC0") [flags 0x82])
        (nil)))
(insn 8 7 9 2 (set (reg:TI 106)
        (mem/u/c:TI (reg/f:DI 107) [0  S16 A128])) "/app/example.cpp":11:5 -1
     (expr_list:REG_EQUAL (const_wide_int 0x20000000000000001)
        (nil)))
(insn 9 8 10 2 (set (reg:DI 109)
        (mult:DI (subreg:DI (reg/v:TI 104 [ a ]) 0)
            (subreg:DI (reg:TI 106) 0))) "/app/example.cpp":11:5 -1
     (nil))
(insn 10 9 11 2 (set (reg:DI 110)
        (truncate:DI (lshiftrt:TI (mult:TI (zero_extend:TI (subreg:DI (reg/v:TI
104 [ a ]) 0))
                    (zero_extend:TI (subreg:DI (reg:TI 106) 0)))
                (const_int 64 [0x40])))) "/app/example.cpp":11:5 -1
     (nil))
(insn 11 10 12 2 (set (reg:DI 110)
        (plus:DI (mult:DI (subreg:DI (reg/v:TI 104 [ a ]) 8)
                (subreg:DI (reg:TI 106) 0))
            (reg:DI 110))) "/app/example.cpp":11:5 -1
     (nil))
(insn 12 11 13 2 (set (reg:DI 110)
        (plus:DI (mult:DI (subreg:DI (reg/v:TI 104 [ a ]) 0)
                (subreg:DI (reg:TI 106) 8))
            (reg:DI 110))) "/app/example.cpp":11:5 -1
     (nil))
```

Reply via email to