1  /* { dg-do compile { target int128 } } */
       2  /* { dg-options "-Og -march=cascadelake" } */
       3  typedef unsigned char u8;
       4  typedef unsigned short u16;
       5  typedef unsigned long long u64;
       6  
       7  u8 g;
       8  
       9  void
      10  foo (__int128 i, u8 *r)
      11  {
      12    u16 a = __builtin_sub_overflow_p (0, i * g, 0);
      13    i ^= g & i;
      14    u64 s = (i >> 64) + i;
      15    *r = ((union { u16 a; u8 b[2]; }) a).b[1] + s;
      16  }
      17  
      18  int
      19  bar (void)
      20  {
      21    u8 x;
      22    foo (5, &x);
      23    if (x != 5)
      24      __builtin_abort ();
      25    return 0;
      26  }
      27  /* { dg-final { scan-assembler-not "andn\[ \\t\]+%rdi, %r11, %rdi" } } */