312 lines · plain
1! REQUIRES: flang-supports-f128-math2! RUN: %python %S/test_folding.py %s %flang_fc13! Test numeric model inquiry intrinsics4 5module m6 7 integer, parameter :: &8 bs1 = bit_size(0_1), &9 bs2 = bit_size(0_2), &10 bs4 = bit_size(0_4), &11 bs8 = bit_size(0_8), &12 bs16 = bit_size(0_16)13 logical, parameter :: test_bit_size_1 = bs1 == 814 logical, parameter :: test_bit_size_2 = bs2 == 1615 logical, parameter :: test_bit_size_4 = bs4 == 3216 logical, parameter :: test_bit_size_8 = bs8 == 6417 logical, parameter :: test_bit_size_16 = bs16 == 12818 19 real(2), parameter :: &20 eps2 = epsilon(0._2), zeps2 = real(z'1400', kind=2), deps2 = 9.765625e-4_221 real(3), parameter :: &22 eps3 = epsilon(0._3), zeps3 = real(z'3c00', kind=3), deps3 = 7.8135e-3_323 real(4), parameter :: &24 eps4 = epsilon(0._4), zeps4 = real(z'34000000', kind=4), &25 deps4 = 1.1920928955078125e-07_426 real(8), parameter :: &27 eps8 = epsilon(0._8), zeps8 = real(z'3cb0000000000000', kind=8), &28 deps8 = 2.2204460492503130808472633361816406250e-16_829#if __x86_64__30 real(10), parameter :: &31 eps10 = epsilon(0._10), zeps10 = real(z'3fc08000000000000000', kind=10), &32 deps10 = 1.08420217248550443400745280086994171142578125e-19_1033#endif34 real(16), parameter :: &35 eps16 = epsilon(0._16), &36 zeps16 = real(z'3f8f0000000000000000000000000000', kind=16), &37 deps16 = 1.9259299443872358530559779425849273185381016482153881952399387955665588378906250e-34_1638 logical, parameter :: test_eps2 = eps2 == zeps2 .and. eps2 == deps239 logical, parameter :: test_eps3 = eps3 == zeps3 .and. eps3 == deps340 logical, parameter :: test_eps4 = eps4 == zeps4 .and. eps4 == deps441 logical, parameter :: test_eps8 = eps8 == zeps8 .and. eps8 == deps842#if __x86_64__43 logical, parameter :: test_eps10 = eps10 == zeps10 .and. eps10 == deps1044#endif45 logical, parameter :: test_eps16 = eps16 == zeps16 .and. eps16 == deps1646 47 integer(1), parameter :: &48 ihuge1 = huge(0_1), zihuge1 = int(z'7f', kind=1), dihuge1 = 127_149 integer(2), parameter :: &50 ihuge2 = huge(0_2), zihuge2 = int(z'7fff', kind=2), dihuge2 = 32767_251 integer(4), parameter :: &52 ihuge4 = huge(0_4), zihuge4 = int(z'7fffffff', kind=4), &53 dihuge4 = 2147483647_454 integer(8), parameter :: &55 ihuge8 = huge(0_8), zihuge8 = int(z'7fffffffffffffff', kind=8), &56 dihuge8 = 9223372036854775807_857 integer(16), parameter :: &58 ihuge16 = huge(0_16), &59 zihuge16 = int(z'7fffffffffffffffffffffffffffffff', kind=16), &60 dihuge16 = 170141183460469231731687303715884105727_1661 logical, parameter :: test_ihuge1 = ihuge1 == zihuge1 .and. ihuge1 == dihuge162 logical, parameter :: test_ihuge2 = ihuge2 == zihuge2 .and. ihuge2 == dihuge263 logical, parameter :: test_ihuge4 = ihuge4 == zihuge4 .and. ihuge4 == dihuge464 logical, parameter :: test_ihuge8 = ihuge8 == zihuge8 .and. ihuge8 == dihuge865 logical, parameter :: test_ihuge16 = ihuge16 == zihuge16 .and. ihuge16 == dihuge1666 67 real(2), parameter :: &68 ahuge2 = huge(0._2), zahuge2 = real(z'7bff', kind=2), dahuge2 = 6.5504e4_269 real(3), parameter :: &70 ahuge3 = huge(0._3), zahuge3 = real(z'7f7f', kind=3), &71 dahuge3 = 3.3895313892515354759047080037148786688e38_372 real(4), parameter :: &73 ahuge4 = huge(0._4), zahuge4 = real(z'7f7fffff', kind=4), &74 dahuge4 = 3.4028234663852885981170418348451692544e38_475 real(8), parameter :: &76 ahuge8 = huge(0._8), zahuge8 = real(z'7fefffffffffffff', kind=8), &77 dahuge8 = 1.7976931348623157081452742373170435679807056752584499659891747680315726078002853876058955863276687817&78 &1540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868&79 &5084551339423045832369032229481658085593321233482747978262041447231687381771809192998812504040261841&80 &24858368e308_881#if __x86_64__82 real(10), parameter :: &83 ahuge10 = huge(0._10), zahuge10 = real(z'7ffeffffffffffffffff', kind=10), &84 dahuge10 = 1.1897314953572317650212638530309702051690633222946242004403237338917370055229707226164102903365288828&85 &5354569780749557731442744315367028843419812557385374367867359320070697326320191591828296152436552951&86 &0646791086614311790632169778838896134786560600399148753433211454911160088679845154866512852340149773&87 &0376000091254793939662231513836224178385427439178381387178058894875405751682263476592355769748051137&88 &2564902088485522249479139937758502601177354918009979622602685950855888360815984690023564513234659447&89 &6384939859276456284579661772930407806609229102715046085388087959327781622986827547830768080040150694&90 &9423034117289577771003357140105597752421240573470073862516601108283791196230084692772009651535002084&91 &7447079244384854591288672300061908512647211195136146752763351956292759795725027800298079590419313960&92 &3021470997035276467445530922022679656280991498232083329641241038509239184734786121921697210543484287&93 &0483534081130425730022164213489173471742348007148807510020643905172342476560047217680964861079949434&94 &1570347632064355862420744350442438056613601760883747816538902780957697597728686007148702828795556714&95 &1404632615832623602762896316173978484254486860609948270867968048078702511858930838546584223040908805&96 &9962945945862019037660484467909260022254105307759010657606713472001258464069570302571389609837579989&97 &2695455305236856075868317922311363951946885088077187210470520395758748001314313144425494391994017575&98 &3169339392366881856189129931729104252921236835159922322050998001677102784035360140829296398115122877&99 &7681357060457893435354516965395612540488464471697868932116710872290880827783505182288576460622187397&100 &0285165508372099234948333443522898475123275372663606621390228126470623407535207172405866507951821730&101 &3463782631353393706774901950197841690441824738063162828586857741432581165364040218402724913393320949&102 &2194984224427304270198730445366203502623869578046820036014472919971230955300572061418669748528468561&103 &8651483271597448120312194675168637934309618961510733006555242148519520176285859509105183947250286387&104 &1632494167613804996319791441870254302706758495192008837915169401581740046711477877201459644461175204&105 &0594535047647218079757611117208462736392796003396704700376133745095531841500737964126050479232516613&106 &5484129188421134082301547330475406707281876350361733290800595189632520707167390454777712968226520622&107 &5651439919376804400292380903112437912614776255964694221981375146967079446870358004392507659451618379&108 &8118593920495440361149153107822510726914869798092409467721427270124043771874092167566136349389004512&109 &3235166814608932240069799317601780533819184998193300841098599393876029260139091141452600372028487213&110 &2411955424282101831204216104467404621635336900583664606591156298764745525068145003932941404131495400&111 &6776029510059622530228230036314738246810596484424413248645731374375950964161680480241293518762046681&112 &3563687753281467553879887177183651289394719533506188500326760735438867336800207438784965701457609034&113 &9857571243045102038730494854256702479339322809110526041538528994849203991091946129912491633289917998&114 &0943803378795220931314669461497059396641523759492858909604899161219449899863848370224866722491489246&115 &7841020618336462741696957630763248023558797524525373703543388296086275342774001633343405508353704850&116 &7374544819754722228975281083020898682633020285259923084168054539687911418297629988964576482765287504&117 &5628549242651652177507995162596692291149777889623566709566271384820181913483216879958636526376209782&118 &8507009933729439678463987902491451422274252700636394232799848397673998715441855420156224415492665301&119 &4515504685489258620276085761837129763358761215382565129633538141663949516556000264159186554850057052&120 &6114319529199188079545223946496276356301785808966922264062353828985358675959906470083856871238103295&121 &9192649484625076899225841930548076362021508902214922052806984201835084058693849381549890944546197789&122 &3029113576516775406232278298314033473276603952231603422824717528181818844304880921321933550869873395&123 &8612760736708666523755556758031714901084773200964243187800700087973460329062789435537435644488519071&124 &9161645514115576193939969076741515640282654366402676009508752394550734155613586793306603174472092444&125 &6513532366647649735400851967040771103640538150073486891798364049570606189535005089840913826869535090&126 &0667833244725787121966044152849248400418509328119089636341757398971665960007594878006191640948543387&127 &5852065711654107226099628815012314437794400874930194474433078438899570184271000480830501217712356062&128 &2895076269042856800047718893158089358515593863176652948089031267747029662545110861548958395087796755&129 &4641379448959605279752098748138397625785921057562844017593493241621483395653501891968113890918437957&130 &3470326940634289008780584694035245347939808067427323629788710086717580253156130235606487870925986528&131 &8416350972529537091114317204887747405539054009425375424119317944175137064689643861517718849867010341&132 &5325423859110896247108853858086888377772586485641459342621210866475884892600317623459607695088491496&133 &6244415660441955208681198977024e4932_10134#endif135 real(16), parameter :: &136 ahuge16 = huge(0._16), zahuge16 = real(z'7ffeffffffffffffffffffffffffffff', kind=16), &137 dahuge16 = 1.1897314953572317650857593266280070161964690526416940455296988842121635797553123923249740128484620735&138 &2590203356474912685975526543357380446267269875194526149085346195872502126284586579940540449357468156&139 &6096686172574953791792292256220777095858112702436475442537092608935138247345677279593806773692330094&140 &6157461197257841728898925219399207576542048645656733564522472781522888677006389355954564966995114417&141 &5290960687851325094831139688610052683309212868397475219226638679188087369434307734815556410166997113&142 &8512786874753496996549221727686770196551512812712488289469952298031867469924683981576664562667786719&143 &0614996396303416570983054252372208766646300878087672561828032202122199248523759030495209113959109189&144 &2120527349676858811903011159301878936803923201167140417584510885470696521560577711351625740481881769&145 &5075025715299705916714352103671782759119316034498392169720631800164034124698918142227577300459309880&146 &4547151796062998955075830758511951858579711731676769660579988993526318854177162953020146688023840758&147 &4603622660648014297759540713505037980864913015716402406031178690879637251033587351277479527574859541&148 &7572920936651398752709055215663939505589207804914540432978557623565645991208599669097180808881920063&149 &7227714312184890119222096790535459636284173260024397328029395243137866685140273814343210366365711716&150 &7042358647275956123197079396783927914728272019537706060212263845788320480934171752680963925353944773&151 &0280863675704796054050525162959099932535265586464682793821550087166946662209865086040990507131145474&152 &2674110428395423227629949387596131127438371928396826762575553883728144908453957471281620658715882191&153 &0888724011665136196205080002917629993882608241754751673226993047313326125892184551681523545535431045&154 &8114528303607394526100730578774092094736822286015459361126642549541799645333882549670764145955017051&155 &3308000612538651401801532119293614565003435147928902055320217600618822326157365533772949809740595905&156 &2018796145979938674151302850593441045360348019238334932111517181105100410859283099181138255290906487&157 &3029533418691087118107895004426881765865961841419267486232005929789956207494587649901662172318722999&158 &4845123258260870315619363836897406865052797752967893316136838227985970406516005241290251498948731531&159 &9694209505667084746692764481259650670012944357951247923062137397808873125708979962290218382410541293&160 &0483065603459863120371744282301377070153823878609951218937542956964157950988060608985782910656238116&161 &1422035741047574518281708048752574462041283485138290827317223641893804935883389476643706232798207558&162 &3164620541748839306283820178954721954319445090211369992596537690819279215212221282457887933650687528&163 &8617303469517112245451315447164280392523574962804175375927948971096983905242318797695347043690474223&164 &8132665056397611644388442665313646268512196339944341540985621273959361844218214442734315345078601616&165 &1428702272098406156966033337278824103713153807737748015267058325792053556997331818811268567331899796&166 &7497786786001251403873023920127717626858627038170562807276699687356274072773403132694104831615879354&167 &3958115858251128378415632227616233344591881315378823557324830300859768903829697344762145934281912127&168 &1714133304757786755221851743106484876037319629031012446614508707837714052853304868420427879959665251&169 &4009368964527494988719996088230065668196236298805733689960371306226158464997243490564472254071897564&170 &1441285398399860960455632647712855850663041779957201017448443871583297673755604162078008788300720724&171 &1390865785566723954636935777578134428819598917631335685641784543423281488674422674670706697975557712&172 &1788798468777700116472954103621810567107869855646414713502627836321256957407217461738363552424248762&173 &4364780853518109957492932381740813319050481446127009055414257022203025376114948242287653245779337785&174 &1981877869734028258091278067497905893806255685600107605770598216668682475603756961576049761981948205&175 &2758118532729333127733603742149847001463931981340719681330844408263017545241644293372483217234561694&176 &2639378557592944486629790954192274518015884259778696940266014279196551684158959230431151917518727133&177 &4609575263460825447598815416225495259785319903964588374219923638761039583094807436598839770784963225&178 &2080920941206268114832425403540515474312327876180802357701527842702008781378306569508588571830140611&179 &0980426830095308627974030153554643774062498539644810004022317716657008936075218040845236685686491032&180 &5886266629337247244143556352059546170104239050079561583450594483732665254246744436486149918427509748&181 &5253621979537504128523848241127715641240965261646703516395599407360083455079665191393229410544185167&182 &9990997876554244625589008743884056491694537267393122602348155432978423086460721901479480729284567258&183 &3503954612118213364077776992584180757905173583882311275962271406750966991364528828189455892561297242&184 &5252452248453502562347348900936766966136332741088135837550717443838484760651019872222926016920811114&185 &6169371432077434885046020127763642567468723152059526010722289706864609324352227544963417635351891055&186 &48847634608972381760403137363968e4932_16187 logical, parameter :: test_ahuge2 = ahuge2 == zahuge2 .and. ahuge2 == dahuge2188 logical, parameter :: test_ahuge3 = ahuge3 == zahuge3 .and. ahuge3 == dahuge3189 logical, parameter :: test_ahuge4 = ahuge4 == zahuge4 .and. ahuge4 == dahuge4190 logical, parameter :: test_ahuge8 = ahuge8 == zahuge8 .and. ahuge8 == dahuge8191#if __x86_64__192 logical, parameter :: test_ahuge10 = ahuge10 == zahuge10 .and. ahuge10 == dahuge10193#endif194 logical, parameter :: test_ahuge16 = ahuge16 == zahuge16 .and. ahuge16 == dahuge16195 196 real(2), parameter :: tiny2 = tiny(0._2), ztiny2 = real(z'0400', kind=2)197 real(3), parameter :: tiny3 = tiny(0._3), ztiny3 = real(z'0080', kind=3)198 real(4), parameter :: tiny4 = tiny(0._4), ztiny4 = real(z'00800000', kind=4)199 real(8), parameter :: tiny8 = tiny(0._8), ztiny8 = real(z'0010000000000000', kind=8)200#if __x86_64__201 real(10), parameter :: tiny10 = tiny(0._10), ztiny10 = real(z'00018000000000000000', kind=10)202#endif203 real(16), parameter :: tiny16 = tiny(0._16), ztiny16 = real(z'00010000000000000000000000000000', kind=16)204 logical, parameter :: test_tiny2 = tiny2 == ztiny2205 logical, parameter :: test_tiny3 = tiny3 == ztiny3206 logical, parameter :: test_tiny4 = tiny4 == ztiny4207 logical, parameter :: test_tiny8 = tiny8 == ztiny8208#if __x86_64__209 logical, parameter :: test_tiny10 = tiny10 == ztiny10210#endif211 logical, parameter :: test_tiny16 = tiny16 == ztiny16212 213 real, parameter :: nan = real(z'7fc12345')214 integer, parameter :: nanInt = int(z'7fc12345')215 real, parameter :: inf = real(z'7f800000')216 logical, parameter :: test_exponent_0 = exponent(0.0) == 0217 logical, parameter :: test_fraction_0 = fraction(0.) == 0.218 logical, parameter :: test_exponent_r8 = exponent(0.125) == -2219 logical, parameter :: test_fraction_r8 = fraction(0.125) == 0.5220 logical, parameter :: test_exponent_r4 = exponent(0.25) == -1221 logical, parameter :: test_fraction_mr4 = fraction(-0.25) == -0.5222 logical, parameter :: test_exponent_r2 = exponent(0.5) == 0223 logical, parameter :: test_fraction_r2 = fraction(0.5) == 0.5224 logical, parameter :: test_exponent_1 = exponent(1.0) == 1225 logical, parameter :: test_fraction_1 = fraction(1.) == 0.5226 logical, parameter :: test_exponent_4 = exponent(4.1) == 3227 logical, parameter :: test_fraction_m4 = fraction(-4.5) == -0.5625228 logical, parameter :: test_exponent_12 = exponent(12.9) == 4229 real, parameter :: fraction_inf = fraction(inf)230 logical, parameter :: test_fraction_inf = fraction_inf /= fraction_inf ! must be NaN231 logical, parameter :: test_fraction_nan = transfer(fraction(nan),0) == nanInt232 233 integer, parameter :: &234 max2 = maxexponent(0._2), &235 max3 = maxexponent(0._3), &236 max4 = maxexponent(0._4), &237 max8 = maxexponent(0._8), &238 max16 = maxexponent(0._16)239#if __x86_64__240 integer, parameter :: max10 = maxexponent(0._10)241#endif242 logical, parameter :: test_max2 = max2 == 16243 logical, parameter :: test_max3 = max3 == 128244 logical, parameter :: test_max4 = max4 == 128245 logical, parameter :: test_max8 = max8 == 1024246#if __x86_64__247 logical, parameter :: test_max10 = max10 == 16384248#endif249 logical, parameter :: test_max16 = max16 == 16384250 251 integer, parameter :: &252 min2 = minexponent(0._2), &253 min3 = minexponent(0._3), &254 min4 = minexponent(0._4), &255 min8 = minexponent(0._8), &256 min16 = minexponent(0._16)257#if __x86_64__258 integer, parameter :: min10 = minexponent(0._10)259#endif260 logical, parameter :: test_min2 = min2 == -13261 logical, parameter :: test_min3 = min3 == -125262 logical, parameter :: test_min4 = min4 == -125263 logical, parameter :: test_min8 = min8 == -1021264#if __x86_64__265 logical, parameter :: test_min10 = min10 == -16381266#endif267 logical, parameter :: test_min16 = min16 == -16381268 269 integer, parameter :: &270 irange1 = range(0_1), &271 irange2 = range(0_2), &272 irange4 = range(0_4), &273 irange8 = range(0_8), &274 irange16 = range(0_16)275 logical, parameter :: test_irange1 = irange1 == 2276 logical, parameter :: test_irange2 = irange2 == 4277 logical, parameter :: test_irange4 = irange4 == 9278 logical, parameter :: test_irange8 = irange8 == 18279 logical, parameter :: test_irange16 = irange16 == 38280 281 integer, parameter :: &282 arange2 = range(0._2), zrange2 = range((0._2,0._2)), &283 arange3 = range(0._3), zrange3 = range((0._3, 0._3)), &284 arange4 = range(0._4), zrange4 = range((0._4, 0._4)), &285 arange8 = range(0._8), zrange8 = range((0._8, 0._8)), &286 arange16 = range(0._16), zrange16 = range((0._16, 0._16))287#if __x86_64__288 integer, parameter :: arange10 = &289 range(0._10), zrange10 = range((0._10, 0._10))290#endif291 logical, parameter :: test_arange2 = arange2 == 4 .and. zrange2 == 4292 logical, parameter :: test_arange3 = arange3 == 37 .and. zrange3 == 37293 logical, parameter :: test_zrange4 = arange4 == 37 .and. zrange4 == 37294 logical, parameter :: test_zrange8 = arange8 == 307 .and. zrange8 == 307295#if __x86_64__296 logical, parameter :: test_zrange10 = arange10 == 4931 .and. zrange10 == 4931297#endif298 logical, parameter :: test_zrange16 = arange16 == 4931 .and. zrange16 == 4931299 300 logical, parameter :: test_set_exponent_z = set_exponent(0., 999) == 0.301 logical, parameter :: test_set_exponent_nan = transfer(set_exponent(nan, 0), 0) == nanInt302 real, parameter :: set_expo_inf = set_exponent(inf, 0)303 integer, parameter :: set_expo_inf_int = transfer(set_expo_inf, 0)304 logical, parameter :: test_set_exponent_inf = shiftr(set_expo_inf_int, 23) == 255 .and. &305 shiftl(set_expo_inf_int, 9) /= 0 ! NaN306 logical, parameter :: test_set_exponent_0 = set_exponent(1., 0) == 0.5307 logical, parameter :: test_set_exponent_1 = set_exponent(1., 1) == 1.308 logical, parameter :: test_set_exponent_2 = set_exponent(1., 2) == 2.309 logical, parameter :: test_set_exponent_min = set_exponent(1., -149) == 1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45_4310 311end module312