blob: 5f2274ef09eac27dacd37faa77b81f0dc810d074 [file] [log] [blame]
/* PR c/102989 */
/* { dg-do run { target bitint } } */
/* { dg-options "-std=c23 -pedantic-errors" } */
/* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */
/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */
#if __BITINT_MAXWIDTH__ >= 128
__attribute__((noipa)) void
foo (unsigned _BitInt(125) a, unsigned _BitInt(127) b, unsigned _BitInt(125) *p, unsigned _BitInt(127) *q, float c)
{
p[0] = b;
q[0] = a;
q[1] = (signed _BitInt(125)) a;
q[2] = (_BitInt(73)) a;
q[3] = c;
q[4] += a;
q[5] = a + b;
q[6] = a - b;
q[7] = a * b;
q[8] = a / b;
q[9] = a % b;
q[10] = b << (26105549790521884176764218952781428833uwb - a);
q[11] = (a * 131uwb) >> (26105549790521884176764218952781428833uwb - a);
q[12]++;
++q[13];
q[14]--;
--q[15];
q[16] = a == b;
q[17] = a != b;
q[18] = a > b;
q[19] = a < b;
q[20] = a >= b;
q[21] = a <= b;
q[22] = a && b;
q[23] = a || b;
q[24] = !a;
q[25] = a & b;
q[26] = a | b;
q[27] = a ^ b;
q[28] = ~a;
q[29] -= a;
q[30] *= b;
q[31] /= b;
q[32] %= a;
q[33] <<= (12589712345465422uwb - b);
q[34] >>= (12589712345465417uwb - b);
q[35] &= a;
q[36] |= b;
q[37] ^= a;
q[38] = sizeof (a);
q[39] = q[39] ? a : b;
q[40] = 26105549790654675897348954738956342847uwb;
switch (a)
{
case 26105549790521884176764218952781428772uwb:
if (b != 1244154958745894754wb)
__builtin_abort ();
break;
case 11821400154985748973289734545487uwb:
if (b != 133445145984759847584574uwb)
__builtin_abort ();
break;
case 12145uwb:
if (b != 12121243985745894732uwb)
__builtin_abort ();
break;
case 26105549790521884176764218952781428771uwb:
if (b != 12589712345465342uwb)
__builtin_abort ();
break;
case 71284121548547895457123873874452345uwb:
if (b != 150123439857459847uwb)
__builtin_abort ();
break;
default:
__builtin_abort ();
}
}
int
main ()
{
unsigned _BitInt(125) p;
unsigned _BitInt(127) q[41];
static unsigned _BitInt(127) qe[41] = {
26105549790521884176764218952781428771uwb, 153711437385873807975529696739694508067uwb,
2816339038065666848803uwb, 97uwb,
26105549790521884178598517527767103757uwb, 26105549790521884176776808665126894113uwb,
26105549790521884176751629240435963429uwb, 49552990805035300718174502183957321146uwb,
2073562054015060870989uwb, 8076837748665533uwb,
58059800399605194176279512422023168uwb, 3687014528101034113uwb,
7439587439856743895438uwb, 95435435436uwb,
112349587439856746858975446545uwb, 13145398574895748967847348972322uwb,
0, 1, 1, 0, 1, 0, 1, 1, 0,
3439290896351266uwb, 26105549790521884176773369374230542847uwb,
26105549790521884176769930083334191581uwb, 16429746074595423756157606976189597660uwb,
144035633670022787123399980532060335632uwb, 63332113050644322882197117954233460326uwb,
27442uwb, 3245984754897548957498574895745uwb,
14236875428959659760604435112230125568uwb, 326775104184uwb,
1170981383577634uwb, 2843243404090270511102uwb,
26313477358277918295486482038303331024uwb, 1, 26105549790521884176764218952781428771uwb,
26105549790654675897348954738956342847uwb
};
q[4] = 1834298574985674986uwb;
q[12] = 7439587439856743895437uwb;
q[13] = 95435435435uwb;
q[14] = 112349587439856746858975446546uwb;
q[15] = 13145398574895748967847348972323uwb;
q[29] = 75439568476895768957658675uwb;
q[30] = 455984375894754983574895745485uwb;
q[31] = 345495847589475847548uwb;
q[32] = 3245984754897548957498574895745uwb;
q[33] = 32594875648957489754854664897464uwb;
q[34] = 12345214395483754897548574857485748uwb;
q[35] = 1523143544545454uwb;
q[36] = 2843243245456456576876uwb;
q[37] = 542359486759867589675986576895765235uwb;
q[39] = 5498657685976587653uwb;
foo (26105549790521884176764218952781428771UWB, 12589712345465342uwb, &p, q, 97.0f);
if (p != 12589712345465342uwb)
__builtin_abort ();
q[38] -= sizeof (p) - 1;
for (int i = 0; i < 41; ++i)
if (q[i] != qe[i])
__builtin_abort ();
return 0;
}
#else
int
main ()
{
return 0;
}
#endif