(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
pr109109-2.c
       1  /* PR target/109109 */
       2  /* { dg-do run { target lp64 } } */
       3  /* { dg-options "-O2" } */
       4  
       5  unsigned long arr[64];
       6  
       7  __attribute__((noipa)) unsigned __int128
       8  f1 (unsigned long di, unsigned long si, unsigned long dx)
       9  {
      10    unsigned long ax;
      11    asm ("" : "=a" (ax) : "0" (di));
      12    return (((unsigned __int128) arr[ax]) << 64) | ax;
      13  }
      14  
      15  __attribute__((noipa)) unsigned __int128
      16  f2 (unsigned long di, unsigned long si, unsigned long dx)
      17  {
      18    unsigned long ax;
      19    asm ("" : "=a" (ax) : "0" (di));
      20    return (((unsigned __int128) arr[dx]) << 64) | ax;
      21  }
      22  
      23  __attribute__((noipa)) unsigned __int128
      24  f3 (unsigned long di, unsigned long si, unsigned long dx)
      25  {
      26    unsigned long ax;
      27    asm ("" : "=a" (ax) : "0" (di));
      28    return (((unsigned __int128) ((unsigned long *) (((char *) arr) + ax))[dx]) << 64) | ax;
      29  }
      30  
      31  __attribute__((noipa)) unsigned __int128
      32  f4 (unsigned long di, unsigned long si, unsigned long dx)
      33  {
      34    unsigned long ax;
      35    asm ("" : "=a" (ax) : "0" (di));
      36    return (((unsigned __int128) arr[ax]) << 64) | dx;
      37  }
      38  
      39  __attribute__((noipa)) unsigned __int128
      40  f5 (unsigned long di, unsigned long si, unsigned long dx)
      41  {
      42    unsigned long ax;
      43    asm ("" : "=a" (ax) : "0" (di));
      44    return (((unsigned __int128) arr[dx]) << 64) | dx;
      45  }
      46  
      47  __attribute__((noipa)) unsigned __int128
      48  f6 (unsigned long di, unsigned long si, unsigned long dx)
      49  {
      50    unsigned long ax;
      51    asm ("" : "=a" (ax) : "0" (di));
      52    return (((unsigned __int128) ((unsigned long *) (((char *) arr) + ax))[dx]) << 64) | dx;
      53  }
      54  
      55  __attribute__((noipa)) unsigned __int128
      56  f7 (unsigned long di, unsigned long si, unsigned long dx, unsigned long cx)
      57  {
      58    unsigned long ax;
      59    asm ("" : "=a" (ax) : "0" (di));
      60    return (((unsigned __int128) arr[ax]) << 64) | cx;
      61  }
      62  
      63  __attribute__((noipa)) unsigned __int128
      64  f8 (unsigned long di, unsigned long si, unsigned long dx, unsigned long cx)
      65  {
      66    unsigned long ax;
      67    asm ("" : "=a" (ax) : "0" (di));
      68    return (((unsigned __int128) arr[dx]) << 64) | cx;
      69  }
      70  
      71  __attribute__((noipa)) unsigned __int128
      72  f9 (unsigned long di, unsigned long si, unsigned long dx, unsigned long cx)
      73  {
      74    unsigned long ax;
      75    asm ("" : "=a" (ax) : "0" (di));
      76    return (((unsigned __int128) ((unsigned long *) (((char *) arr) + ax))[dx]) << 64) | cx;
      77  }
      78  
      79  __attribute__((noipa)) unsigned __int128
      80  f10 (unsigned long di, unsigned long si, unsigned long dx)
      81  {
      82    unsigned long ax;
      83    asm ("" : "=a" (ax) : "0" (di));
      84    return (((unsigned __int128) ax) << 64) | arr[ax];
      85  }
      86  
      87  __attribute__((noipa)) unsigned __int128
      88  f11 (unsigned long di, unsigned long si, unsigned long dx)
      89  {
      90    unsigned long ax;
      91    asm ("" : "=a" (ax) : "0" (di));
      92    return (((unsigned __int128) ax) << 64) | arr[dx];
      93  }
      94  
      95  __attribute__((noipa)) unsigned __int128
      96  f12 (unsigned long di, unsigned long si, unsigned long dx)
      97  {
      98    unsigned long ax;
      99    asm ("" : "=a" (ax) : "0" (di));
     100    return (((unsigned __int128) ax) << 64) | ((unsigned long *) (((char *) arr) + ax))[dx];
     101  }
     102  
     103  __attribute__((noipa)) unsigned __int128
     104  f13 (unsigned long di, unsigned long si, unsigned long dx)
     105  {
     106    unsigned long ax;
     107    asm ("" : "=a" (ax) : "0" (di));
     108    return (((unsigned __int128) dx) << 64) | arr[ax];
     109  }
     110  
     111  __attribute__((noipa)) unsigned __int128
     112  f14 (unsigned long di, unsigned long si, unsigned long dx)
     113  {
     114    unsigned long ax;
     115    asm ("" : "=a" (ax) : "0" (di));
     116    return (((unsigned __int128) dx) << 64) | arr[dx];
     117  }
     118  
     119  __attribute__((noipa)) unsigned __int128
     120  f15 (unsigned long di, unsigned long si, unsigned long dx)
     121  {
     122    unsigned long ax;
     123    asm ("" : "=a" (ax) : "0" (di));
     124    return (((unsigned __int128) dx) << 64) | ((unsigned long *) (((char *) arr) + ax))[dx];
     125  }
     126  
     127  __attribute__((noipa)) unsigned __int128
     128  f16 (unsigned long di, unsigned long si, unsigned long dx, unsigned long cx)
     129  {
     130    unsigned long ax;
     131    asm ("" : "=a" (ax) : "0" (di));
     132    return (((unsigned __int128) cx) << 64) | arr[ax];
     133  }
     134  
     135  __attribute__((noipa)) unsigned __int128
     136  f17 (unsigned long di, unsigned long si, unsigned long dx, unsigned long cx)
     137  {
     138    unsigned long ax;
     139    asm ("" : "=a" (ax) : "0" (di));
     140    return (((unsigned __int128) cx) << 64) | arr[dx];
     141  }
     142  
     143  __attribute__((noipa)) unsigned __int128
     144  f18 (unsigned long di, unsigned long si, unsigned long dx, unsigned long cx)
     145  {
     146    unsigned long ax;
     147    asm ("" : "=a" (ax) : "0" (di));
     148    return (((unsigned __int128) cx) << 64) | ((unsigned long *) (((char *) arr) + ax))[dx];
     149  }
     150  
     151  int
     152  main ()
     153  {
     154    for (int i = 0; i < 64; i++)
     155      arr[i] = 64 + i;
     156  #define CHECK_EQ(x, y1, y2) do { unsigned __int128 y = y1; y <<= 64; y += y2; if (x != y) __builtin_abort (); } while (0)
     157    CHECK_EQ (f1 (8, 0, 9), 0x48, 0x8);
     158    CHECK_EQ (f2 (8, 0, 9), 0x49, 0x8);
     159    CHECK_EQ (f3 (8, 0, 9), 0x4a, 0x8);
     160    CHECK_EQ (f4 (8, 0, 9), 0x48, 0x9);
     161    CHECK_EQ (f5 (8, 0, 9), 0x49, 0x9);
     162    CHECK_EQ (f6 (8, 0, 9), 0x4a, 0x9);
     163    CHECK_EQ (f7 (8, 0, 9, 10), 0x48, 0xa);
     164    CHECK_EQ (f8 (8, 0, 9, 10), 0x49, 0xa);
     165    CHECK_EQ (f9 (8, 0, 9, 10), 0x4a, 0xa);
     166    CHECK_EQ (f10 (8, 0, 9), 0x8, 0x48);
     167    CHECK_EQ (f11 (8, 0, 9), 0x8, 0x49);
     168    CHECK_EQ (f12 (8, 0, 9), 0x8, 0x4a);
     169    CHECK_EQ (f13 (8, 0, 9), 0x9, 0x48);
     170    CHECK_EQ (f14 (8, 0, 9), 0x9, 0x49);
     171    CHECK_EQ (f15 (8, 0, 9), 0x9, 0x4a);
     172    CHECK_EQ (f16 (8, 0, 9, 10), 0xa, 0x48);
     173    CHECK_EQ (f17 (8, 0, 9, 10), 0xa, 0x49);
     174    CHECK_EQ (f18 (8, 0, 9, 10), 0xa, 0x4a);
     175  }