blob: 98dd2f4c7735a4120e350a5e0990a7f745e77721 [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" } { "" } } */
int expected;
__attribute__((noipa)) void
test (int x, int y, int z)
{
(void) x;
(void) y;
if (z != expected)
__builtin_abort ();
}
#if __BITINT_MAXWIDTH__ >= 135
__attribute__((noipa)) void
test_135 (_BitInt(135) a)
{
switch (a)
{
case -33841133710wb:
test (1, 2, 1); break;
case -55283508608004252890371630137wb:
test (2, 3, 2); break;
case -1065119162618253595246332535wb:
test (3, 4, 3); break;
case 265225687803630460135wb:
test (4, 5, 4); break;
case 12802219454007328327057691wb:
test (5, 6, 5); break;
case -59157301wb:
test (6, 7, 6); break;
case 28029296819738wb:
test (7, 8, 7); break;
case 23771967952817687922824184198772908114wb:
test (8, 9, 8); break;
case -528wb:
test (10, 9, 9); break;
case -21743705968wb:
test (11, 8, 10); break;
case 3761322442803929370621734404255158wb:
test (12, 7, 11); break;
case 7581882536870984828946588790215963wb:
test (13, 6, 12); break;
case -3601335158354600803149652143011wb:
test (14, 5, 13); break;
case 104802210847691888333394846958wb:
test (15, 4, 14); break;
case 145823237253137988087297wb:
test (16, 3, 15); break;
case 3871725619091wb:
test (17, 2, 16); break;
case -480987385702wb:
test (18, 1, 17); break;
case -1084968414543030wb:
test (19, 0, 18); break;
case -12928976wb:
test (20, -1, 19); break;
case -268774wb:
test (21, -2, 20); break;
case 532464351235328336949014678wb:
test (22, -3, 21); break;
case -1145290618187237284790705482290160wb:
test (23, -4, 22); break;
case -249459466889744wb:
test (24, -5, 23); break;
case -1403065236wb:
test (25, 1, 24); break;
case -25456270573862478377606wb:
test (26, 2, 25); break;
case 33340794611915791wb:
test (27, 3, 26); break;
case -674079586163272813wb:
test (28, 4, 27); break;
case -41952758959718119236303556590897001668wb:
test (29, 5, 28); break;
case 2947453415wb:
test (30, 6, 29); break;
case -677wb:
test (31, 7, 30); break;
case -463646803422851872253575745194919wb:
test (32, 8, 31); break;
case -71367919591514155952975401251963194wb:
test (33, 7, 32); break;
case -14346961913818709867962386609601wb:
test (34, 6, 33); break;
case 690wb:
test (35, 5, 34); break;
default:
test (36, 4, 35); break;
break;
}
}
#endif
#if __BITINT_MAXWIDTH__ >= 192
__attribute__((noipa)) int
test_192 (unsigned _BitInt(192) a)
{
switch (a)
{
case 1505160143063006983093195408894239764415303566721254616896uwb + 48:
case 1505160143063006983093195408894239764415303566721254616896uwb + 49:
case 1505160143063006983093195408894239764415303566721254616896uwb + 50:
case 1505160143063006983093195408894239764415303566721254616896uwb + 51:
case 1505160143063006983093195408894239764415303566721254616896uwb + 52:
case 1505160143063006983093195408894239764415303566721254616896uwb + 53:
case 1505160143063006983093195408894239764415303566721254616896uwb + 54:
case 1505160143063006983093195408894239764415303566721254616896uwb + 55:
case 1505160143063006983093195408894239764415303566721254616896uwb + 56:
case 1505160143063006983093195408894239764415303566721254616896uwb + 57:
case 1505160143063006983093195408894239764415303566721254616896uwb + 65:
case 1505160143063006983093195408894239764415303566721254616896uwb + 66:
case 1505160143063006983093195408894239764415303566721254616896uwb + 67:
case 1505160143063006983093195408894239764415303566721254616896uwb + 68:
case 1505160143063006983093195408894239764415303566721254616896uwb + 69:
case 1505160143063006983093195408894239764415303566721254616896uwb + 70:
return 1;
default:
return 0;
}
}
#endif
#if __BITINT_MAXWIDTH__ >= 574
__attribute__((noipa)) void
test_574 (unsigned _BitInt(574) a)
{
switch (a)
{
case 6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891246uwb:
test (22, -3, 1); break;
case 6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891247uwb:
test (23, -4, 2); break;
case 6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891248uwb:
test (24, -5, 3); break;
case 6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891249uwb:
test (25, 1, 4); break;
case 6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891250uwb:
test (26, 2, 5); break;
case 6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891251uwb:
test (27, 3, 6); break;
case 6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891257uwb:
test (28, 4, 7); break;
default:
test (29, 5, 8); break;
break;
}
}
#endif
#if __BITINT_MAXWIDTH__ >= 575
__attribute__((noipa)) void
test_575 (_BitInt(575) a)
{
switch (a)
{
case 57158236877324191282832099954551676419657688516114213070568173374483038461911230482096734270573673572006270803057167488583704wb:
test (1, 2, 1); break;
case 55932752002978259755258693759201176077252755664748wb:
test (2, 3, 2); break;
case -4218363291370143377367234486177453689054229233132334373089588356145503900632432151470684730299990106009156255994430506676467506300235609892554834254413957477779209219867825wb:
test (3, 4, 3); break;
case -19380856704203460544565443028wb:
test (4, 5, 4); break;
case 37691457600250454282496246135038751153145234859661859831059667050412054918743986000946778819692986258358820458161034213280wb:
test (5, 6, 5); break;
case 827003152758795459486819489974390601625339063627401335603123746581523657253393870961575744071183196915560771288079061574485309986042624106685495948664669wb:
test (6, 7, 6); break;
case 2001882657256786505981789524889669355393757203160978wb:
test (7, 8, 7); break;
case 2273951349206310803215316642428483249009583047771549wb:
test (8, 9, 8); break;
case -63640037492105525397657594648433413082358686497544854829581174487203243151113011293858381773246wb:
test (10, 9, 9); break;
case -5043989193130150016980754467018673356423436330428309162407512361831163237wb:
test (11, 8, 10); break;
case -86904413785414524864201428752820860524832869110219388825241400306401wb:
test (12, 7, 11); break;
case -7159581406wb:
test (13, 6, 12); break;
case -430416863734662045942802859497964wb:
test (14, 5, 13); break;
case -282099469984391093781566wb:
test (15, 4, 14); break;
case 259191242782270578340350840252447902477249511321245827805053349778984004438373803812874430619356951005300429wb:
test (16, 3, 15); break;
case -17427431700557396203431wb:
test (17, 2, 16); break;
case -324305733281944621534wb:
test (18, 1, 17); break;
case 39167932287702074309519944575154814029176054304655900600154735991016090154633448789399330wb:
test (19, 0, 18); break;
case 198828227576458371467364915441164050473274232622009526563856039032wb:
test (20, -1, 19); break;
case 7522018863556878842079508104211164618555wb:
test (21, -2, 20); break;
case -6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891246wb:
test (22, -3, 21); break;
case -6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891247wb:
test (23, -4, 22); break;
case -6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891248wb:
test (24, -5, 23); break;
case -6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891249wb:
test (25, 1, 24); break;
case -6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891250wb:
test (26, 2, 25); break;
case -6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891251wb:
test (27, 3, 26); break;
case 25232715496072790939146860623749108256506615788345509143038026592127702780903347954226870163752427434085269890371577229233150314692259399042327414965711510629wb:
test (28, 4, 27); break;
case 21376200838998904075479297127185224975235208544658573531790808467114261325514834503383673531634166234wb:
test (29, 5, 28); break;
case -12950763061001084589012736558965423479147155000678492177259830314151681149963956790935448632739537613359984550457633150573373wb:
test (30, 6, 29); break;
case -2588834879960231787797472372536501710262304078735816335394876043103825991870347510560085648304946wb:
test (31, 7, 30); break;
case -2701643349985817058465875459099740236751728453427684wb:
test (32, 8, 31); break;
case 5836201004021438163265930908885473220627459728279406489088525555799694670629946003808237930825748wb:
test (33, 7, 32); break;
case 44108809764408326456612205445124618284924483635588993217673301668963284129265963564132943970751645671455967029559660507196902756491684232894669648136319146730wb:
test (34, 6, 33); break;
case 2296104972770686523043774188826290903188890257660332269411533641473619626906874515994186550107564291006924533677263136416982312042wb:
test (35, 5, 34); break;
case 2194074380385385359486226752708738wb:
test (36, 4, 35); break;
case 538995045833371297308662695915673724930785814100527903453604wb:
test (37, 3, 36); break;
case 2085626377217975761550063150555904902911153438008474368944585344266562733501648381wb:
test (38, 2, 37); break;
case -33688835949886075020354777490957071wb:
test (39, 1, 38); break;
case 1391419408329070356813886663340861253838000363084420822349730519562112746630131027735880100996653wb:
test (40, 0, 39); break;
default:
test (41, -1, 40); break;
break;
}
}
#endif
int
main ()
{
#if __BITINT_MAXWIDTH__ >= 135
static _BitInt(135) a_135[] = {
-33841133710wb,
-55283508608004252890371630137wb,
-1065119162618253595246332535wb,
265225687803630460135wb,
12802219454007328327057691wb,
-59157301wb,
28029296819738wb,
23771967952817687922824184198772908114wb,
-528wb,
-21743705968wb,
3761322442803929370621734404255158wb,
7581882536870984828946588790215963wb,
-3601335158354600803149652143011wb,
104802210847691888333394846958wb,
145823237253137988087297wb,
3871725619091wb,
-480987385702wb,
-1084968414543030wb,
-12928976wb,
-268774wb,
532464351235328336949014678wb,
-1145290618187237284790705482290160wb,
-249459466889744wb,
-1403065236wb,
-25456270573862478377606wb,
33340794611915791wb,
-674079586163272813wb,
-41952758959718119236303556590897001668wb,
2947453415wb,
-677wb,
-463646803422851872253575745194919wb,
-71367919591514155952975401251963194wb,
-14346961913818709867962386609601wb,
690wb
};
for (int i = 0; i < 34; ++i)
{
expected = i + 1;
test_135 (a_135[i]);
expected = 35;
test_135 (a_135[i] - 1);
test_135 (a_135[i] + 1);
}
#endif
#if __BITINT_MAXWIDTH__ >= 192
if (test_192 (0uwb)
|| test_192 (1505160143063006983093195408894239764415303566721254616896uwb)
|| test_192 (1505160143063006983093195408894239764415303566721254616896uwb + 47)
|| test_192 (1505160143063006983093195408894239764415303566721254616896uwb + 71)
|| test_192 (-1uwb))
__builtin_abort ();
for (int i = 48; i <= 70; ++i)
if (test_192 (1505160143063006983093195408894239764415303566721254616896uwb + i) != (i < 58 || i > 64))
__builtin_abort ();
#endif
#if __BITINT_MAXWIDTH__ >= 574
expected = 8;
test_574 (0uwb);
test_574 (6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891246uwb - 0x10000000000000000uwb);
test_574 (6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891245uwb);
test_574 (6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891258uwb);
test_574 (6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891246uwb + 0x10000000000000000uwb);
test_574 (6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891258uwb + 0x10000000000000000uwb);
for (int i = 0; i <= 11; ++i)
{
expected = i == 11 ? 7 : i > 5 ? 8 : i + 1;
test_574 (6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891246uwb + i);
}
#endif
#if __BITINT_MAXWIDTH__ >= 575
static _BitInt(575) a_575[] = {
57158236877324191282832099954551676419657688516114213070568173374483038461911230482096734270573673572006270803057167488583704wb,
55932752002978259755258693759201176077252755664748wb,
-4218363291370143377367234486177453689054229233132334373089588356145503900632432151470684730299990106009156255994430506676467506300235609892554834254413957477779209219867825wb,
-19380856704203460544565443028wb,
37691457600250454282496246135038751153145234859661859831059667050412054918743986000946778819692986258358820458161034213280wb,
827003152758795459486819489974390601625339063627401335603123746581523657253393870961575744071183196915560771288079061574485309986042624106685495948664669wb,
2001882657256786505981789524889669355393757203160978wb,
2273951349206310803215316642428483249009583047771549wb,
-63640037492105525397657594648433413082358686497544854829581174487203243151113011293858381773246wb,
-5043989193130150016980754467018673356423436330428309162407512361831163237wb,
-86904413785414524864201428752820860524832869110219388825241400306401wb,
-7159581406wb,
-430416863734662045942802859497964wb,
-282099469984391093781566wb,
259191242782270578340350840252447902477249511321245827805053349778984004438373803812874430619356951005300429wb,
-17427431700557396203431wb,
-324305733281944621534wb,
39167932287702074309519944575154814029176054304655900600154735991016090154633448789399330wb,
198828227576458371467364915441164050473274232622009526563856039032wb,
7522018863556878842079508104211164618555wb,
-6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891246wb,
-6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891247wb,
-6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891248wb,
-6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891249wb,
-6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891250wb,
-6286965391667017312339071741838237504698922691411382973783611300502970166307629280084891251wb,
25232715496072790939146860623749108256506615788345509143038026592127702780903347954226870163752427434085269890371577229233150314692259399042327414965711510629wb,
21376200838998904075479297127185224975235208544658573531790808467114261325514834503383673531634166234wb,
-12950763061001084589012736558965423479147155000678492177259830314151681149963956790935448632739537613359984550457633150573373wb,
-2588834879960231787797472372536501710262304078735816335394876043103825991870347510560085648304946wb,
-2701643349985817058465875459099740236751728453427684wb,
5836201004021438163265930908885473220627459728279406489088525555799694670629946003808237930825748wb,
44108809764408326456612205445124618284924483635588993217673301668963284129265963564132943970751645671455967029559660507196902756491684232894669648136319146730wb,
2296104972770686523043774188826290903188890257660332269411533641473619626906874515994186550107564291006924533677263136416982312042wb,
2194074380385385359486226752708738wb,
538995045833371297308662695915673724930785814100527903453604wb,
2085626377217975761550063150555904902911153438008474368944585344266562733501648381wb,
-33688835949886075020354777490957071wb,
1391419408329070356813886663340861253838000363084420822349730519562112746630131027735880100996653wb
};
for (int i = 0; i < 39; ++i)
{
expected = i + 1;
test_575 (a_575[i]);
expected = 40;
if (i < 20 || i >= 25)
test_575 (a_575[i] - 1);
if (i <= 20 || i > 25)
test_575 (a_575[i] + 1);
}
#endif
}