| /* 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 |
| } |