1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393 |
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/Makefile.arch uClibc-0.9.31/libc/sysdeps/linux/sparc/Makefile.arch
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/Makefile.arch 2010-10-14 14:03:46.000000000 +0200
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/Makefile.arch 2010-10-14 14:36:34.000000000 +0200
- @@ -5,8 +5,15 @@
- # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- #
-
- -CSRC := brk.c __syscall_error.c qp_ops.c sigaction.c
- +CSRC := brk.c __syscall_error.c sigaction.c
-
- SSRC := \
- __longjmp.S fork.S vfork.S clone.S setjmp.S bsd-setjmp.S bsd-_setjmp.S \
- syscall.S urem.S udiv.S umul.S sdiv.S rem.S pipe.S
- +
- +CSRC += $(foreach f, \
- + q_div.c q_fle.c q_mul.c q_qtoll.c q_stoq.c \
- + mp_clz_tab.c q_dtoq.c q_flt.c q_neg.c q_qtos.c q_sub.c \
- + q_add.c q_feq.c q_fne.c q_qtod.c q_qtou.c q_ulltoq.c \
- + q_cmp.c q_fge.c q_itoq.c q_qtoull.c q_util.c \
- + q_cmpe.c q_fgt.c q_lltoq.c q_qtoi.c q_sqrt.c q_utoq.c, soft-fp/$(f))
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/double.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/double.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/double.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/double.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,264 @@
- +/* Software floating-point emulation.
- + Definitions for IEEE Double Precision
- + Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com),
- + Jakub Jelinek (jj@ultra.linux.cz),
- + David S. Miller (davem@redhat.com) and
- + Peter Maydell (pmaydell@chiark.greenend.org.uk).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + In addition to the permissions in the GNU Lesser General Public
- + License, the Free Software Foundation gives you unlimited
- + permission to link the compiled version of this file into
- + combinations with other programs, and to distribute those
- + combinations without any restriction coming from the use of this
- + file. (The Lesser General Public License restrictions do apply in
- + other respects; for example, they cover modification of the file,
- + and distribution when not linked into a combine executable.)
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
- + MA 02110-1301, USA. */
- +
- +#if _FP_W_TYPE_SIZE < 32
- +#error "Here's a nickel kid. Go buy yourself a real computer."
- +#endif
- +
- +#if _FP_W_TYPE_SIZE < 64
- +#define _FP_FRACTBITS_D (2 * _FP_W_TYPE_SIZE)
- +#else
- +#define _FP_FRACTBITS_D _FP_W_TYPE_SIZE
- +#endif
- +
- +#define _FP_FRACBITS_D 53
- +#define _FP_FRACXBITS_D (_FP_FRACTBITS_D - _FP_FRACBITS_D)
- +#define _FP_WFRACBITS_D (_FP_WORKBITS + _FP_FRACBITS_D)
- +#define _FP_WFRACXBITS_D (_FP_FRACTBITS_D - _FP_WFRACBITS_D)
- +#define _FP_EXPBITS_D 11
- +#define _FP_EXPBIAS_D 1023
- +#define _FP_EXPMAX_D 2047
- +
- +#define _FP_QNANBIT_D \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)
- +#define _FP_QNANBIT_SH_D \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
- +#define _FP_IMPLBIT_D \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)
- +#define _FP_IMPLBIT_SH_D \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
- +#define _FP_OVERFLOW_D \
- + ((_FP_W_TYPE)1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
- +
- +typedef float DFtype __attribute__((mode(DF)));
- +
- +#if _FP_W_TYPE_SIZE < 64
- +
- +union _FP_UNION_D
- +{
- + DFtype flt;
- + struct {
- +#if __BYTE_ORDER == __BIG_ENDIAN
- + unsigned sign : 1;
- + unsigned exp : _FP_EXPBITS_D;
- + unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
- + unsigned frac0 : _FP_W_TYPE_SIZE;
- +#else
- + unsigned frac0 : _FP_W_TYPE_SIZE;
- + unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
- + unsigned exp : _FP_EXPBITS_D;
- + unsigned sign : 1;
- +#endif
- + } bits __attribute__((packed));
- +};
- +
- +#define FP_DECL_D(X) _FP_DECL(2,X)
- +#define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_2(D,X,val)
- +#define FP_UNPACK_RAW_DP(X,val) _FP_UNPACK_RAW_2_P(D,X,val)
- +#define FP_PACK_RAW_D(val,X) _FP_PACK_RAW_2(D,val,X)
- +#define FP_PACK_RAW_DP(val,X) \
- + do { \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_2_P(D,val,X); \
- + } while (0)
- +
- +#define FP_UNPACK_D(X,val) \
- + do { \
- + _FP_UNPACK_RAW_2(D,X,val); \
- + _FP_UNPACK_CANONICAL(D,2,X); \
- + } while (0)
- +
- +#define FP_UNPACK_DP(X,val) \
- + do { \
- + _FP_UNPACK_RAW_2_P(D,X,val); \
- + _FP_UNPACK_CANONICAL(D,2,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_D(X,val) \
- + do { \
- + _FP_UNPACK_RAW_2(D,X,val); \
- + _FP_UNPACK_SEMIRAW(D,2,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_DP(X,val) \
- + do { \
- + _FP_UNPACK_RAW_2_P(D,X,val); \
- + _FP_UNPACK_SEMIRAW(D,2,X); \
- + } while (0)
- +
- +#define FP_PACK_D(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(D,2,X); \
- + _FP_PACK_RAW_2(D,val,X); \
- + } while (0)
- +
- +#define FP_PACK_DP(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(D,2,X); \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_2_P(D,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_D(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(D,2,X); \
- + _FP_PACK_RAW_2(D,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_DP(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(D,2,X); \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_2_P(D,val,X); \
- + } while (0)
- +
- +#define FP_ISSIGNAN_D(X) _FP_ISSIGNAN(D,2,X)
- +#define FP_NEG_D(R,X) _FP_NEG(D,2,R,X)
- +#define FP_ADD_D(R,X,Y) _FP_ADD(D,2,R,X,Y)
- +#define FP_SUB_D(R,X,Y) _FP_SUB(D,2,R,X,Y)
- +#define FP_MUL_D(R,X,Y) _FP_MUL(D,2,R,X,Y)
- +#define FP_DIV_D(R,X,Y) _FP_DIV(D,2,R,X,Y)
- +#define FP_SQRT_D(R,X) _FP_SQRT(D,2,R,X)
- +#define _FP_SQRT_MEAT_D(R,S,T,X,Q) _FP_SQRT_MEAT_2(R,S,T,X,Q)
- +
- +#define FP_CMP_D(r,X,Y,un) _FP_CMP(D,2,r,X,Y,un)
- +#define FP_CMP_EQ_D(r,X,Y) _FP_CMP_EQ(D,2,r,X,Y)
- +#define FP_CMP_UNORD_D(r,X,Y) _FP_CMP_UNORD(D,2,r,X,Y)
- +
- +#define FP_TO_INT_D(r,X,rsz,rsg) _FP_TO_INT(D,2,r,X,rsz,rsg)
- +#define FP_FROM_INT_D(X,r,rs,rt) _FP_FROM_INT(D,2,X,r,rs,rt)
- +
- +#define _FP_FRAC_HIGH_D(X) _FP_FRAC_HIGH_2(X)
- +#define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_2(X)
- +
- +#else
- +
- +union _FP_UNION_D
- +{
- + DFtype flt;
- + struct {
- +#if __BYTE_ORDER == __BIG_ENDIAN
- + unsigned sign : 1;
- + unsigned exp : _FP_EXPBITS_D;
- + _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
- +#else
- + _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
- + unsigned exp : _FP_EXPBITS_D;
- + unsigned sign : 1;
- +#endif
- + } bits __attribute__((packed));
- +};
- +
- +#define FP_DECL_D(X) _FP_DECL(1,X)
- +#define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_1(D,X,val)
- +#define FP_UNPACK_RAW_DP(X,val) _FP_UNPACK_RAW_1_P(D,X,val)
- +#define FP_PACK_RAW_D(val,X) _FP_PACK_RAW_1(D,val,X)
- +#define FP_PACK_RAW_DP(val,X) \
- + do { \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_1_P(D,val,X); \
- + } while (0)
- +
- +#define FP_UNPACK_D(X,val) \
- + do { \
- + _FP_UNPACK_RAW_1(D,X,val); \
- + _FP_UNPACK_CANONICAL(D,1,X); \
- + } while (0)
- +
- +#define FP_UNPACK_DP(X,val) \
- + do { \
- + _FP_UNPACK_RAW_1_P(D,X,val); \
- + _FP_UNPACK_CANONICAL(D,1,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_D(X,val) \
- + do { \
- + _FP_UNPACK_RAW_2(1,X,val); \
- + _FP_UNPACK_SEMIRAW(D,1,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_DP(X,val) \
- + do { \
- + _FP_UNPACK_RAW_2_P(1,X,val); \
- + _FP_UNPACK_SEMIRAW(D,1,X); \
- + } while (0)
- +
- +#define FP_PACK_D(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(D,1,X); \
- + _FP_PACK_RAW_1(D,val,X); \
- + } while (0)
- +
- +#define FP_PACK_DP(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(D,1,X); \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_1_P(D,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_D(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(D,1,X); \
- + _FP_PACK_RAW_1(D,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_DP(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(D,1,X); \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_1_P(D,val,X); \
- + } while (0)
- +
- +#define FP_ISSIGNAN_D(X) _FP_ISSIGNAN(D,1,X)
- +#define FP_NEG_D(R,X) _FP_NEG(D,1,R,X)
- +#define FP_ADD_D(R,X,Y) _FP_ADD(D,1,R,X,Y)
- +#define FP_SUB_D(R,X,Y) _FP_SUB(D,1,R,X,Y)
- +#define FP_MUL_D(R,X,Y) _FP_MUL(D,1,R,X,Y)
- +#define FP_DIV_D(R,X,Y) _FP_DIV(D,1,R,X,Y)
- +#define FP_SQRT_D(R,X) _FP_SQRT(D,1,R,X)
- +#define _FP_SQRT_MEAT_D(R,S,T,X,Q) _FP_SQRT_MEAT_1(R,S,T,X,Q)
- +
- +/* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by
- + the target machine. */
- +
- +#define FP_CMP_D(r,X,Y,un) _FP_CMP(D,1,r,X,Y,un)
- +#define FP_CMP_EQ_D(r,X,Y) _FP_CMP_EQ(D,1,r,X,Y)
- +#define FP_CMP_UNORD_D(r,X,Y) _FP_CMP_UNORD(D,1,r,X,Y)
- +
- +#define FP_TO_INT_D(r,X,rsz,rsg) _FP_TO_INT(D,1,r,X,rsz,rsg)
- +#define FP_FROM_INT_D(X,r,rs,rt) _FP_FROM_INT(D,1,X,r,rs,rt)
- +
- +#define _FP_FRAC_HIGH_D(X) _FP_FRAC_HIGH_1(X)
- +#define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_1(X)
- +
- +#endif /* W_TYPE_SIZE < 64 */
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/extended.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/extended.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/extended.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/extended.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,431 @@
- +/* Software floating-point emulation.
- + Definitions for IEEE Extended Precision.
- + Copyright (C) 1999,2006,2007 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + In addition to the permissions in the GNU Lesser General Public
- + License, the Free Software Foundation gives you unlimited
- + permission to link the compiled version of this file into
- + combinations with other programs, and to distribute those
- + combinations without any restriction coming from the use of this
- + file. (The Lesser General Public License restrictions do apply in
- + other respects; for example, they cover modification of the file,
- + and distribution when not linked into a combine executable.)
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
- + MA 02110-1301, USA. */
- +
- +#if _FP_W_TYPE_SIZE < 32
- +#error "Here's a nickel, kid. Go buy yourself a real computer."
- +#endif
- +
- +#if _FP_W_TYPE_SIZE < 64
- +#define _FP_FRACTBITS_E (4*_FP_W_TYPE_SIZE)
- +#else
- +#define _FP_FRACTBITS_E (2*_FP_W_TYPE_SIZE)
- +#endif
- +
- +#define _FP_FRACBITS_E 64
- +#define _FP_FRACXBITS_E (_FP_FRACTBITS_E - _FP_FRACBITS_E)
- +#define _FP_WFRACBITS_E (_FP_WORKBITS + _FP_FRACBITS_E)
- +#define _FP_WFRACXBITS_E (_FP_FRACTBITS_E - _FP_WFRACBITS_E)
- +#define _FP_EXPBITS_E 15
- +#define _FP_EXPBIAS_E 16383
- +#define _FP_EXPMAX_E 32767
- +
- +#define _FP_QNANBIT_E \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2) % _FP_W_TYPE_SIZE)
- +#define _FP_QNANBIT_SH_E \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
- +#define _FP_IMPLBIT_E \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1) % _FP_W_TYPE_SIZE)
- +#define _FP_IMPLBIT_SH_E \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
- +#define _FP_OVERFLOW_E \
- + ((_FP_W_TYPE)1 << (_FP_WFRACBITS_E % _FP_W_TYPE_SIZE))
- +
- +typedef float XFtype __attribute__((mode(XF)));
- +
- +#if _FP_W_TYPE_SIZE < 64
- +
- +union _FP_UNION_E
- +{
- + XFtype flt;
- + struct
- + {
- +#if __BYTE_ORDER == __BIG_ENDIAN
- + unsigned long pad1 : _FP_W_TYPE_SIZE;
- + unsigned long pad2 : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
- + unsigned long sign : 1;
- + unsigned long exp : _FP_EXPBITS_E;
- + unsigned long frac1 : _FP_W_TYPE_SIZE;
- + unsigned long frac0 : _FP_W_TYPE_SIZE;
- +#else
- + unsigned long frac0 : _FP_W_TYPE_SIZE;
- + unsigned long frac1 : _FP_W_TYPE_SIZE;
- + unsigned exp : _FP_EXPBITS_E;
- + unsigned sign : 1;
- +#endif /* not bigendian */
- + } bits __attribute__((packed));
- +};
- +
- +
- +#define FP_DECL_E(X) _FP_DECL(4,X)
- +
- +#define FP_UNPACK_RAW_E(X, val) \
- + do { \
- + union _FP_UNION_E _flo; _flo.flt = (val); \
- + \
- + X##_f[2] = 0; X##_f[3] = 0; \
- + X##_f[0] = _flo.bits.frac0; \
- + X##_f[1] = _flo.bits.frac1; \
- + X##_e = _flo.bits.exp; \
- + X##_s = _flo.bits.sign; \
- + } while (0)
- +
- +#define FP_UNPACK_RAW_EP(X, val) \
- + do { \
- + union _FP_UNION_E *_flo = \
- + (union _FP_UNION_E *)(val); \
- + \
- + X##_f[2] = 0; X##_f[3] = 0; \
- + X##_f[0] = _flo->bits.frac0; \
- + X##_f[1] = _flo->bits.frac1; \
- + X##_e = _flo->bits.exp; \
- + X##_s = _flo->bits.sign; \
- + } while (0)
- +
- +#define FP_PACK_RAW_E(val, X) \
- + do { \
- + union _FP_UNION_E _flo; \
- + \
- + if (X##_e) X##_f[1] |= _FP_IMPLBIT_E; \
- + else X##_f[1] &= ~(_FP_IMPLBIT_E); \
- + _flo.bits.frac0 = X##_f[0]; \
- + _flo.bits.frac1 = X##_f[1]; \
- + _flo.bits.exp = X##_e; \
- + _flo.bits.sign = X##_s; \
- + \
- + (val) = _flo.flt; \
- + } while (0)
- +
- +#define FP_PACK_RAW_EP(val, X) \
- + do { \
- + if (!FP_INHIBIT_RESULTS) \
- + { \
- + union _FP_UNION_E *_flo = \
- + (union _FP_UNION_E *)(val); \
- + \
- + if (X##_e) X##_f[1] |= _FP_IMPLBIT_E; \
- + else X##_f[1] &= ~(_FP_IMPLBIT_E); \
- + _flo->bits.frac0 = X##_f[0]; \
- + _flo->bits.frac1 = X##_f[1]; \
- + _flo->bits.exp = X##_e; \
- + _flo->bits.sign = X##_s; \
- + } \
- + } while (0)
- +
- +#define FP_UNPACK_E(X,val) \
- + do { \
- + FP_UNPACK_RAW_E(X,val); \
- + _FP_UNPACK_CANONICAL(E,4,X); \
- + } while (0)
- +
- +#define FP_UNPACK_EP(X,val) \
- + do { \
- + FP_UNPACK_RAW_EP(X,val); \
- + _FP_UNPACK_CANONICAL(E,4,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_E(X,val) \
- + do { \
- + FP_UNPACK_RAW_E(X,val); \
- + _FP_UNPACK_SEMIRAW(E,4,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_EP(X,val) \
- + do { \
- + FP_UNPACK_RAW_EP(X,val); \
- + _FP_UNPACK_SEMIRAW(E,4,X); \
- + } while (0)
- +
- +#define FP_PACK_E(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(E,4,X); \
- + FP_PACK_RAW_E(val,X); \
- + } while (0)
- +
- +#define FP_PACK_EP(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(E,4,X); \
- + FP_PACK_RAW_EP(val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_E(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(E,4,X); \
- + FP_PACK_RAW_E(val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_EP(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(E,4,X); \
- + FP_PACK_RAW_EP(val,X); \
- + } while (0)
- +
- +#define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,4,X)
- +#define FP_NEG_E(R,X) _FP_NEG(E,4,R,X)
- +#define FP_ADD_E(R,X,Y) _FP_ADD(E,4,R,X,Y)
- +#define FP_SUB_E(R,X,Y) _FP_SUB(E,4,R,X,Y)
- +#define FP_MUL_E(R,X,Y) _FP_MUL(E,4,R,X,Y)
- +#define FP_DIV_E(R,X,Y) _FP_DIV(E,4,R,X,Y)
- +#define FP_SQRT_E(R,X) _FP_SQRT(E,4,R,X)
- +
- +/*
- + * Square root algorithms:
- + * We have just one right now, maybe Newton approximation
- + * should be added for those machines where division is fast.
- + * This has special _E version because standard _4 square
- + * root would not work (it has to start normally with the
- + * second word and not the first), but as we have to do it
- + * anyway, we optimize it by doing most of the calculations
- + * in two UWtype registers instead of four.
- + */
- +
- +#define _FP_SQRT_MEAT_E(R, S, T, X, q) \
- + do { \
- + q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
- + _FP_FRAC_SRL_4(X, (_FP_WORKBITS)); \
- + while (q) \
- + { \
- + T##_f[1] = S##_f[1] + q; \
- + if (T##_f[1] <= X##_f[1]) \
- + { \
- + S##_f[1] = T##_f[1] + q; \
- + X##_f[1] -= T##_f[1]; \
- + R##_f[1] += q; \
- + } \
- + _FP_FRAC_SLL_2(X, 1); \
- + q >>= 1; \
- + } \
- + q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
- + while (q) \
- + { \
- + T##_f[0] = S##_f[0] + q; \
- + T##_f[1] = S##_f[1]; \
- + if (T##_f[1] < X##_f[1] || \
- + (T##_f[1] == X##_f[1] && \
- + T##_f[0] <= X##_f[0])) \
- + { \
- + S##_f[0] = T##_f[0] + q; \
- + S##_f[1] += (T##_f[0] > S##_f[0]); \
- + _FP_FRAC_DEC_2(X, T); \
- + R##_f[0] += q; \
- + } \
- + _FP_FRAC_SLL_2(X, 1); \
- + q >>= 1; \
- + } \
- + _FP_FRAC_SLL_4(R, (_FP_WORKBITS)); \
- + if (X##_f[0] | X##_f[1]) \
- + { \
- + if (S##_f[1] < X##_f[1] || \
- + (S##_f[1] == X##_f[1] && \
- + S##_f[0] < X##_f[0])) \
- + R##_f[0] |= _FP_WORK_ROUND; \
- + R##_f[0] |= _FP_WORK_STICKY; \
- + } \
- + } while (0)
- +
- +#define FP_CMP_E(r,X,Y,un) _FP_CMP(E,4,r,X,Y,un)
- +#define FP_CMP_EQ_E(r,X,Y) _FP_CMP_EQ(E,4,r,X,Y)
- +#define FP_CMP_UNORD_E(r,X,Y) _FP_CMP_UNORD(E,4,r,X,Y)
- +
- +#define FP_TO_INT_E(r,X,rsz,rsg) _FP_TO_INT(E,4,r,X,rsz,rsg)
- +#define FP_FROM_INT_E(X,r,rs,rt) _FP_FROM_INT(E,4,X,r,rs,rt)
- +
- +#define _FP_FRAC_HIGH_E(X) (X##_f[2])
- +#define _FP_FRAC_HIGH_RAW_E(X) (X##_f[1])
- +
- +#else /* not _FP_W_TYPE_SIZE < 64 */
- +union _FP_UNION_E
- +{
- + XFtype flt;
- + struct {
- +#if __BYTE_ORDER == __BIG_ENDIAN
- + _FP_W_TYPE pad : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
- + unsigned sign : 1;
- + unsigned exp : _FP_EXPBITS_E;
- + _FP_W_TYPE frac : _FP_W_TYPE_SIZE;
- +#else
- + _FP_W_TYPE frac : _FP_W_TYPE_SIZE;
- + unsigned exp : _FP_EXPBITS_E;
- + unsigned sign : 1;
- +#endif
- + } bits;
- +};
- +
- +#define FP_DECL_E(X) _FP_DECL(2,X)
- +
- +#define FP_UNPACK_RAW_E(X, val) \
- + do { \
- + union _FP_UNION_E _flo; _flo.flt = (val); \
- + \
- + X##_f0 = _flo.bits.frac; \
- + X##_f1 = 0; \
- + X##_e = _flo.bits.exp; \
- + X##_s = _flo.bits.sign; \
- + } while (0)
- +
- +#define FP_UNPACK_RAW_EP(X, val) \
- + do { \
- + union _FP_UNION_E *_flo = \
- + (union _FP_UNION_E *)(val); \
- + \
- + X##_f0 = _flo->bits.frac; \
- + X##_f1 = 0; \
- + X##_e = _flo->bits.exp; \
- + X##_s = _flo->bits.sign; \
- + } while (0)
- +
- +#define FP_PACK_RAW_E(val, X) \
- + do { \
- + union _FP_UNION_E _flo; \
- + \
- + if (X##_e) X##_f0 |= _FP_IMPLBIT_E; \
- + else X##_f0 &= ~(_FP_IMPLBIT_E); \
- + _flo.bits.frac = X##_f0; \
- + _flo.bits.exp = X##_e; \
- + _flo.bits.sign = X##_s; \
- + \
- + (val) = _flo.flt; \
- + } while (0)
- +
- +#define FP_PACK_RAW_EP(fs, val, X) \
- + do { \
- + if (!FP_INHIBIT_RESULTS) \
- + { \
- + union _FP_UNION_E *_flo = \
- + (union _FP_UNION_E *)(val); \
- + \
- + if (X##_e) X##_f0 |= _FP_IMPLBIT_E; \
- + else X##_f0 &= ~(_FP_IMPLBIT_E); \
- + _flo->bits.frac = X##_f0; \
- + _flo->bits.exp = X##_e; \
- + _flo->bits.sign = X##_s; \
- + } \
- + } while (0)
- +
- +
- +#define FP_UNPACK_E(X,val) \
- + do { \
- + FP_UNPACK_RAW_E(X,val); \
- + _FP_UNPACK_CANONICAL(E,2,X); \
- + } while (0)
- +
- +#define FP_UNPACK_EP(X,val) \
- + do { \
- + FP_UNPACK_RAW_EP(X,val); \
- + _FP_UNPACK_CANONICAL(E,2,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_E(X,val) \
- + do { \
- + FP_UNPACK_RAW_E(X,val); \
- + _FP_UNPACK_SEMIRAW(E,2,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_EP(X,val) \
- + do { \
- + FP_UNPACK_RAW_EP(X,val); \
- + _FP_UNPACK_SEMIRAW(E,2,X); \
- + } while (0)
- +
- +#define FP_PACK_E(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(E,2,X); \
- + FP_PACK_RAW_E(val,X); \
- + } while (0)
- +
- +#define FP_PACK_EP(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(E,2,X); \
- + FP_PACK_RAW_EP(val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_E(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(E,2,X); \
- + FP_PACK_RAW_E(val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_EP(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(E,2,X); \
- + FP_PACK_RAW_EP(val,X); \
- + } while (0)
- +
- +#define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,2,X)
- +#define FP_NEG_E(R,X) _FP_NEG(E,2,R,X)
- +#define FP_ADD_E(R,X,Y) _FP_ADD(E,2,R,X,Y)
- +#define FP_SUB_E(R,X,Y) _FP_SUB(E,2,R,X,Y)
- +#define FP_MUL_E(R,X,Y) _FP_MUL(E,2,R,X,Y)
- +#define FP_DIV_E(R,X,Y) _FP_DIV(E,2,R,X,Y)
- +#define FP_SQRT_E(R,X) _FP_SQRT(E,2,R,X)
- +
- +/*
- + * Square root algorithms:
- + * We have just one right now, maybe Newton approximation
- + * should be added for those machines where division is fast.
- + * We optimize it by doing most of the calculations
- + * in one UWtype registers instead of two, although we don't
- + * have to.
- + */
- +#define _FP_SQRT_MEAT_E(R, S, T, X, q) \
- + do { \
- + q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
- + _FP_FRAC_SRL_2(X, (_FP_WORKBITS)); \
- + while (q) \
- + { \
- + T##_f0 = S##_f0 + q; \
- + if (T##_f0 <= X##_f0) \
- + { \
- + S##_f0 = T##_f0 + q; \
- + X##_f0 -= T##_f0; \
- + R##_f0 += q; \
- + } \
- + _FP_FRAC_SLL_1(X, 1); \
- + q >>= 1; \
- + } \
- + _FP_FRAC_SLL_2(R, (_FP_WORKBITS)); \
- + if (X##_f0) \
- + { \
- + if (S##_f0 < X##_f0) \
- + R##_f0 |= _FP_WORK_ROUND; \
- + R##_f0 |= _FP_WORK_STICKY; \
- + } \
- + } while (0)
- +
- +#define FP_CMP_E(r,X,Y,un) _FP_CMP(E,2,r,X,Y,un)
- +#define FP_CMP_EQ_E(r,X,Y) _FP_CMP_EQ(E,2,r,X,Y)
- +#define FP_CMP_UNORD_E(r,X,Y) _FP_CMP_UNORD(E,2,r,X,Y)
- +
- +#define FP_TO_INT_E(r,X,rsz,rsg) _FP_TO_INT(E,2,r,X,rsz,rsg)
- +#define FP_FROM_INT_E(X,r,rs,rt) _FP_FROM_INT(E,2,X,r,rs,rt)
- +
- +#define _FP_FRAC_HIGH_E(X) (X##_f1)
- +#define _FP_FRAC_HIGH_RAW_E(X) (X##_f0)
- +
- +#endif /* not _FP_W_TYPE_SIZE < 64 */
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/longlong.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/longlong.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/longlong.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/longlong.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,1461 @@
- +/* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
- + Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- + 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
- +
- + This file is part of the GNU C Library.
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +/* You have to define the following before including this file:
- +
- + UWtype -- An unsigned type, default type for operations (typically a "word")
- + UHWtype -- An unsigned type, at least half the size of UWtype.
- + UDWtype -- An unsigned type, at least twice as large a UWtype
- + W_TYPE_SIZE -- size in bits of UWtype
- +
- + UQItype -- Unsigned 8 bit type.
- + SItype, USItype -- Signed and unsigned 32 bit types.
- + DItype, UDItype -- Signed and unsigned 64 bit types.
- +
- + On a 32 bit machine UWtype should typically be USItype;
- + on a 64 bit machine, UWtype should typically be UDItype. */
- +
- +#define __BITS4 (W_TYPE_SIZE / 4)
- +#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2))
- +#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1))
- +#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2))
- +
- +#ifndef W_TYPE_SIZE
- +#define W_TYPE_SIZE 32
- +#define UWtype USItype
- +#define UHWtype USItype
- +#define UDWtype UDItype
- +#endif
- +
- +extern const UQItype __clz_tab[256] attribute_hidden;
- +
- +/* Define auxiliary asm macros.
- +
- + 1) umul_ppmm(high_prod, low_prod, multiplier, multiplicand) multiplies two
- + UWtype integers MULTIPLIER and MULTIPLICAND, and generates a two UWtype
- + word product in HIGH_PROD and LOW_PROD.
- +
- + 2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a
- + UDWtype product. This is just a variant of umul_ppmm.
- +
- + 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
- + denominator) divides a UDWtype, composed by the UWtype integers
- + HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient
- + in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less
- + than DENOMINATOR for correct operation. If, in addition, the most
- + significant bit of DENOMINATOR must be 1, then the pre-processor symbol
- + UDIV_NEEDS_NORMALIZATION is defined to 1.
- +
- + 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
- + denominator). Like udiv_qrnnd but the numbers are signed. The quotient
- + is rounded towards 0.
- +
- + 5) count_leading_zeros(count, x) counts the number of zero-bits from the
- + msb to the first nonzero bit in the UWtype X. This is the number of
- + steps X needs to be shifted left to set the msb. Undefined for X == 0,
- + unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value.
- +
- + 6) count_trailing_zeros(count, x) like count_leading_zeros, but counts
- + from the least significant end.
- +
- + 7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
- + high_addend_2, low_addend_2) adds two UWtype integers, composed by
- + HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2
- + respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow
- + (i.e. carry out) is not stored anywhere, and is lost.
- +
- + 8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend,
- + high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers,
- + composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and
- + LOW_SUBTRAHEND_2 respectively. The result is placed in HIGH_DIFFERENCE
- + and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere,
- + and is lost.
- +
- + If any of these macros are left undefined for a particular CPU,
- + C macros are used. */
- +
- +/* The CPUs come in alphabetical order below.
- +
- + Please add support for more CPUs here, or improve the current support
- + for the CPUs below!
- + (E.g. WE32100, IBM360.) */
- +
- +#if defined (__GNUC__) && !defined (NO_ASM)
- +
- +/* We sometimes need to clobber "cc" with gcc2, but that would not be
- + understood by gcc1. Use cpp to avoid major code duplication. */
- +#if __GNUC__ < 2
- +#define __CLOBBER_CC
- +#define __AND_CLOBBER_CC
- +#else /* __GNUC__ >= 2 */
- +#define __CLOBBER_CC : "cc"
- +#define __AND_CLOBBER_CC , "cc"
- +#endif /* __GNUC__ < 2 */
- +
- +#if defined (__alpha) && W_TYPE_SIZE == 64
- +#define umul_ppmm(ph, pl, m0, m1) \
- + do { \
- + UDItype __m0 = (m0), __m1 = (m1); \
- + (ph) = __builtin_alpha_umulh (__m0, __m1); \
- + (pl) = __m0 * __m1; \
- + } while (0)
- +#define UMUL_TIME 46
- +#ifndef LONGLONG_STANDALONE
- +#define udiv_qrnnd(q, r, n1, n0, d) \
- + do { UDItype __r; \
- + (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \
- + (r) = __r; \
- + } while (0)
- +extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
- +#define UDIV_TIME 220
- +#endif /* LONGLONG_STANDALONE */
- +#ifdef __alpha_cix__
- +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clzl (X))
- +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctzl (X))
- +#define COUNT_LEADING_ZEROS_0 64
- +#else
- +#define count_leading_zeros(COUNT,X) \
- + do { \
- + UDItype __xr = (X), __t, __a; \
- + __t = __builtin_alpha_cmpbge (0, __xr); \
- + __a = __clz_tab[__t ^ 0xff] - 1; \
- + __t = __builtin_alpha_extbl (__xr, __a); \
- + (COUNT) = 64 - (__clz_tab[__t] + __a*8); \
- + } while (0)
- +#define count_trailing_zeros(COUNT,X) \
- + do { \
- + UDItype __xr = (X), __t, __a; \
- + __t = __builtin_alpha_cmpbge (0, __xr); \
- + __t = ~__t & -~__t; \
- + __a = ((__t & 0xCC) != 0) * 2; \
- + __a += ((__t & 0xF0) != 0) * 4; \
- + __a += ((__t & 0xAA) != 0); \
- + __t = __builtin_alpha_extbl (__xr, __a); \
- + __a <<= 3; \
- + __t &= -__t; \
- + __a += ((__t & 0xCC) != 0) * 2; \
- + __a += ((__t & 0xF0) != 0) * 4; \
- + __a += ((__t & 0xAA) != 0); \
- + (COUNT) = __a; \
- + } while (0)
- +#endif /* __alpha_cix__ */
- +#endif /* __alpha */
- +
- +#if defined (__arc__) && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("add.f %1, %4, %5\n\tadc %0, %2, %3" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "%r" ((USItype) (ah)), \
- + "rIJ" ((USItype) (bh)), \
- + "%r" ((USItype) (al)), \
- + "rIJ" ((USItype) (bl)))
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("sub.f %1, %4, %5\n\tsbc %0, %2, %3" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "r" ((USItype) (ah)), \
- + "rIJ" ((USItype) (bh)), \
- + "r" ((USItype) (al)), \
- + "rIJ" ((USItype) (bl)))
- +/* Call libgcc routine. */
- +#define umul_ppmm(w1, w0, u, v) \
- +do { \
- + DWunion __w; \
- + __w.ll = __umulsidi3 (u, v); \
- + w1 = __w.s.high; \
- + w0 = __w.s.low; \
- +} while (0)
- +#define __umulsidi3 __umulsidi3
- +UDItype __umulsidi3 (USItype, USItype);
- +#endif
- +
- +#if defined (__arm__) && !defined (__thumb__) && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("adds %1, %4, %5\n\tadc %0, %2, %3" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "%r" ((USItype) (ah)), \
- + "rI" ((USItype) (bh)), \
- + "%r" ((USItype) (al)), \
- + "rI" ((USItype) (bl)) __CLOBBER_CC)
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("subs %1, %4, %5\n\tsbc %0, %2, %3" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "r" ((USItype) (ah)), \
- + "rI" ((USItype) (bh)), \
- + "r" ((USItype) (al)), \
- + "rI" ((USItype) (bl)) __CLOBBER_CC)
- +#define umul_ppmm(xh, xl, a, b) \
- +{register USItype __t0, __t1, __t2; \
- + __asm__ ("%@ Inlined umul_ppmm\n" \
- + " mov %2, %5, lsr #16\n" \
- + " mov %0, %6, lsr #16\n" \
- + " bic %3, %5, %2, lsl #16\n" \
- + " bic %4, %6, %0, lsl #16\n" \
- + " mul %1, %3, %4\n" \
- + " mul %4, %2, %4\n" \
- + " mul %3, %0, %3\n" \
- + " mul %0, %2, %0\n" \
- + " adds %3, %4, %3\n" \
- + " addcs %0, %0, #65536\n" \
- + " adds %1, %1, %3, lsl #16\n" \
- + " adc %0, %0, %3, lsr #16" \
- + : "=&r" ((USItype) (xh)), \
- + "=r" ((USItype) (xl)), \
- + "=&r" (__t0), "=&r" (__t1), "=r" (__t2) \
- + : "r" ((USItype) (a)), \
- + "r" ((USItype) (b)) __CLOBBER_CC );}
- +#define UMUL_TIME 20
- +#define UDIV_TIME 100
- +#endif /* __arm__ */
- +
- +#if defined(__arm__)
- +/* Let gcc decide how best to implement count_leading_zeros. */
- +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X))
- +#define COUNT_LEADING_ZEROS_0 32
- +#endif
- +
- +#if defined (__CRIS__) && __CRIS_arch_version >= 3
- +#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X))
- +#if __CRIS_arch_version >= 8
- +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctz (X))
- +#endif
- +#endif /* __CRIS__ */
- +
- +#if defined (__hppa) && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "%rM" ((USItype) (ah)), \
- + "rM" ((USItype) (bh)), \
- + "%rM" ((USItype) (al)), \
- + "rM" ((USItype) (bl)))
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "rM" ((USItype) (ah)), \
- + "rM" ((USItype) (bh)), \
- + "rM" ((USItype) (al)), \
- + "rM" ((USItype) (bl)))
- +#if defined (_PA_RISC1_1)
- +#define umul_ppmm(w1, w0, u, v) \
- + do { \
- + union \
- + { \
- + UDItype __f; \
- + struct {USItype __w1, __w0;} __w1w0; \
- + } __t; \
- + __asm__ ("xmpyu %1,%2,%0" \
- + : "=x" (__t.__f) \
- + : "x" ((USItype) (u)), \
- + "x" ((USItype) (v))); \
- + (w1) = __t.__w1w0.__w1; \
- + (w0) = __t.__w1w0.__w0; \
- + } while (0)
- +#define UMUL_TIME 8
- +#else
- +#define UMUL_TIME 30
- +#endif
- +#define UDIV_TIME 40
- +#define count_leading_zeros(count, x) \
- + do { \
- + USItype __tmp; \
- + __asm__ ( \
- + "ldi 1,%0\n" \
- +" extru,= %1,15,16,%%r0 ; Bits 31..16 zero?\n" \
- +" extru,tr %1,15,16,%1 ; No. Shift down, skip add.\n"\
- +" ldo 16(%0),%0 ; Yes. Perform add.\n" \
- +" extru,= %1,23,8,%%r0 ; Bits 15..8 zero?\n" \
- +" extru,tr %1,23,8,%1 ; No. Shift down, skip add.\n"\
- +" ldo 8(%0),%0 ; Yes. Perform add.\n" \
- +" extru,= %1,27,4,%%r0 ; Bits 7..4 zero?\n" \
- +" extru,tr %1,27,4,%1 ; No. Shift down, skip add.\n"\
- +" ldo 4(%0),%0 ; Yes. Perform add.\n" \
- +" extru,= %1,29,2,%%r0 ; Bits 3..2 zero?\n" \
- +" extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n"\
- +" ldo 2(%0),%0 ; Yes. Perform add.\n" \
- +" extru %1,30,1,%1 ; Extract bit 1.\n" \
- +" sub %0,%1,%0 ; Subtract it.\n" \
- + : "=r" (count), "=r" (__tmp) : "1" (x)); \
- + } while (0)
- +#endif
- +
- +#if (defined (__i370__) || defined (__s390__) || defined (__mvs__)) && W_TYPE_SIZE == 32
- +#define smul_ppmm(xh, xl, m0, m1) \
- + do { \
- + union {DItype __ll; \
- + struct {USItype __h, __l;} __i; \
- + } __x; \
- + __asm__ ("lr %N0,%1\n\tmr %0,%2" \
- + : "=&r" (__x.__ll) \
- + : "r" (m0), "r" (m1)); \
- + (xh) = __x.__i.__h; (xl) = __x.__i.__l; \
- + } while (0)
- +#define sdiv_qrnnd(q, r, n1, n0, d) \
- + do { \
- + union {DItype __ll; \
- + struct {USItype __h, __l;} __i; \
- + } __x; \
- + __x.__i.__h = n1; __x.__i.__l = n0; \
- + __asm__ ("dr %0,%2" \
- + : "=r" (__x.__ll) \
- + : "0" (__x.__ll), "r" (d)); \
- + (q) = __x.__i.__l; (r) = __x.__i.__h; \
- + } while (0)
- +#endif
- +
- +#if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("add{l} {%5,%1|%1,%5}\n\tadc{l} {%3,%0|%0,%3}" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "%0" ((USItype) (ah)), \
- + "g" ((USItype) (bh)), \
- + "%1" ((USItype) (al)), \
- + "g" ((USItype) (bl)))
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("sub{l} {%5,%1|%1,%5}\n\tsbb{l} {%3,%0|%0,%3}" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "0" ((USItype) (ah)), \
- + "g" ((USItype) (bh)), \
- + "1" ((USItype) (al)), \
- + "g" ((USItype) (bl)))
- +#define umul_ppmm(w1, w0, u, v) \
- + __asm__ ("mul{l} %3" \
- + : "=a" ((USItype) (w0)), \
- + "=d" ((USItype) (w1)) \
- + : "%0" ((USItype) (u)), \
- + "rm" ((USItype) (v)))
- +#define udiv_qrnnd(q, r, n1, n0, dv) \
- + __asm__ ("div{l} %4" \
- + : "=a" ((USItype) (q)), \
- + "=d" ((USItype) (r)) \
- + : "0" ((USItype) (n0)), \
- + "1" ((USItype) (n1)), \
- + "rm" ((USItype) (dv)))
- +#define count_leading_zeros(count, x) ((count) = __builtin_clz (x))
- +#define count_trailing_zeros(count, x) ((count) = __builtin_ctz (x))
- +#define UMUL_TIME 40
- +#define UDIV_TIME 40
- +#endif /* 80x86 */
- +
- +#if (defined (__x86_64__) || defined (__i386__)) && W_TYPE_SIZE == 64
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("add{q} {%5,%1|%1,%5}\n\tadc{q} {%3,%0|%0,%3}" \
- + : "=r" ((UDItype) (sh)), \
- + "=&r" ((UDItype) (sl)) \
- + : "%0" ((UDItype) (ah)), \
- + "rme" ((UDItype) (bh)), \
- + "%1" ((UDItype) (al)), \
- + "rme" ((UDItype) (bl)))
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("sub{q} {%5,%1|%1,%5}\n\tsbb{q} {%3,%0|%0,%3}" \
- + : "=r" ((UDItype) (sh)), \
- + "=&r" ((UDItype) (sl)) \
- + : "0" ((UDItype) (ah)), \
- + "rme" ((UDItype) (bh)), \
- + "1" ((UDItype) (al)), \
- + "rme" ((UDItype) (bl)))
- +#define umul_ppmm(w1, w0, u, v) \
- + __asm__ ("mul{q} %3" \
- + : "=a" ((UDItype) (w0)), \
- + "=d" ((UDItype) (w1)) \
- + : "%0" ((UDItype) (u)), \
- + "rm" ((UDItype) (v)))
- +#define udiv_qrnnd(q, r, n1, n0, dv) \
- + __asm__ ("div{q} %4" \
- + : "=a" ((UDItype) (q)), \
- + "=d" ((UDItype) (r)) \
- + : "0" ((UDItype) (n0)), \
- + "1" ((UDItype) (n1)), \
- + "rm" ((UDItype) (dv)))
- +#define count_leading_zeros(count, x) ((count) = __builtin_clzl (x))
- +#define count_trailing_zeros(count, x) ((count) = __builtin_ctzl (x))
- +#define UMUL_TIME 40
- +#define UDIV_TIME 40
- +#endif /* x86_64 */
- +
- +#if defined (__i960__) && W_TYPE_SIZE == 32
- +#define umul_ppmm(w1, w0, u, v) \
- + ({union {UDItype __ll; \
- + struct {USItype __l, __h;} __i; \
- + } __xx; \
- + __asm__ ("emul %2,%1,%0" \
- + : "=d" (__xx.__ll) \
- + : "%dI" ((USItype) (u)), \
- + "dI" ((USItype) (v))); \
- + (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
- +#define __umulsidi3(u, v) \
- + ({UDItype __w; \
- + __asm__ ("emul %2,%1,%0" \
- + : "=d" (__w) \
- + : "%dI" ((USItype) (u)), \
- + "dI" ((USItype) (v))); \
- + __w; })
- +#endif /* __i960__ */
- +
- +#if defined (__M32R__) && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + /* The cmp clears the condition bit. */ \
- + __asm__ ("cmp %0,%0\n\taddx %1,%5\n\taddx %0,%3" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "0" ((USItype) (ah)), \
- + "r" ((USItype) (bh)), \
- + "1" ((USItype) (al)), \
- + "r" ((USItype) (bl)) \
- + : "cbit")
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + /* The cmp clears the condition bit. */ \
- + __asm__ ("cmp %0,%0\n\tsubx %1,%5\n\tsubx %0,%3" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "0" ((USItype) (ah)), \
- + "r" ((USItype) (bh)), \
- + "1" ((USItype) (al)), \
- + "r" ((USItype) (bl)) \
- + : "cbit")
- +#endif /* __M32R__ */
- +
- +#if defined (__mc68000__) && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0" \
- + : "=d" ((USItype) (sh)), \
- + "=&d" ((USItype) (sl)) \
- + : "%0" ((USItype) (ah)), \
- + "d" ((USItype) (bh)), \
- + "%1" ((USItype) (al)), \
- + "g" ((USItype) (bl)))
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0" \
- + : "=d" ((USItype) (sh)), \
- + "=&d" ((USItype) (sl)) \
- + : "0" ((USItype) (ah)), \
- + "d" ((USItype) (bh)), \
- + "1" ((USItype) (al)), \
- + "g" ((USItype) (bl)))
- +
- +/* The '020, '030, '040, '060 and CPU32 have 32x32->64 and 64/32->32q-32r. */
- +#if (defined (__mc68020__) && !defined (__mc68060__))
- +#define umul_ppmm(w1, w0, u, v) \
- + __asm__ ("mulu%.l %3,%1:%0" \
- + : "=d" ((USItype) (w0)), \
- + "=d" ((USItype) (w1)) \
- + : "%0" ((USItype) (u)), \
- + "dmi" ((USItype) (v)))
- +#define UMUL_TIME 45
- +#define udiv_qrnnd(q, r, n1, n0, d) \
- + __asm__ ("divu%.l %4,%1:%0" \
- + : "=d" ((USItype) (q)), \
- + "=d" ((USItype) (r)) \
- + : "0" ((USItype) (n0)), \
- + "1" ((USItype) (n1)), \
- + "dmi" ((USItype) (d)))
- +#define UDIV_TIME 90
- +#define sdiv_qrnnd(q, r, n1, n0, d) \
- + __asm__ ("divs%.l %4,%1:%0" \
- + : "=d" ((USItype) (q)), \
- + "=d" ((USItype) (r)) \
- + : "0" ((USItype) (n0)), \
- + "1" ((USItype) (n1)), \
- + "dmi" ((USItype) (d)))
- +
- +#elif defined (__mcoldfire__) /* not mc68020 */
- +
- +#define umul_ppmm(xh, xl, a, b) \
- + __asm__ ("| Inlined umul_ppmm\n" \
- + " move%.l %2,%/d0\n" \
- + " move%.l %3,%/d1\n" \
- + " move%.l %/d0,%/d2\n" \
- + " swap %/d0\n" \
- + " move%.l %/d1,%/d3\n" \
- + " swap %/d1\n" \
- + " move%.w %/d2,%/d4\n" \
- + " mulu %/d3,%/d4\n" \
- + " mulu %/d1,%/d2\n" \
- + " mulu %/d0,%/d3\n" \
- + " mulu %/d0,%/d1\n" \
- + " move%.l %/d4,%/d0\n" \
- + " clr%.w %/d0\n" \
- + " swap %/d0\n" \
- + " add%.l %/d0,%/d2\n" \
- + " add%.l %/d3,%/d2\n" \
- + " jcc 1f\n" \
- + " add%.l %#65536,%/d1\n" \
- + "1: swap %/d2\n" \
- + " moveq %#0,%/d0\n" \
- + " move%.w %/d2,%/d0\n" \
- + " move%.w %/d4,%/d2\n" \
- + " move%.l %/d2,%1\n" \
- + " add%.l %/d1,%/d0\n" \
- + " move%.l %/d0,%0" \
- + : "=g" ((USItype) (xh)), \
- + "=g" ((USItype) (xl)) \
- + : "g" ((USItype) (a)), \
- + "g" ((USItype) (b)) \
- + : "d0", "d1", "d2", "d3", "d4")
- +#define UMUL_TIME 100
- +#define UDIV_TIME 400
- +#else /* not ColdFire */
- +/* %/ inserts REGISTER_PREFIX, %# inserts IMMEDIATE_PREFIX. */
- +#define umul_ppmm(xh, xl, a, b) \
- + __asm__ ("| Inlined umul_ppmm\n" \
- + " move%.l %2,%/d0\n" \
- + " move%.l %3,%/d1\n" \
- + " move%.l %/d0,%/d2\n" \
- + " swap %/d0\n" \
- + " move%.l %/d1,%/d3\n" \
- + " swap %/d1\n" \
- + " move%.w %/d2,%/d4\n" \
- + " mulu %/d3,%/d4\n" \
- + " mulu %/d1,%/d2\n" \
- + " mulu %/d0,%/d3\n" \
- + " mulu %/d0,%/d1\n" \
- + " move%.l %/d4,%/d0\n" \
- + " eor%.w %/d0,%/d0\n" \
- + " swap %/d0\n" \
- + " add%.l %/d0,%/d2\n" \
- + " add%.l %/d3,%/d2\n" \
- + " jcc 1f\n" \
- + " add%.l %#65536,%/d1\n" \
- + "1: swap %/d2\n" \
- + " moveq %#0,%/d0\n" \
- + " move%.w %/d2,%/d0\n" \
- + " move%.w %/d4,%/d2\n" \
- + " move%.l %/d2,%1\n" \
- + " add%.l %/d1,%/d0\n" \
- + " move%.l %/d0,%0" \
- + : "=g" ((USItype) (xh)), \
- + "=g" ((USItype) (xl)) \
- + : "g" ((USItype) (a)), \
- + "g" ((USItype) (b)) \
- + : "d0", "d1", "d2", "d3", "d4")
- +#define UMUL_TIME 100
- +#define UDIV_TIME 400
- +
- +#endif /* not mc68020 */
- +
- +/* The '020, '030, '040 and '060 have bitfield insns.
- + cpu32 disguises as a 68020, but lacks them. */
- +#if defined (__mc68020__) && !defined (__mcpu32__)
- +#define count_leading_zeros(count, x) \
- + __asm__ ("bfffo %1{%b2:%b2},%0" \
- + : "=d" ((USItype) (count)) \
- + : "od" ((USItype) (x)), "n" (0))
- +/* Some ColdFire architectures have a ff1 instruction supported via
- + __builtin_clz. */
- +#elif defined (__mcfisaaplus__) || defined (__mcfisac__)
- +#define count_leading_zeros(count,x) ((count) = __builtin_clz (x))
- +#define COUNT_LEADING_ZEROS_0 32
- +#endif
- +#endif /* mc68000 */
- +
- +#if defined (__m88000__) && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "%rJ" ((USItype) (ah)), \
- + "rJ" ((USItype) (bh)), \
- + "%rJ" ((USItype) (al)), \
- + "rJ" ((USItype) (bl)))
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "rJ" ((USItype) (ah)), \
- + "rJ" ((USItype) (bh)), \
- + "rJ" ((USItype) (al)), \
- + "rJ" ((USItype) (bl)))
- +#define count_leading_zeros(count, x) \
- + do { \
- + USItype __cbtmp; \
- + __asm__ ("ff1 %0,%1" \
- + : "=r" (__cbtmp) \
- + : "r" ((USItype) (x))); \
- + (count) = __cbtmp ^ 31; \
- + } while (0)
- +#define COUNT_LEADING_ZEROS_0 63 /* sic */
- +#if defined (__mc88110__)
- +#define umul_ppmm(wh, wl, u, v) \
- + do { \
- + union {UDItype __ll; \
- + struct {USItype __h, __l;} __i; \
- + } __xx; \
- + __asm__ ("mulu.d %0,%1,%2" \
- + : "=r" (__xx.__ll) \
- + : "r" ((USItype) (u)), \
- + "r" ((USItype) (v))); \
- + (wh) = __xx.__i.__h; \
- + (wl) = __xx.__i.__l; \
- + } while (0)
- +#define udiv_qrnnd(q, r, n1, n0, d) \
- + ({union {UDItype __ll; \
- + struct {USItype __h, __l;} __i; \
- + } __xx; \
- + USItype __q; \
- + __xx.__i.__h = (n1); __xx.__i.__l = (n0); \
- + __asm__ ("divu.d %0,%1,%2" \
- + : "=r" (__q) \
- + : "r" (__xx.__ll), \
- + "r" ((USItype) (d))); \
- + (r) = (n0) - __q * (d); (q) = __q; })
- +#define UMUL_TIME 5
- +#define UDIV_TIME 25
- +#else
- +#define UMUL_TIME 17
- +#define UDIV_TIME 150
- +#endif /* __mc88110__ */
- +#endif /* __m88000__ */
- +
- +#if defined (__mips__) && W_TYPE_SIZE == 32
- +#define umul_ppmm(w1, w0, u, v) \
- + do { \
- + UDItype __x = (UDItype) (USItype) (u) * (USItype) (v); \
- + (w1) = (USItype) (__x >> 32); \
- + (w0) = (USItype) (__x); \
- + } while (0)
- +#define UMUL_TIME 10
- +#define UDIV_TIME 100
- +
- +#if (__mips == 32 || __mips == 64) && ! __mips16
- +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X))
- +#define COUNT_LEADING_ZEROS_0 32
- +#endif
- +#endif /* __mips__ */
- +
- +#if defined (__ns32000__) && W_TYPE_SIZE == 32
- +#define umul_ppmm(w1, w0, u, v) \
- + ({union {UDItype __ll; \
- + struct {USItype __l, __h;} __i; \
- + } __xx; \
- + __asm__ ("meid %2,%0" \
- + : "=g" (__xx.__ll) \
- + : "%0" ((USItype) (u)), \
- + "g" ((USItype) (v))); \
- + (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
- +#define __umulsidi3(u, v) \
- + ({UDItype __w; \
- + __asm__ ("meid %2,%0" \
- + : "=g" (__w) \
- + : "%0" ((USItype) (u)), \
- + "g" ((USItype) (v))); \
- + __w; })
- +#define udiv_qrnnd(q, r, n1, n0, d) \
- + ({union {UDItype __ll; \
- + struct {USItype __l, __h;} __i; \
- + } __xx; \
- + __xx.__i.__h = (n1); __xx.__i.__l = (n0); \
- + __asm__ ("deid %2,%0" \
- + : "=g" (__xx.__ll) \
- + : "0" (__xx.__ll), \
- + "g" ((USItype) (d))); \
- + (r) = __xx.__i.__l; (q) = __xx.__i.__h; })
- +#define count_trailing_zeros(count,x) \
- + do { \
- + __asm__ ("ffsd %2,%0" \
- + : "=r" ((USItype) (count)) \
- + : "0" ((USItype) 0), \
- + "r" ((USItype) (x))); \
- + } while (0)
- +#endif /* __ns32000__ */
- +
- +/* FIXME: We should test _IBMR2 here when we add assembly support for the
- + system vendor compilers.
- + FIXME: What's needed for gcc PowerPC VxWorks? __vxworks__ is not good
- + enough, since that hits ARM and m68k too. */
- +#if (defined (_ARCH_PPC) /* AIX */ \
- + || defined (_ARCH_PWR) /* AIX */ \
- + || defined (_ARCH_COM) /* AIX */ \
- + || defined (__powerpc__) /* gcc */ \
- + || defined (__POWERPC__) /* BEOS */ \
- + || defined (__ppc__) /* Darwin */ \
- + || (defined (PPC) && ! defined (CPU_FAMILY)) /* gcc 2.7.x GNU&SysV */ \
- + || (defined (PPC) && defined (CPU_FAMILY) /* VxWorks */ \
- + && CPU_FAMILY == PPC) \
- + ) && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + do { \
- + if (__builtin_constant_p (bh) && (bh) == 0) \
- + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
- + else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \
- + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
- + else \
- + __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \
- + : "=r" (sh), "=&r" (sl) \
- + : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \
- + } while (0)
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + do { \
- + if (__builtin_constant_p (ah) && (ah) == 0) \
- + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
- + else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \
- + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
- + else if (__builtin_constant_p (bh) && (bh) == 0) \
- + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
- + else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \
- + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
- + else \
- + __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \
- + : "=r" (sh), "=&r" (sl) \
- + : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \
- + } while (0)
- +#define count_leading_zeros(count, x) \
- + __asm__ ("{cntlz|cntlzw} %0,%1" : "=r" (count) : "r" (x))
- +#define COUNT_LEADING_ZEROS_0 32
- +#if defined (_ARCH_PPC) || defined (__powerpc__) || defined (__POWERPC__) \
- + || defined (__ppc__) \
- + || (defined (PPC) && ! defined (CPU_FAMILY)) /* gcc 2.7.x GNU&SysV */ \
- + || (defined (PPC) && defined (CPU_FAMILY) /* VxWorks */ \
- + && CPU_FAMILY == PPC)
- +#define umul_ppmm(ph, pl, m0, m1) \
- + do { \
- + USItype __m0 = (m0), __m1 = (m1); \
- + __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
- + (pl) = __m0 * __m1; \
- + } while (0)
- +#define UMUL_TIME 15
- +#define smul_ppmm(ph, pl, m0, m1) \
- + do { \
- + SItype __m0 = (m0), __m1 = (m1); \
- + __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
- + (pl) = __m0 * __m1; \
- + } while (0)
- +#define SMUL_TIME 14
- +#define UDIV_TIME 120
- +#elif defined (_ARCH_PWR)
- +#define UMUL_TIME 8
- +#define smul_ppmm(xh, xl, m0, m1) \
- + __asm__ ("mul %0,%2,%3" : "=r" (xh), "=q" (xl) : "r" (m0), "r" (m1))
- +#define SMUL_TIME 4
- +#define sdiv_qrnnd(q, r, nh, nl, d) \
- + __asm__ ("div %0,%2,%4" : "=r" (q), "=q" (r) : "r" (nh), "1" (nl), "r" (d))
- +#define UDIV_TIME 100
- +#endif
- +#endif /* 32-bit POWER architecture variants. */
- +
- +/* We should test _IBMR2 here when we add assembly support for the system
- + vendor compilers. */
- +#if (defined (_ARCH_PPC64) || defined (__powerpc64__)) && W_TYPE_SIZE == 64
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + do { \
- + if (__builtin_constant_p (bh) && (bh) == 0) \
- + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
- + else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \
- + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
- + else \
- + __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \
- + : "=r" (sh), "=&r" (sl) \
- + : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \
- + } while (0)
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + do { \
- + if (__builtin_constant_p (ah) && (ah) == 0) \
- + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
- + else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \
- + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
- + else if (__builtin_constant_p (bh) && (bh) == 0) \
- + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
- + else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \
- + __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
- + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
- + else \
- + __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \
- + : "=r" (sh), "=&r" (sl) \
- + : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \
- + } while (0)
- +#define count_leading_zeros(count, x) \
- + __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x))
- +#define COUNT_LEADING_ZEROS_0 64
- +#define umul_ppmm(ph, pl, m0, m1) \
- + do { \
- + UDItype __m0 = (m0), __m1 = (m1); \
- + __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
- + (pl) = __m0 * __m1; \
- + } while (0)
- +#define UMUL_TIME 15
- +#define smul_ppmm(ph, pl, m0, m1) \
- + do { \
- + DItype __m0 = (m0), __m1 = (m1); \
- + __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
- + (pl) = __m0 * __m1; \
- + } while (0)
- +#define SMUL_TIME 14 /* ??? */
- +#define UDIV_TIME 120 /* ??? */
- +#endif /* 64-bit PowerPC. */
- +
- +#if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("a %1,%5\n\tae %0,%3" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "%0" ((USItype) (ah)), \
- + "r" ((USItype) (bh)), \
- + "%1" ((USItype) (al)), \
- + "r" ((USItype) (bl)))
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("s %1,%5\n\tse %0,%3" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "0" ((USItype) (ah)), \
- + "r" ((USItype) (bh)), \
- + "1" ((USItype) (al)), \
- + "r" ((USItype) (bl)))
- +#define umul_ppmm(ph, pl, m0, m1) \
- + do { \
- + USItype __m0 = (m0), __m1 = (m1); \
- + __asm__ ( \
- + "s r2,r2\n" \
- +" mts r10,%2\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" m r2,%3\n" \
- +" cas %0,r2,r0\n" \
- +" mfs r10,%1" \
- + : "=r" ((USItype) (ph)), \
- + "=r" ((USItype) (pl)) \
- + : "%r" (__m0), \
- + "r" (__m1) \
- + : "r2"); \
- + (ph) += ((((SItype) __m0 >> 31) & __m1) \
- + + (((SItype) __m1 >> 31) & __m0)); \
- + } while (0)
- +#define UMUL_TIME 20
- +#define UDIV_TIME 200
- +#define count_leading_zeros(count, x) \
- + do { \
- + if ((x) >= 0x10000) \
- + __asm__ ("clz %0,%1" \
- + : "=r" ((USItype) (count)) \
- + : "r" ((USItype) (x) >> 16)); \
- + else \
- + { \
- + __asm__ ("clz %0,%1" \
- + : "=r" ((USItype) (count)) \
- + : "r" ((USItype) (x))); \
- + (count) += 16; \
- + } \
- + } while (0)
- +#endif
- +
- +#if defined(__sh__) && !__SHMEDIA__ && W_TYPE_SIZE == 32
- +#ifndef __sh1__
- +#define umul_ppmm(w1, w0, u, v) \
- + __asm__ ( \
- + "dmulu.l %2,%3\n\tsts%M1 macl,%1\n\tsts%M0 mach,%0" \
- + : "=r<" ((USItype)(w1)), \
- + "=r<" ((USItype)(w0)) \
- + : "r" ((USItype)(u)), \
- + "r" ((USItype)(v)) \
- + : "macl", "mach")
- +#define UMUL_TIME 5
- +#endif
- +
- +/* This is the same algorithm as __udiv_qrnnd_c. */
- +#define UDIV_NEEDS_NORMALIZATION 1
- +
- +#define udiv_qrnnd(q, r, n1, n0, d) \
- + do { \
- + extern UWtype __udiv_qrnnd_16 (UWtype, UWtype) \
- + __attribute__ ((visibility ("hidden"))); \
- + /* r0: rn r1: qn */ /* r0: n1 r4: n0 r5: d r6: d1 */ /* r2: __m */ \
- + __asm__ ( \
- + "mov%M4 %4,r5\n" \
- +" swap.w %3,r4\n" \
- +" swap.w r5,r6\n" \
- +" jsr @%5\n" \
- +" shll16 r6\n" \
- +" swap.w r4,r4\n" \
- +" jsr @%5\n" \
- +" swap.w r1,%0\n" \
- +" or r1,%0" \
- + : "=r" (q), "=&z" (r) \
- + : "1" (n1), "r" (n0), "rm" (d), "r" (&__udiv_qrnnd_16) \
- + : "r1", "r2", "r4", "r5", "r6", "pr"); \
- + } while (0)
- +
- +#define UDIV_TIME 80
- +
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("clrt;subc %5,%1; subc %4,%0" \
- + : "=r" (sh), "=r" (sl) \
- + : "0" (ah), "1" (al), "r" (bh), "r" (bl))
- +
- +#endif /* __sh__ */
- +
- +#if defined (__SH5__) && __SHMEDIA__ && W_TYPE_SIZE == 32
- +#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v)
- +#define count_leading_zeros(count, x) \
- + do \
- + { \
- + UDItype x_ = (USItype)(x); \
- + SItype c_; \
- + \
- + __asm__ ("nsb %1, %0" : "=r" (c_) : "r" (x_)); \
- + (count) = c_ - 31; \
- + } \
- + while (0)
- +#define COUNT_LEADING_ZEROS_0 32
- +#endif
- +
- +#if defined (__sparc__) && !defined (__arch64__) && !defined (__sparcv9) \
- + && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "%rJ" ((USItype) (ah)), \
- + "rI" ((USItype) (bh)), \
- + "%rJ" ((USItype) (al)), \
- + "rI" ((USItype) (bl)) \
- + __CLOBBER_CC)
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0" \
- + : "=r" ((USItype) (sh)), \
- + "=&r" ((USItype) (sl)) \
- + : "rJ" ((USItype) (ah)), \
- + "rI" ((USItype) (bh)), \
- + "rJ" ((USItype) (al)), \
- + "rI" ((USItype) (bl)) \
- + __CLOBBER_CC)
- +#if defined (__sparc_v8__)
- +#define umul_ppmm(w1, w0, u, v) \
- + __asm__ ("umul %2,%3,%1;rd %%y,%0" \
- + : "=r" ((USItype) (w1)), \
- + "=r" ((USItype) (w0)) \
- + : "r" ((USItype) (u)), \
- + "r" ((USItype) (v)))
- +#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
- + __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\
- + : "=&r" ((USItype) (__q)), \
- + "=&r" ((USItype) (__r)) \
- + : "r" ((USItype) (__n1)), \
- + "r" ((USItype) (__n0)), \
- + "r" ((USItype) (__d)))
- +#else
- +#if defined (__sparclite__)
- +/* This has hardware multiply but not divide. It also has two additional
- + instructions scan (ffs from high bit) and divscc. */
- +#define umul_ppmm(w1, w0, u, v) \
- + __asm__ ("umul %2,%3,%1;rd %%y,%0" \
- + : "=r" ((USItype) (w1)), \
- + "=r" ((USItype) (w0)) \
- + : "r" ((USItype) (u)), \
- + "r" ((USItype) (v)))
- +#define udiv_qrnnd(q, r, n1, n0, d) \
- + __asm__ ("! Inlined udiv_qrnnd\n" \
- +" wr %%g0,%2,%%y ! Not a delayed write for sparclite\n" \
- +" tst %%g0\n" \
- +" divscc %3,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%%g1\n" \
- +" divscc %%g1,%4,%0\n" \
- +" rd %%y,%1\n" \
- +" bl,a 1f\n" \
- +" add %1,%4,%1\n" \
- +"1: ! End of inline udiv_qrnnd" \
- + : "=r" ((USItype) (q)), \
- + "=r" ((USItype) (r)) \
- + : "r" ((USItype) (n1)), \
- + "r" ((USItype) (n0)), \
- + "rI" ((USItype) (d)) \
- + : "g1" __AND_CLOBBER_CC)
- +#define UDIV_TIME 37
- +#define count_leading_zeros(count, x) \
- + do { \
- + __asm__ ("scan %1,1,%0" \
- + : "=r" ((USItype) (count)) \
- + : "r" ((USItype) (x))); \
- + } while (0)
- +/* Early sparclites return 63 for an argument of 0, but they warn that future
- + implementations might change this. Therefore, leave COUNT_LEADING_ZEROS_0
- + undefined. */
- +#else
- +/* SPARC without integer multiplication and divide instructions.
- + (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */
- +#define umul_ppmm(w1, w0, u, v) \
- + __asm__ ("! Inlined umul_ppmm\n" \
- +" wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n"\
- +" sra %3,31,%%o5 ! Don't move this insn\n" \
- +" and %2,%%o5,%%o5 ! Don't move this insn\n" \
- +" andcc %%g0,0,%%g1 ! Don't move this insn\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,%3,%%g1\n" \
- +" mulscc %%g1,0,%%g1\n" \
- +" add %%g1,%%o5,%0\n" \
- +" rd %%y,%1" \
- + : "=r" ((USItype) (w1)), \
- + "=r" ((USItype) (w0)) \
- + : "%rI" ((USItype) (u)), \
- + "r" ((USItype) (v)) \
- + : "g1", "o5" __AND_CLOBBER_CC)
- +#define UMUL_TIME 39 /* 39 instructions */
- +/* It's quite necessary to add this much assembler for the sparc.
- + The default udiv_qrnnd (in C) is more than 10 times slower! */
- +#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
- + __asm__ ("! Inlined udiv_qrnnd\n" \
- +" mov 32,%%g1\n" \
- +" subcc %1,%2,%%g0\n" \
- +"1: bcs 5f\n" \
- +" addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \
- +" sub %1,%2,%1 ! this kills msb of n\n" \
- +" addx %1,%1,%1 ! so this can't give carry\n" \
- +" subcc %%g1,1,%%g1\n" \
- +"2: bne 1b\n" \
- +" subcc %1,%2,%%g0\n" \
- +" bcs 3f\n" \
- +" addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \
- +" b 3f\n" \
- +" sub %1,%2,%1 ! this kills msb of n\n" \
- +"4: sub %1,%2,%1\n" \
- +"5: addxcc %1,%1,%1\n" \
- +" bcc 2b\n" \
- +" subcc %%g1,1,%%g1\n" \
- +"! Got carry from n. Subtract next step to cancel this carry.\n" \
- +" bne 4b\n" \
- +" addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n" \
- +" sub %1,%2,%1\n" \
- +"3: xnor %0,0,%0\n" \
- +" ! End of inline udiv_qrnnd" \
- + : "=&r" ((USItype) (__q)), \
- + "=&r" ((USItype) (__r)) \
- + : "r" ((USItype) (__d)), \
- + "1" ((USItype) (__n1)), \
- + "0" ((USItype) (__n0)) : "g1" __AND_CLOBBER_CC)
- +#define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */
- +#endif /* __sparclite__ */
- +#endif /* __sparc_v8__ */
- +#endif /* sparc32 */
- +
- +#if ((defined (__sparc__) && defined (__arch64__)) || defined (__sparcv9)) \
- + && W_TYPE_SIZE == 64
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("addcc %r4,%5,%1\n\t" \
- + "add %r2,%3,%0\n\t" \
- + "bcs,a,pn %%xcc, 1f\n\t" \
- + "add %0, 1, %0\n" \
- + "1:" \
- + : "=r" ((UDItype)(sh)), \
- + "=&r" ((UDItype)(sl)) \
- + : "%rJ" ((UDItype)(ah)), \
- + "rI" ((UDItype)(bh)), \
- + "%rJ" ((UDItype)(al)), \
- + "rI" ((UDItype)(bl)) \
- + __CLOBBER_CC)
- +
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("subcc %r4,%5,%1\n\t" \
- + "sub %r2,%3,%0\n\t" \
- + "bcs,a,pn %%xcc, 1f\n\t" \
- + "sub %0, 1, %0\n\t" \
- + "1:" \
- + : "=r" ((UDItype)(sh)), \
- + "=&r" ((UDItype)(sl)) \
- + : "rJ" ((UDItype)(ah)), \
- + "rI" ((UDItype)(bh)), \
- + "rJ" ((UDItype)(al)), \
- + "rI" ((UDItype)(bl)) \
- + __CLOBBER_CC)
- +
- +#define umul_ppmm(wh, wl, u, v) \
- + do { \
- + UDItype tmp1, tmp2, tmp3, tmp4; \
- + __asm__ __volatile__ ( \
- + "srl %7,0,%3\n\t" \
- + "mulx %3,%6,%1\n\t" \
- + "srlx %6,32,%2\n\t" \
- + "mulx %2,%3,%4\n\t" \
- + "sllx %4,32,%5\n\t" \
- + "srl %6,0,%3\n\t" \
- + "sub %1,%5,%5\n\t" \
- + "srlx %5,32,%5\n\t" \
- + "addcc %4,%5,%4\n\t" \
- + "srlx %7,32,%5\n\t" \
- + "mulx %3,%5,%3\n\t" \
- + "mulx %2,%5,%5\n\t" \
- + "sethi %%hi(0x80000000),%2\n\t" \
- + "addcc %4,%3,%4\n\t" \
- + "srlx %4,32,%4\n\t" \
- + "add %2,%2,%2\n\t" \
- + "movcc %%xcc,%%g0,%2\n\t" \
- + "addcc %5,%4,%5\n\t" \
- + "sllx %3,32,%3\n\t" \
- + "add %1,%3,%1\n\t" \
- + "add %5,%2,%0" \
- + : "=r" ((UDItype)(wh)), \
- + "=&r" ((UDItype)(wl)), \
- + "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \
- + : "r" ((UDItype)(u)), \
- + "r" ((UDItype)(v)) \
- + __CLOBBER_CC); \
- + } while (0)
- +#define UMUL_TIME 96
- +#define UDIV_TIME 230
- +#endif /* sparc64 */
- +
- +#if defined (__vax__) && W_TYPE_SIZE == 32
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("addl2 %5,%1\n\tadwc %3,%0" \
- + : "=g" ((USItype) (sh)), \
- + "=&g" ((USItype) (sl)) \
- + : "%0" ((USItype) (ah)), \
- + "g" ((USItype) (bh)), \
- + "%1" ((USItype) (al)), \
- + "g" ((USItype) (bl)))
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("subl2 %5,%1\n\tsbwc %3,%0" \
- + : "=g" ((USItype) (sh)), \
- + "=&g" ((USItype) (sl)) \
- + : "0" ((USItype) (ah)), \
- + "g" ((USItype) (bh)), \
- + "1" ((USItype) (al)), \
- + "g" ((USItype) (bl)))
- +#define umul_ppmm(xh, xl, m0, m1) \
- + do { \
- + union { \
- + UDItype __ll; \
- + struct {USItype __l, __h;} __i; \
- + } __xx; \
- + USItype __m0 = (m0), __m1 = (m1); \
- + __asm__ ("emul %1,%2,$0,%0" \
- + : "=r" (__xx.__ll) \
- + : "g" (__m0), \
- + "g" (__m1)); \
- + (xh) = __xx.__i.__h; \
- + (xl) = __xx.__i.__l; \
- + (xh) += ((((SItype) __m0 >> 31) & __m1) \
- + + (((SItype) __m1 >> 31) & __m0)); \
- + } while (0)
- +#define sdiv_qrnnd(q, r, n1, n0, d) \
- + do { \
- + union {DItype __ll; \
- + struct {SItype __l, __h;} __i; \
- + } __xx; \
- + __xx.__i.__h = n1; __xx.__i.__l = n0; \
- + __asm__ ("ediv %3,%2,%0,%1" \
- + : "=g" (q), "=g" (r) \
- + : "g" (__xx.__ll), "g" (d)); \
- + } while (0)
- +#endif /* __vax__ */
- +
- +#if defined (__xtensa__) && W_TYPE_SIZE == 32
- +/* This code is not Xtensa-configuration-specific, so rely on the compiler
- + to expand builtin functions depending on what configuration features
- + are available. This avoids library calls when the operation can be
- + performed in-line. */
- +#define umul_ppmm(w1, w0, u, v) \
- + do { \
- + DWunion __w; \
- + __w.ll = __builtin_umulsidi3 (u, v); \
- + w1 = __w.s.high; \
- + w0 = __w.s.low; \
- + } while (0)
- +#define __umulsidi3(u, v) __builtin_umulsidi3 (u, v)
- +#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X))
- +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctz (X))
- +#endif /* __xtensa__ */
- +
- +#if defined (__z8000__) && W_TYPE_SIZE == 16
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + __asm__ ("add %H1,%H5\n\tadc %H0,%H3" \
- + : "=r" ((unsigned int)(sh)), \
- + "=&r" ((unsigned int)(sl)) \
- + : "%0" ((unsigned int)(ah)), \
- + "r" ((unsigned int)(bh)), \
- + "%1" ((unsigned int)(al)), \
- + "rQR" ((unsigned int)(bl)))
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + __asm__ ("sub %H1,%H5\n\tsbc %H0,%H3" \
- + : "=r" ((unsigned int)(sh)), \
- + "=&r" ((unsigned int)(sl)) \
- + : "0" ((unsigned int)(ah)), \
- + "r" ((unsigned int)(bh)), \
- + "1" ((unsigned int)(al)), \
- + "rQR" ((unsigned int)(bl)))
- +#define umul_ppmm(xh, xl, m0, m1) \
- + do { \
- + union {long int __ll; \
- + struct {unsigned int __h, __l;} __i; \
- + } __xx; \
- + unsigned int __m0 = (m0), __m1 = (m1); \
- + __asm__ ("mult %S0,%H3" \
- + : "=r" (__xx.__i.__h), \
- + "=r" (__xx.__i.__l) \
- + : "%1" (__m0), \
- + "rQR" (__m1)); \
- + (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
- + (xh) += ((((signed int) __m0 >> 15) & __m1) \
- + + (((signed int) __m1 >> 15) & __m0)); \
- + } while (0)
- +#endif /* __z8000__ */
- +
- +#endif /* __GNUC__ */
- +
- +/* If this machine has no inline assembler, use C macros. */
- +
- +#if !defined (add_ssaaaa)
- +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
- + do { \
- + UWtype __x; \
- + __x = (al) + (bl); \
- + (sh) = (ah) + (bh) + (__x < (al)); \
- + (sl) = __x; \
- + } while (0)
- +#endif
- +
- +#if !defined (sub_ddmmss)
- +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
- + do { \
- + UWtype __x; \
- + __x = (al) - (bl); \
- + (sh) = (ah) - (bh) - (__x > (al)); \
- + (sl) = __x; \
- + } while (0)
- +#endif
- +
- +/* If we lack umul_ppmm but have smul_ppmm, define umul_ppmm in terms of
- + smul_ppmm. */
- +#if !defined (umul_ppmm) && defined (smul_ppmm)
- +#define umul_ppmm(w1, w0, u, v) \
- + do { \
- + UWtype __w1; \
- + UWtype __xm0 = (u), __xm1 = (v); \
- + smul_ppmm (__w1, w0, __xm0, __xm1); \
- + (w1) = __w1 + (-(__xm0 >> (W_TYPE_SIZE - 1)) & __xm1) \
- + + (-(__xm1 >> (W_TYPE_SIZE - 1)) & __xm0); \
- + } while (0)
- +#endif
- +
- +/* If we still don't have umul_ppmm, define it using plain C. */
- +#if !defined (umul_ppmm)
- +#define umul_ppmm(w1, w0, u, v) \
- + do { \
- + UWtype __x0, __x1, __x2, __x3; \
- + UHWtype __ul, __vl, __uh, __vh; \
- + \
- + __ul = __ll_lowpart (u); \
- + __uh = __ll_highpart (u); \
- + __vl = __ll_lowpart (v); \
- + __vh = __ll_highpart (v); \
- + \
- + __x0 = (UWtype) __ul * __vl; \
- + __x1 = (UWtype) __ul * __vh; \
- + __x2 = (UWtype) __uh * __vl; \
- + __x3 = (UWtype) __uh * __vh; \
- + \
- + __x1 += __ll_highpart (__x0);/* this can't give carry */ \
- + __x1 += __x2; /* but this indeed can */ \
- + if (__x1 < __x2) /* did we get it? */ \
- + __x3 += __ll_B; /* yes, add it in the proper pos. */ \
- + \
- + (w1) = __x3 + __ll_highpart (__x1); \
- + (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0); \
- + } while (0)
- +#endif
- +
- +#if !defined (__umulsidi3)
- +#define __umulsidi3(u, v) \
- + ({DWunion __w; \
- + umul_ppmm (__w.s.high, __w.s.low, u, v); \
- + __w.ll; })
- +#endif
- +
- +/* Define this unconditionally, so it can be used for debugging. */
- +#define __udiv_qrnnd_c(q, r, n1, n0, d) \
- + do { \
- + UWtype __d1, __d0, __q1, __q0; \
- + UWtype __r1, __r0, __m; \
- + __d1 = __ll_highpart (d); \
- + __d0 = __ll_lowpart (d); \
- + \
- + __r1 = (n1) % __d1; \
- + __q1 = (n1) / __d1; \
- + __m = (UWtype) __q1 * __d0; \
- + __r1 = __r1 * __ll_B | __ll_highpart (n0); \
- + if (__r1 < __m) \
- + { \
- + __q1--, __r1 += (d); \
- + if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
- + if (__r1 < __m) \
- + __q1--, __r1 += (d); \
- + } \
- + __r1 -= __m; \
- + \
- + __r0 = __r1 % __d1; \
- + __q0 = __r1 / __d1; \
- + __m = (UWtype) __q0 * __d0; \
- + __r0 = __r0 * __ll_B | __ll_lowpart (n0); \
- + if (__r0 < __m) \
- + { \
- + __q0--, __r0 += (d); \
- + if (__r0 >= (d)) \
- + if (__r0 < __m) \
- + __q0--, __r0 += (d); \
- + } \
- + __r0 -= __m; \
- + \
- + (q) = (UWtype) __q1 * __ll_B | __q0; \
- + (r) = __r0; \
- + } while (0)
- +
- +/* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through
- + __udiv_w_sdiv (defined in libgcc or elsewhere). */
- +#if !defined (udiv_qrnnd) && defined (sdiv_qrnnd)
- +#define udiv_qrnnd(q, r, nh, nl, d) \
- + do { \
- + USItype __r; \
- + (q) = __udiv_w_sdiv (&__r, nh, nl, d); \
- + (r) = __r; \
- + } while (0)
- +#endif
- +
- +/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c. */
- +#if !defined (udiv_qrnnd)
- +#define UDIV_NEEDS_NORMALIZATION 1
- +#define udiv_qrnnd __udiv_qrnnd_c
- +#endif
- +
- +#if !defined (count_leading_zeros)
- +#define count_leading_zeros(count, x) \
- + do { \
- + UWtype __xr = (x); \
- + UWtype __a; \
- + \
- + if (W_TYPE_SIZE <= 32) \
- + { \
- + __a = __xr < ((UWtype)1<<2*__BITS4) \
- + ? (__xr < ((UWtype)1<<__BITS4) ? 0 : __BITS4) \
- + : (__xr < ((UWtype)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \
- + } \
- + else \
- + { \
- + for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8) \
- + if (((__xr >> __a) & 0xff) != 0) \
- + break; \
- + } \
- + \
- + (count) = W_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \
- + } while (0)
- +#define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE
- +#endif
- +
- +#if !defined (count_trailing_zeros)
- +/* Define count_trailing_zeros using count_leading_zeros. The latter might be
- + defined in asm, but if it is not, the C version above is good enough. */
- +#define count_trailing_zeros(count, x) \
- + do { \
- + UWtype __ctz_x = (x); \
- + UWtype __ctz_c; \
- + count_leading_zeros (__ctz_c, __ctz_x & -__ctz_x); \
- + (count) = W_TYPE_SIZE - 1 - __ctz_c; \
- + } while (0)
- +#endif
- +
- +#ifndef UDIV_NEEDS_NORMALIZATION
- +#define UDIV_NEEDS_NORMALIZATION 0
- +#endif
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/mp_clz_tab.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/mp_clz_tab.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/mp_clz_tab.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/mp_clz_tab.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,37 @@
- +/* __clz_tab -- support for longlong.h
- + Copyright (C) 1991, 1993, 1994, 1997 Free Software Foundation, Inc.
- + This file is part of the GNU C Library. Its master source is NOT part of
- + the C library, however. The master source lives in the GNU MP Library.
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#if 0
- +#include <gmp.h>
- +#include "gmp-impl.h"
- +#endif
- +
- +const
- +unsigned char __clz_tab[] =
- +{
- + 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
- + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
- + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- +};
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/op-1.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/op-1.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/op-1.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/op-1.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,302 @@
- +/* Software floating-point emulation.
- + Basic one-word fraction declaration and manipulation.
- + Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com),
- + Jakub Jelinek (jj@ultra.linux.cz),
- + David S. Miller (davem@redhat.com) and
- + Peter Maydell (pmaydell@chiark.greenend.org.uk).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + In addition to the permissions in the GNU Lesser General Public
- + License, the Free Software Foundation gives you unlimited
- + permission to link the compiled version of this file into
- + combinations with other programs, and to distribute those
- + combinations without any restriction coming from the use of this
- + file. (The Lesser General Public License restrictions do apply in
- + other respects; for example, they cover modification of the file,
- + and distribution when not linked into a combine executable.)
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
- + MA 02110-1301, USA. */
- +
- +#define _FP_FRAC_DECL_1(X) _FP_W_TYPE X##_f
- +#define _FP_FRAC_COPY_1(D,S) (D##_f = S##_f)
- +#define _FP_FRAC_SET_1(X,I) (X##_f = I)
- +#define _FP_FRAC_HIGH_1(X) (X##_f)
- +#define _FP_FRAC_LOW_1(X) (X##_f)
- +#define _FP_FRAC_WORD_1(X,w) (X##_f)
- +
- +#define _FP_FRAC_ADDI_1(X,I) (X##_f += I)
- +#define _FP_FRAC_SLL_1(X,N) \
- + do { \
- + if (__builtin_constant_p(N) && (N) == 1) \
- + X##_f += X##_f; \
- + else \
- + X##_f <<= (N); \
- + } while (0)
- +#define _FP_FRAC_SRL_1(X,N) (X##_f >>= N)
- +
- +/* Right shift with sticky-lsb. */
- +#define _FP_FRAC_SRST_1(X,S,N,sz) __FP_FRAC_SRST_1(X##_f, S, N, sz)
- +#define _FP_FRAC_SRS_1(X,N,sz) __FP_FRAC_SRS_1(X##_f, N, sz)
- +
- +#define __FP_FRAC_SRST_1(X,S,N,sz) \
- +do { \
- + S = (__builtin_constant_p(N) && (N) == 1 \
- + ? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0); \
- + X = X >> (N); \
- +} while (0)
- +
- +#define __FP_FRAC_SRS_1(X,N,sz) \
- + (X = (X >> (N) | (__builtin_constant_p(N) && (N) == 1 \
- + ? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0)))
- +
- +#define _FP_FRAC_ADD_1(R,X,Y) (R##_f = X##_f + Y##_f)
- +#define _FP_FRAC_SUB_1(R,X,Y) (R##_f = X##_f - Y##_f)
- +#define _FP_FRAC_DEC_1(X,Y) (X##_f -= Y##_f)
- +#define _FP_FRAC_CLZ_1(z, X) __FP_CLZ(z, X##_f)
- +
- +/* Predicates */
- +#define _FP_FRAC_NEGP_1(X) ((_FP_WS_TYPE)X##_f < 0)
- +#define _FP_FRAC_ZEROP_1(X) (X##_f == 0)
- +#define _FP_FRAC_OVERP_1(fs,X) (X##_f & _FP_OVERFLOW_##fs)
- +#define _FP_FRAC_CLEAR_OVERP_1(fs,X) (X##_f &= ~_FP_OVERFLOW_##fs)
- +#define _FP_FRAC_EQ_1(X, Y) (X##_f == Y##_f)
- +#define _FP_FRAC_GE_1(X, Y) (X##_f >= Y##_f)
- +#define _FP_FRAC_GT_1(X, Y) (X##_f > Y##_f)
- +
- +#define _FP_ZEROFRAC_1 0
- +#define _FP_MINFRAC_1 1
- +#define _FP_MAXFRAC_1 (~(_FP_WS_TYPE)0)
- +
- +/*
- + * Unpack the raw bits of a native fp value. Do not classify or
- + * normalize the data.
- + */
- +
- +#define _FP_UNPACK_RAW_1(fs, X, val) \
- + do { \
- + union _FP_UNION_##fs _flo; _flo.flt = (val); \
- + \
- + X##_f = _flo.bits.frac; \
- + X##_e = _flo.bits.exp; \
- + X##_s = _flo.bits.sign; \
- + } while (0)
- +
- +#define _FP_UNPACK_RAW_1_P(fs, X, val) \
- + do { \
- + union _FP_UNION_##fs *_flo = \
- + (union _FP_UNION_##fs *)(val); \
- + \
- + X##_f = _flo->bits.frac; \
- + X##_e = _flo->bits.exp; \
- + X##_s = _flo->bits.sign; \
- + } while (0)
- +
- +/*
- + * Repack the raw bits of a native fp value.
- + */
- +
- +#define _FP_PACK_RAW_1(fs, val, X) \
- + do { \
- + union _FP_UNION_##fs _flo; \
- + \
- + _flo.bits.frac = X##_f; \
- + _flo.bits.exp = X##_e; \
- + _flo.bits.sign = X##_s; \
- + \
- + (val) = _flo.flt; \
- + } while (0)
- +
- +#define _FP_PACK_RAW_1_P(fs, val, X) \
- + do { \
- + union _FP_UNION_##fs *_flo = \
- + (union _FP_UNION_##fs *)(val); \
- + \
- + _flo->bits.frac = X##_f; \
- + _flo->bits.exp = X##_e; \
- + _flo->bits.sign = X##_s; \
- + } while (0)
- +
- +
- +/*
- + * Multiplication algorithms:
- + */
- +
- +/* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the
- + multiplication immediately. */
- +
- +#define _FP_MUL_MEAT_1_imm(wfracbits, R, X, Y) \
- + do { \
- + R##_f = X##_f * Y##_f; \
- + /* Normalize since we know where the msb of the multiplicands \
- + were (bit B), we know that the msb of the of the product is \
- + at either 2B or 2B-1. */ \
- + _FP_FRAC_SRS_1(R, wfracbits-1, 2*wfracbits); \
- + } while (0)
- +
- +/* Given a 1W * 1W => 2W primitive, do the extended multiplication. */
- +
- +#define _FP_MUL_MEAT_1_wide(wfracbits, R, X, Y, doit) \
- + do { \
- + _FP_W_TYPE _Z_f0, _Z_f1; \
- + doit(_Z_f1, _Z_f0, X##_f, Y##_f); \
- + /* Normalize since we know where the msb of the multiplicands \
- + were (bit B), we know that the msb of the of the product is \
- + at either 2B or 2B-1. */ \
- + _FP_FRAC_SRS_2(_Z, wfracbits-1, 2*wfracbits); \
- + R##_f = _Z_f0; \
- + } while (0)
- +
- +/* Finally, a simple widening multiply algorithm. What fun! */
- +
- +#define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y) \
- + do { \
- + _FP_W_TYPE _xh, _xl, _yh, _yl, _z_f0, _z_f1, _a_f0, _a_f1; \
- + \
- + /* split the words in half */ \
- + _xh = X##_f >> (_FP_W_TYPE_SIZE/2); \
- + _xl = X##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \
- + _yh = Y##_f >> (_FP_W_TYPE_SIZE/2); \
- + _yl = Y##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \
- + \
- + /* multiply the pieces */ \
- + _z_f0 = _xl * _yl; \
- + _a_f0 = _xh * _yl; \
- + _a_f1 = _xl * _yh; \
- + _z_f1 = _xh * _yh; \
- + \
- + /* reassemble into two full words */ \
- + if ((_a_f0 += _a_f1) < _a_f1) \
- + _z_f1 += (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2); \
- + _a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2); \
- + _a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2); \
- + _FP_FRAC_ADD_2(_z, _z, _a); \
- + \
- + /* normalize */ \
- + _FP_FRAC_SRS_2(_z, wfracbits - 1, 2*wfracbits); \
- + R##_f = _z_f0; \
- + } while (0)
- +
- +
- +/*
- + * Division algorithms:
- + */
- +
- +/* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the
- + division immediately. Give this macro either _FP_DIV_HELP_imm for
- + C primitives or _FP_DIV_HELP_ldiv for the ISO function. Which you
- + choose will depend on what the compiler does with divrem4. */
- +
- +#define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit) \
- + do { \
- + _FP_W_TYPE _q, _r; \
- + X##_f <<= (X##_f < Y##_f \
- + ? R##_e--, _FP_WFRACBITS_##fs \
- + : _FP_WFRACBITS_##fs - 1); \
- + doit(_q, _r, X##_f, Y##_f); \
- + R##_f = _q | (_r != 0); \
- + } while (0)
- +
- +/* GCC's longlong.h defines a 2W / 1W => (1W,1W) primitive udiv_qrnnd
- + that may be useful in this situation. This first is for a primitive
- + that requires normalization, the second for one that does not. Look
- + for UDIV_NEEDS_NORMALIZATION to tell which your machine needs. */
- +
- +#define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y) \
- + do { \
- + _FP_W_TYPE _nh, _nl, _q, _r, _y; \
- + \
- + /* Normalize Y -- i.e. make the most significant bit set. */ \
- + _y = Y##_f << _FP_WFRACXBITS_##fs; \
- + \
- + /* Shift X op correspondingly high, that is, up one full word. */ \
- + if (X##_f < Y##_f) \
- + { \
- + R##_e--; \
- + _nl = 0; \
- + _nh = X##_f; \
- + } \
- + else \
- + { \
- + _nl = X##_f << (_FP_W_TYPE_SIZE - 1); \
- + _nh = X##_f >> 1; \
- + } \
- + \
- + udiv_qrnnd(_q, _r, _nh, _nl, _y); \
- + R##_f = _q | (_r != 0); \
- + } while (0)
- +
- +#define _FP_DIV_MEAT_1_udiv(fs, R, X, Y) \
- + do { \
- + _FP_W_TYPE _nh, _nl, _q, _r; \
- + if (X##_f < Y##_f) \
- + { \
- + R##_e--; \
- + _nl = X##_f << _FP_WFRACBITS_##fs; \
- + _nh = X##_f >> _FP_WFRACXBITS_##fs; \
- + } \
- + else \
- + { \
- + _nl = X##_f << (_FP_WFRACBITS_##fs - 1); \
- + _nh = X##_f >> (_FP_WFRACXBITS_##fs + 1); \
- + } \
- + udiv_qrnnd(_q, _r, _nh, _nl, Y##_f); \
- + R##_f = _q | (_r != 0); \
- + } while (0)
- +
- +
- +/*
- + * Square root algorithms:
- + * We have just one right now, maybe Newton approximation
- + * should be added for those machines where division is fast.
- + */
- +
- +#define _FP_SQRT_MEAT_1(R, S, T, X, q) \
- + do { \
- + while (q != _FP_WORK_ROUND) \
- + { \
- + T##_f = S##_f + q; \
- + if (T##_f <= X##_f) \
- + { \
- + S##_f = T##_f + q; \
- + X##_f -= T##_f; \
- + R##_f += q; \
- + } \
- + _FP_FRAC_SLL_1(X, 1); \
- + q >>= 1; \
- + } \
- + if (X##_f) \
- + { \
- + if (S##_f < X##_f) \
- + R##_f |= _FP_WORK_ROUND; \
- + R##_f |= _FP_WORK_STICKY; \
- + } \
- + } while (0)
- +
- +/*
- + * Assembly/disassembly for converting to/from integral types.
- + * No shifting or overflow handled here.
- + */
- +
- +#define _FP_FRAC_ASSEMBLE_1(r, X, rsize) (r = X##_f)
- +#define _FP_FRAC_DISASSEMBLE_1(X, r, rsize) (X##_f = r)
- +
- +
- +/*
- + * Convert FP values between word sizes
- + */
- +
- +#define _FP_FRAC_COPY_1_1(D, S) (D##_f = S##_f)
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/op-2.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/op-2.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/op-2.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/op-2.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,617 @@
- +/* Software floating-point emulation.
- + Basic two-word fraction declaration and manipulation.
- + Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com),
- + Jakub Jelinek (jj@ultra.linux.cz),
- + David S. Miller (davem@redhat.com) and
- + Peter Maydell (pmaydell@chiark.greenend.org.uk).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + In addition to the permissions in the GNU Lesser General Public
- + License, the Free Software Foundation gives you unlimited
- + permission to link the compiled version of this file into
- + combinations with other programs, and to distribute those
- + combinations without any restriction coming from the use of this
- + file. (The Lesser General Public License restrictions do apply in
- + other respects; for example, they cover modification of the file,
- + and distribution when not linked into a combine executable.)
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
- + MA 02110-1301, USA. */
- +
- +#define _FP_FRAC_DECL_2(X) _FP_W_TYPE X##_f0, X##_f1
- +#define _FP_FRAC_COPY_2(D,S) (D##_f0 = S##_f0, D##_f1 = S##_f1)
- +#define _FP_FRAC_SET_2(X,I) __FP_FRAC_SET_2(X, I)
- +#define _FP_FRAC_HIGH_2(X) (X##_f1)
- +#define _FP_FRAC_LOW_2(X) (X##_f0)
- +#define _FP_FRAC_WORD_2(X,w) (X##_f##w)
- +
- +#define _FP_FRAC_SLL_2(X,N) \
- +(void)(((N) < _FP_W_TYPE_SIZE) \
- + ? ({ \
- + if (__builtin_constant_p(N) && (N) == 1) \
- + { \
- + X##_f1 = X##_f1 + X##_f1 + (((_FP_WS_TYPE)(X##_f0)) < 0); \
- + X##_f0 += X##_f0; \
- + } \
- + else \
- + { \
- + X##_f1 = X##_f1 << (N) | X##_f0 >> (_FP_W_TYPE_SIZE - (N)); \
- + X##_f0 <<= (N); \
- + } \
- + 0; \
- + }) \
- + : ({ \
- + X##_f1 = X##_f0 << ((N) - _FP_W_TYPE_SIZE); \
- + X##_f0 = 0; \
- + }))
- +
- +
- +#define _FP_FRAC_SRL_2(X,N) \
- +(void)(((N) < _FP_W_TYPE_SIZE) \
- + ? ({ \
- + X##_f0 = X##_f0 >> (N) | X##_f1 << (_FP_W_TYPE_SIZE - (N)); \
- + X##_f1 >>= (N); \
- + }) \
- + : ({ \
- + X##_f0 = X##_f1 >> ((N) - _FP_W_TYPE_SIZE); \
- + X##_f1 = 0; \
- + }))
- +
- +/* Right shift with sticky-lsb. */
- +#define _FP_FRAC_SRST_2(X,S, N,sz) \
- +(void)(((N) < _FP_W_TYPE_SIZE) \
- + ? ({ \
- + S = (__builtin_constant_p(N) && (N) == 1 \
- + ? X##_f0 & 1 \
- + : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0); \
- + X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N)); \
- + X##_f1 >>= (N); \
- + }) \
- + : ({ \
- + S = ((((N) == _FP_W_TYPE_SIZE \
- + ? 0 \
- + : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N)))) \
- + | X##_f0) != 0); \
- + X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE)); \
- + X##_f1 = 0; \
- + }))
- +
- +#define _FP_FRAC_SRS_2(X,N,sz) \
- +(void)(((N) < _FP_W_TYPE_SIZE) \
- + ? ({ \
- + X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) | \
- + (__builtin_constant_p(N) && (N) == 1 \
- + ? X##_f0 & 1 \
- + : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0)); \
- + X##_f1 >>= (N); \
- + }) \
- + : ({ \
- + X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) | \
- + ((((N) == _FP_W_TYPE_SIZE \
- + ? 0 \
- + : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N)))) \
- + | X##_f0) != 0)); \
- + X##_f1 = 0; \
- + }))
- +
- +#define _FP_FRAC_ADDI_2(X,I) \
- + __FP_FRAC_ADDI_2(X##_f1, X##_f0, I)
- +
- +#define _FP_FRAC_ADD_2(R,X,Y) \
- + __FP_FRAC_ADD_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0)
- +
- +#define _FP_FRAC_SUB_2(R,X,Y) \
- + __FP_FRAC_SUB_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0)
- +
- +#define _FP_FRAC_DEC_2(X,Y) \
- + __FP_FRAC_DEC_2(X##_f1, X##_f0, Y##_f1, Y##_f0)
- +
- +#define _FP_FRAC_CLZ_2(R,X) \
- + do { \
- + if (X##_f1) \
- + __FP_CLZ(R,X##_f1); \
- + else \
- + { \
- + __FP_CLZ(R,X##_f0); \
- + R += _FP_W_TYPE_SIZE; \
- + } \
- + } while(0)
- +
- +/* Predicates */
- +#define _FP_FRAC_NEGP_2(X) ((_FP_WS_TYPE)X##_f1 < 0)
- +#define _FP_FRAC_ZEROP_2(X) ((X##_f1 | X##_f0) == 0)
- +#define _FP_FRAC_OVERP_2(fs,X) (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
- +#define _FP_FRAC_CLEAR_OVERP_2(fs,X) (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
- +#define _FP_FRAC_EQ_2(X, Y) (X##_f1 == Y##_f1 && X##_f0 == Y##_f0)
- +#define _FP_FRAC_GT_2(X, Y) \
- + (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##_f0 > Y##_f0))
- +#define _FP_FRAC_GE_2(X, Y) \
- + (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##_f0 >= Y##_f0))
- +
- +#define _FP_ZEROFRAC_2 0, 0
- +#define _FP_MINFRAC_2 0, 1
- +#define _FP_MAXFRAC_2 (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0)
- +
- +/*
- + * Internals
- + */
- +
- +#define __FP_FRAC_SET_2(X,I1,I0) (X##_f0 = I0, X##_f1 = I1)
- +
- +#define __FP_CLZ_2(R, xh, xl) \
- + do { \
- + if (xh) \
- + __FP_CLZ(R,xh); \
- + else \
- + { \
- + __FP_CLZ(R,xl); \
- + R += _FP_W_TYPE_SIZE; \
- + } \
- + } while(0)
- +
- +#if 0
- +
- +#ifndef __FP_FRAC_ADDI_2
- +#define __FP_FRAC_ADDI_2(xh, xl, i) \
- + (xh += ((xl += i) < i))
- +#endif
- +#ifndef __FP_FRAC_ADD_2
- +#define __FP_FRAC_ADD_2(rh, rl, xh, xl, yh, yl) \
- + (rh = xh + yh + ((rl = xl + yl) < xl))
- +#endif
- +#ifndef __FP_FRAC_SUB_2
- +#define __FP_FRAC_SUB_2(rh, rl, xh, xl, yh, yl) \
- + (rh = xh - yh - ((rl = xl - yl) > xl))
- +#endif
- +#ifndef __FP_FRAC_DEC_2
- +#define __FP_FRAC_DEC_2(xh, xl, yh, yl) \
- + do { \
- + UWtype _t = xl; \
- + xh -= yh + ((xl -= yl) > _t); \
- + } while (0)
- +#endif
- +
- +#else
- +
- +#undef __FP_FRAC_ADDI_2
- +#define __FP_FRAC_ADDI_2(xh, xl, i) add_ssaaaa(xh, xl, xh, xl, 0, i)
- +#undef __FP_FRAC_ADD_2
- +#define __FP_FRAC_ADD_2 add_ssaaaa
- +#undef __FP_FRAC_SUB_2
- +#define __FP_FRAC_SUB_2 sub_ddmmss
- +#undef __FP_FRAC_DEC_2
- +#define __FP_FRAC_DEC_2(xh, xl, yh, yl) sub_ddmmss(xh, xl, xh, xl, yh, yl)
- +
- +#endif
- +
- +/*
- + * Unpack the raw bits of a native fp value. Do not classify or
- + * normalize the data.
- + */
- +
- +#define _FP_UNPACK_RAW_2(fs, X, val) \
- + do { \
- + union _FP_UNION_##fs _flo; _flo.flt = (val); \
- + \
- + X##_f0 = _flo.bits.frac0; \
- + X##_f1 = _flo.bits.frac1; \
- + X##_e = _flo.bits.exp; \
- + X##_s = _flo.bits.sign; \
- + } while (0)
- +
- +#define _FP_UNPACK_RAW_2_P(fs, X, val) \
- + do { \
- + union _FP_UNION_##fs *_flo = \
- + (union _FP_UNION_##fs *)(val); \
- + \
- + X##_f0 = _flo->bits.frac0; \
- + X##_f1 = _flo->bits.frac1; \
- + X##_e = _flo->bits.exp; \
- + X##_s = _flo->bits.sign; \
- + } while (0)
- +
- +
- +/*
- + * Repack the raw bits of a native fp value.
- + */
- +
- +#define _FP_PACK_RAW_2(fs, val, X) \
- + do { \
- + union _FP_UNION_##fs _flo; \
- + \
- + _flo.bits.frac0 = X##_f0; \
- + _flo.bits.frac1 = X##_f1; \
- + _flo.bits.exp = X##_e; \
- + _flo.bits.sign = X##_s; \
- + \
- + (val) = _flo.flt; \
- + } while (0)
- +
- +#define _FP_PACK_RAW_2_P(fs, val, X) \
- + do { \
- + union _FP_UNION_##fs *_flo = \
- + (union _FP_UNION_##fs *)(val); \
- + \
- + _flo->bits.frac0 = X##_f0; \
- + _flo->bits.frac1 = X##_f1; \
- + _flo->bits.exp = X##_e; \
- + _flo->bits.sign = X##_s; \
- + } while (0)
- +
- +
- +/*
- + * Multiplication algorithms:
- + */
- +
- +/* Given a 1W * 1W => 2W primitive, do the extended multiplication. */
- +
- +#define _FP_MUL_MEAT_2_wide(wfracbits, R, X, Y, doit) \
- + do { \
- + _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c); \
- + \
- + doit(_FP_FRAC_WORD_4(_z,1), _FP_FRAC_WORD_4(_z,0), X##_f0, Y##_f0); \
- + doit(_b_f1, _b_f0, X##_f0, Y##_f1); \
- + doit(_c_f1, _c_f0, X##_f1, Y##_f0); \
- + doit(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2), X##_f1, Y##_f1); \
- + \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \
- + _FP_FRAC_WORD_4(_z,1), 0, _b_f1, _b_f0, \
- + _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \
- + _FP_FRAC_WORD_4(_z,1)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \
- + _FP_FRAC_WORD_4(_z,1), 0, _c_f1, _c_f0, \
- + _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \
- + _FP_FRAC_WORD_4(_z,1)); \
- + \
- + /* Normalize since we know where the msb of the multiplicands \
- + were (bit B), we know that the msb of the of the product is \
- + at either 2B or 2B-1. */ \
- + _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits); \
- + R##_f0 = _FP_FRAC_WORD_4(_z,0); \
- + R##_f1 = _FP_FRAC_WORD_4(_z,1); \
- + } while (0)
- +
- +/* Given a 1W * 1W => 2W primitive, do the extended multiplication.
- + Do only 3 multiplications instead of four. This one is for machines
- + where multiplication is much more expensive than subtraction. */
- +
- +#define _FP_MUL_MEAT_2_wide_3mul(wfracbits, R, X, Y, doit) \
- + do { \
- + _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c); \
- + _FP_W_TYPE _d; \
- + int _c1, _c2; \
- + \
- + _b_f0 = X##_f0 + X##_f1; \
- + _c1 = _b_f0 < X##_f0; \
- + _b_f1 = Y##_f0 + Y##_f1; \
- + _c2 = _b_f1 < Y##_f0; \
- + doit(_d, _FP_FRAC_WORD_4(_z,0), X##_f0, Y##_f0); \
- + doit(_FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_4(_z,1), _b_f0, _b_f1); \
- + doit(_c_f1, _c_f0, X##_f1, Y##_f1); \
- + \
- + _b_f0 &= -_c2; \
- + _b_f1 &= -_c1; \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \
- + _FP_FRAC_WORD_4(_z,1), (_c1 & _c2), 0, _d, \
- + 0, _FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_4(_z,1)); \
- + __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \
- + _b_f0); \
- + __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \
- + _b_f1); \
- + __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \
- + _FP_FRAC_WORD_4(_z,1), \
- + 0, _d, _FP_FRAC_WORD_4(_z,0)); \
- + __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \
- + _FP_FRAC_WORD_4(_z,1), 0, _c_f1, _c_f0); \
- + __FP_FRAC_ADD_2(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2), \
- + _c_f1, _c_f0, \
- + _FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2)); \
- + \
- + /* Normalize since we know where the msb of the multiplicands \
- + were (bit B), we know that the msb of the of the product is \
- + at either 2B or 2B-1. */ \
- + _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits); \
- + R##_f0 = _FP_FRAC_WORD_4(_z,0); \
- + R##_f1 = _FP_FRAC_WORD_4(_z,1); \
- + } while (0)
- +
- +#define _FP_MUL_MEAT_2_gmp(wfracbits, R, X, Y) \
- + do { \
- + _FP_FRAC_DECL_4(_z); \
- + _FP_W_TYPE _x[2], _y[2]; \
- + _x[0] = X##_f0; _x[1] = X##_f1; \
- + _y[0] = Y##_f0; _y[1] = Y##_f1; \
- + \
- + mpn_mul_n(_z_f, _x, _y, 2); \
- + \
- + /* Normalize since we know where the msb of the multiplicands \
- + were (bit B), we know that the msb of the of the product is \
- + at either 2B or 2B-1. */ \
- + _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits); \
- + R##_f0 = _z_f[0]; \
- + R##_f1 = _z_f[1]; \
- + } while (0)
- +
- +/* Do at most 120x120=240 bits multiplication using double floating
- + point multiplication. This is useful if floating point
- + multiplication has much bigger throughput than integer multiply.
- + It is supposed to work for _FP_W_TYPE_SIZE 64 and wfracbits
- + between 106 and 120 only.
- + Caller guarantees that X and Y has (1LLL << (wfracbits - 1)) set.
- + SETFETZ is a macro which will disable all FPU exceptions and set rounding
- + towards zero, RESETFE should optionally reset it back. */
- +
- +#define _FP_MUL_MEAT_2_120_240_double(wfracbits, R, X, Y, setfetz, resetfe) \
- + do { \
- + static const double _const[] = { \
- + /* 2^-24 */ 5.9604644775390625e-08, \
- + /* 2^-48 */ 3.5527136788005009e-15, \
- + /* 2^-72 */ 2.1175823681357508e-22, \
- + /* 2^-96 */ 1.2621774483536189e-29, \
- + /* 2^28 */ 2.68435456e+08, \
- + /* 2^4 */ 1.600000e+01, \
- + /* 2^-20 */ 9.5367431640625e-07, \
- + /* 2^-44 */ 5.6843418860808015e-14, \
- + /* 2^-68 */ 3.3881317890172014e-21, \
- + /* 2^-92 */ 2.0194839173657902e-28, \
- + /* 2^-116 */ 1.2037062152420224e-35}; \
- + double _a240, _b240, _c240, _d240, _e240, _f240, \
- + _g240, _h240, _i240, _j240, _k240; \
- + union { double d; UDItype i; } _l240, _m240, _n240, _o240, \
- + _p240, _q240, _r240, _s240; \
- + UDItype _t240, _u240, _v240, _w240, _x240, _y240 = 0; \
- + \
- + if (wfracbits < 106 || wfracbits > 120) \
- + abort(); \
- + \
- + setfetz; \
- + \
- + _e240 = (double)(long)(X##_f0 & 0xffffff); \
- + _j240 = (double)(long)(Y##_f0 & 0xffffff); \
- + _d240 = (double)(long)((X##_f0 >> 24) & 0xffffff); \
- + _i240 = (double)(long)((Y##_f0 >> 24) & 0xffffff); \
- + _c240 = (double)(long)(((X##_f1 << 16) & 0xffffff) | (X##_f0 >> 48)); \
- + _h240 = (double)(long)(((Y##_f1 << 16) & 0xffffff) | (Y##_f0 >> 48)); \
- + _b240 = (double)(long)((X##_f1 >> 8) & 0xffffff); \
- + _g240 = (double)(long)((Y##_f1 >> 8) & 0xffffff); \
- + _a240 = (double)(long)(X##_f1 >> 32); \
- + _f240 = (double)(long)(Y##_f1 >> 32); \
- + _e240 *= _const[3]; \
- + _j240 *= _const[3]; \
- + _d240 *= _const[2]; \
- + _i240 *= _const[2]; \
- + _c240 *= _const[1]; \
- + _h240 *= _const[1]; \
- + _b240 *= _const[0]; \
- + _g240 *= _const[0]; \
- + _s240.d = _e240*_j240;\
- + _r240.d = _d240*_j240 + _e240*_i240;\
- + _q240.d = _c240*_j240 + _d240*_i240 + _e240*_h240;\
- + _p240.d = _b240*_j240 + _c240*_i240 + _d240*_h240 + _e240*_g240;\
- + _o240.d = _a240*_j240 + _b240*_i240 + _c240*_h240 + _d240*_g240 + _e240*_f240;\
- + _n240.d = _a240*_i240 + _b240*_h240 + _c240*_g240 + _d240*_f240; \
- + _m240.d = _a240*_h240 + _b240*_g240 + _c240*_f240; \
- + _l240.d = _a240*_g240 + _b240*_f240; \
- + _k240 = _a240*_f240; \
- + _r240.d += _s240.d; \
- + _q240.d += _r240.d; \
- + _p240.d += _q240.d; \
- + _o240.d += _p240.d; \
- + _n240.d += _o240.d; \
- + _m240.d += _n240.d; \
- + _l240.d += _m240.d; \
- + _k240 += _l240.d; \
- + _s240.d -= ((_const[10]+_s240.d)-_const[10]); \
- + _r240.d -= ((_const[9]+_r240.d)-_const[9]); \
- + _q240.d -= ((_const[8]+_q240.d)-_const[8]); \
- + _p240.d -= ((_const[7]+_p240.d)-_const[7]); \
- + _o240.d += _const[7]; \
- + _n240.d += _const[6]; \
- + _m240.d += _const[5]; \
- + _l240.d += _const[4]; \
- + if (_s240.d != 0.0) _y240 = 1; \
- + if (_r240.d != 0.0) _y240 = 1; \
- + if (_q240.d != 0.0) _y240 = 1; \
- + if (_p240.d != 0.0) _y240 = 1; \
- + _t240 = (DItype)_k240; \
- + _u240 = _l240.i; \
- + _v240 = _m240.i; \
- + _w240 = _n240.i; \
- + _x240 = _o240.i; \
- + R##_f1 = (_t240 << (128 - (wfracbits - 1))) \
- + | ((_u240 & 0xffffff) >> ((wfracbits - 1) - 104)); \
- + R##_f0 = ((_u240 & 0xffffff) << (168 - (wfracbits - 1))) \
- + | ((_v240 & 0xffffff) << (144 - (wfracbits - 1))) \
- + | ((_w240 & 0xffffff) << (120 - (wfracbits - 1))) \
- + | ((_x240 & 0xffffff) >> ((wfracbits - 1) - 96)) \
- + | _y240; \
- + resetfe; \
- + } while (0)
- +
- +/*
- + * Division algorithms:
- + */
- +
- +#define _FP_DIV_MEAT_2_udiv(fs, R, X, Y) \
- + do { \
- + _FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0; \
- + if (_FP_FRAC_GT_2(X, Y)) \
- + { \
- + _n_f2 = X##_f1 >> 1; \
- + _n_f1 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1; \
- + _n_f0 = X##_f0 << (_FP_W_TYPE_SIZE - 1); \
- + } \
- + else \
- + { \
- + R##_e--; \
- + _n_f2 = X##_f1; \
- + _n_f1 = X##_f0; \
- + _n_f0 = 0; \
- + } \
- + \
- + /* Normalize, i.e. make the most significant bit of the \
- + denominator set. */ \
- + _FP_FRAC_SLL_2(Y, _FP_WFRACXBITS_##fs); \
- + \
- + udiv_qrnnd(R##_f1, _r_f1, _n_f2, _n_f1, Y##_f1); \
- + umul_ppmm(_m_f1, _m_f0, R##_f1, Y##_f0); \
- + _r_f0 = _n_f0; \
- + if (_FP_FRAC_GT_2(_m, _r)) \
- + { \
- + R##_f1--; \
- + _FP_FRAC_ADD_2(_r, Y, _r); \
- + if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r)) \
- + { \
- + R##_f1--; \
- + _FP_FRAC_ADD_2(_r, Y, _r); \
- + } \
- + } \
- + _FP_FRAC_DEC_2(_r, _m); \
- + \
- + if (_r_f1 == Y##_f1) \
- + { \
- + /* This is a special case, not an optimization \
- + (_r/Y##_f1 would not fit into UWtype). \
- + As _r is guaranteed to be < Y, R##_f0 can be either \
- + (UWtype)-1 or (UWtype)-2. But as we know what kind \
- + of bits it is (sticky, guard, round), we don't care. \
- + We also don't care what the reminder is, because the \
- + guard bit will be set anyway. -jj */ \
- + R##_f0 = -1; \
- + } \
- + else \
- + { \
- + udiv_qrnnd(R##_f0, _r_f1, _r_f1, _r_f0, Y##_f1); \
- + umul_ppmm(_m_f1, _m_f0, R##_f0, Y##_f0); \
- + _r_f0 = 0; \
- + if (_FP_FRAC_GT_2(_m, _r)) \
- + { \
- + R##_f0--; \
- + _FP_FRAC_ADD_2(_r, Y, _r); \
- + if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r)) \
- + { \
- + R##_f0--; \
- + _FP_FRAC_ADD_2(_r, Y, _r); \
- + } \
- + } \
- + if (!_FP_FRAC_EQ_2(_r, _m)) \
- + R##_f0 |= _FP_WORK_STICKY; \
- + } \
- + } while (0)
- +
- +
- +#define _FP_DIV_MEAT_2_gmp(fs, R, X, Y) \
- + do { \
- + _FP_W_TYPE _x[4], _y[2], _z[4]; \
- + _y[0] = Y##_f0; _y[1] = Y##_f1; \
- + _x[0] = _x[3] = 0; \
- + if (_FP_FRAC_GT_2(X, Y)) \
- + { \
- + R##_e++; \
- + _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE) | \
- + X##_f1 >> (_FP_W_TYPE_SIZE - \
- + (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE))); \
- + _x[2] = X##_f1 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE); \
- + } \
- + else \
- + { \
- + _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE) | \
- + X##_f1 >> (_FP_W_TYPE_SIZE - \
- + (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE))); \
- + _x[2] = X##_f1 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE); \
- + } \
- + \
- + (void) mpn_divrem (_z, 0, _x, 4, _y, 2); \
- + R##_f1 = _z[1]; \
- + R##_f0 = _z[0] | ((_x[0] | _x[1]) != 0); \
- + } while (0)
- +
- +
- +/*
- + * Square root algorithms:
- + * We have just one right now, maybe Newton approximation
- + * should be added for those machines where division is fast.
- + */
- +
- +#define _FP_SQRT_MEAT_2(R, S, T, X, q) \
- + do { \
- + while (q) \
- + { \
- + T##_f1 = S##_f1 + q; \
- + if (T##_f1 <= X##_f1) \
- + { \
- + S##_f1 = T##_f1 + q; \
- + X##_f1 -= T##_f1; \
- + R##_f1 += q; \
- + } \
- + _FP_FRAC_SLL_2(X, 1); \
- + q >>= 1; \
- + } \
- + q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
- + while (q != _FP_WORK_ROUND) \
- + { \
- + T##_f0 = S##_f0 + q; \
- + T##_f1 = S##_f1; \
- + if (T##_f1 < X##_f1 || \
- + (T##_f1 == X##_f1 && T##_f0 <= X##_f0)) \
- + { \
- + S##_f0 = T##_f0 + q; \
- + S##_f1 += (T##_f0 > S##_f0); \
- + _FP_FRAC_DEC_2(X, T); \
- + R##_f0 += q; \
- + } \
- + _FP_FRAC_SLL_2(X, 1); \
- + q >>= 1; \
- + } \
- + if (X##_f0 | X##_f1) \
- + { \
- + if (S##_f1 < X##_f1 || \
- + (S##_f1 == X##_f1 && S##_f0 < X##_f0)) \
- + R##_f0 |= _FP_WORK_ROUND; \
- + R##_f0 |= _FP_WORK_STICKY; \
- + } \
- + } while (0)
- +
- +
- +/*
- + * Assembly/disassembly for converting to/from integral types.
- + * No shifting or overflow handled here.
- + */
- +
- +#define _FP_FRAC_ASSEMBLE_2(r, X, rsize) \
- +(void)((rsize <= _FP_W_TYPE_SIZE) \
- + ? ({ r = X##_f0; }) \
- + : ({ \
- + r = X##_f1; \
- + r <<= _FP_W_TYPE_SIZE; \
- + r += X##_f0; \
- + }))
- +
- +#define _FP_FRAC_DISASSEMBLE_2(X, r, rsize) \
- + do { \
- + X##_f0 = r; \
- + X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \
- + } while (0)
- +
- +/*
- + * Convert FP values between word sizes
- + */
- +
- +#define _FP_FRAC_COPY_1_2(D, S) (D##_f = S##_f0)
- +
- +#define _FP_FRAC_COPY_2_1(D, S) ((D##_f0 = S##_f), (D##_f1 = 0))
- +
- +#define _FP_FRAC_COPY_2_2(D,S) _FP_FRAC_COPY_2(D,S)
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/op-4.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/op-4.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/op-4.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/op-4.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,688 @@
- +/* Software floating-point emulation.
- + Basic four-word fraction declaration and manipulation.
- + Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com),
- + Jakub Jelinek (jj@ultra.linux.cz),
- + David S. Miller (davem@redhat.com) and
- + Peter Maydell (pmaydell@chiark.greenend.org.uk).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + In addition to the permissions in the GNU Lesser General Public
- + License, the Free Software Foundation gives you unlimited
- + permission to link the compiled version of this file into
- + combinations with other programs, and to distribute those
- + combinations without any restriction coming from the use of this
- + file. (The Lesser General Public License restrictions do apply in
- + other respects; for example, they cover modification of the file,
- + and distribution when not linked into a combine executable.)
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
- + MA 02110-1301, USA. */
- +
- +#define _FP_FRAC_DECL_4(X) _FP_W_TYPE X##_f[4]
- +#define _FP_FRAC_COPY_4(D,S) \
- + (D##_f[0] = S##_f[0], D##_f[1] = S##_f[1], \
- + D##_f[2] = S##_f[2], D##_f[3] = S##_f[3])
- +#define _FP_FRAC_SET_4(X,I) __FP_FRAC_SET_4(X, I)
- +#define _FP_FRAC_HIGH_4(X) (X##_f[3])
- +#define _FP_FRAC_LOW_4(X) (X##_f[0])
- +#define _FP_FRAC_WORD_4(X,w) (X##_f[w])
- +
- +#define _FP_FRAC_SLL_4(X,N) \
- + do { \
- + _FP_I_TYPE _up, _down, _skip, _i; \
- + _skip = (N) / _FP_W_TYPE_SIZE; \
- + _up = (N) % _FP_W_TYPE_SIZE; \
- + _down = _FP_W_TYPE_SIZE - _up; \
- + if (!_up) \
- + for (_i = 3; _i >= _skip; --_i) \
- + X##_f[_i] = X##_f[_i-_skip]; \
- + else \
- + { \
- + for (_i = 3; _i > _skip; --_i) \
- + X##_f[_i] = X##_f[_i-_skip] << _up \
- + | X##_f[_i-_skip-1] >> _down; \
- + X##_f[_i--] = X##_f[0] << _up; \
- + } \
- + for (; _i >= 0; --_i) \
- + X##_f[_i] = 0; \
- + } while (0)
- +
- +/* This one was broken too */
- +#define _FP_FRAC_SRL_4(X,N) \
- + do { \
- + _FP_I_TYPE _up, _down, _skip, _i; \
- + _skip = (N) / _FP_W_TYPE_SIZE; \
- + _down = (N) % _FP_W_TYPE_SIZE; \
- + _up = _FP_W_TYPE_SIZE - _down; \
- + if (!_down) \
- + for (_i = 0; _i <= 3-_skip; ++_i) \
- + X##_f[_i] = X##_f[_i+_skip]; \
- + else \
- + { \
- + for (_i = 0; _i < 3-_skip; ++_i) \
- + X##_f[_i] = X##_f[_i+_skip] >> _down \
- + | X##_f[_i+_skip+1] << _up; \
- + X##_f[_i++] = X##_f[3] >> _down; \
- + } \
- + for (; _i < 4; ++_i) \
- + X##_f[_i] = 0; \
- + } while (0)
- +
- +
- +/* Right shift with sticky-lsb.
- + * What this actually means is that we do a standard right-shift,
- + * but that if any of the bits that fall off the right hand side
- + * were one then we always set the LSbit.
- + */
- +#define _FP_FRAC_SRST_4(X,S,N,size) \
- + do { \
- + _FP_I_TYPE _up, _down, _skip, _i; \
- + _FP_W_TYPE _s; \
- + _skip = (N) / _FP_W_TYPE_SIZE; \
- + _down = (N) % _FP_W_TYPE_SIZE; \
- + _up = _FP_W_TYPE_SIZE - _down; \
- + for (_s = _i = 0; _i < _skip; ++_i) \
- + _s |= X##_f[_i]; \
- + if (!_down) \
- + for (_i = 0; _i <= 3-_skip; ++_i) \
- + X##_f[_i] = X##_f[_i+_skip]; \
- + else \
- + { \
- + _s |= X##_f[_i] << _up; \
- + for (_i = 0; _i < 3-_skip; ++_i) \
- + X##_f[_i] = X##_f[_i+_skip] >> _down \
- + | X##_f[_i+_skip+1] << _up; \
- + X##_f[_i++] = X##_f[3] >> _down; \
- + } \
- + for (; _i < 4; ++_i) \
- + X##_f[_i] = 0; \
- + S = (_s != 0); \
- + } while (0)
- +
- +#define _FP_FRAC_SRS_4(X,N,size) \
- + do { \
- + int _sticky; \
- + _FP_FRAC_SRST_4(X, _sticky, N, size); \
- + X##_f[0] |= _sticky; \
- + } while (0)
- +
- +#define _FP_FRAC_ADD_4(R,X,Y) \
- + __FP_FRAC_ADD_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0], \
- + X##_f[3], X##_f[2], X##_f[1], X##_f[0], \
- + Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
- +
- +#define _FP_FRAC_SUB_4(R,X,Y) \
- + __FP_FRAC_SUB_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0], \
- + X##_f[3], X##_f[2], X##_f[1], X##_f[0], \
- + Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
- +
- +#define _FP_FRAC_DEC_4(X,Y) \
- + __FP_FRAC_DEC_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0], \
- + Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
- +
- +#define _FP_FRAC_ADDI_4(X,I) \
- + __FP_FRAC_ADDI_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0], I)
- +
- +#define _FP_ZEROFRAC_4 0,0,0,0
- +#define _FP_MINFRAC_4 0,0,0,1
- +#define _FP_MAXFRAC_4 (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0)
- +
- +#define _FP_FRAC_ZEROP_4(X) ((X##_f[0] | X##_f[1] | X##_f[2] | X##_f[3]) == 0)
- +#define _FP_FRAC_NEGP_4(X) ((_FP_WS_TYPE)X##_f[3] < 0)
- +#define _FP_FRAC_OVERP_4(fs,X) (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
- +#define _FP_FRAC_CLEAR_OVERP_4(fs,X) (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
- +
- +#define _FP_FRAC_EQ_4(X,Y) \
- + (X##_f[0] == Y##_f[0] && X##_f[1] == Y##_f[1] \
- + && X##_f[2] == Y##_f[2] && X##_f[3] == Y##_f[3])
- +
- +#define _FP_FRAC_GT_4(X,Y) \
- + (X##_f[3] > Y##_f[3] || \
- + (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] || \
- + (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] || \
- + (X##_f[1] == Y##_f[1] && X##_f[0] > Y##_f[0]) \
- + )) \
- + )) \
- + )
- +
- +#define _FP_FRAC_GE_4(X,Y) \
- + (X##_f[3] > Y##_f[3] || \
- + (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] || \
- + (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] || \
- + (X##_f[1] == Y##_f[1] && X##_f[0] >= Y##_f[0]) \
- + )) \
- + )) \
- + )
- +
- +
- +#define _FP_FRAC_CLZ_4(R,X) \
- + do { \
- + if (X##_f[3]) \
- + { \
- + __FP_CLZ(R,X##_f[3]); \
- + } \
- + else if (X##_f[2]) \
- + { \
- + __FP_CLZ(R,X##_f[2]); \
- + R += _FP_W_TYPE_SIZE; \
- + } \
- + else if (X##_f[1]) \
- + { \
- + __FP_CLZ(R,X##_f[1]); \
- + R += _FP_W_TYPE_SIZE*2; \
- + } \
- + else \
- + { \
- + __FP_CLZ(R,X##_f[0]); \
- + R += _FP_W_TYPE_SIZE*3; \
- + } \
- + } while(0)
- +
- +
- +#define _FP_UNPACK_RAW_4(fs, X, val) \
- + do { \
- + union _FP_UNION_##fs _flo; _flo.flt = (val); \
- + X##_f[0] = _flo.bits.frac0; \
- + X##_f[1] = _flo.bits.frac1; \
- + X##_f[2] = _flo.bits.frac2; \
- + X##_f[3] = _flo.bits.frac3; \
- + X##_e = _flo.bits.exp; \
- + X##_s = _flo.bits.sign; \
- + } while (0)
- +
- +#define _FP_UNPACK_RAW_4_P(fs, X, val) \
- + do { \
- + union _FP_UNION_##fs *_flo = \
- + (union _FP_UNION_##fs *)(val); \
- + \
- + X##_f[0] = _flo->bits.frac0; \
- + X##_f[1] = _flo->bits.frac1; \
- + X##_f[2] = _flo->bits.frac2; \
- + X##_f[3] = _flo->bits.frac3; \
- + X##_e = _flo->bits.exp; \
- + X##_s = _flo->bits.sign; \
- + } while (0)
- +
- +#define _FP_PACK_RAW_4(fs, val, X) \
- + do { \
- + union _FP_UNION_##fs _flo; \
- + _flo.bits.frac0 = X##_f[0]; \
- + _flo.bits.frac1 = X##_f[1]; \
- + _flo.bits.frac2 = X##_f[2]; \
- + _flo.bits.frac3 = X##_f[3]; \
- + _flo.bits.exp = X##_e; \
- + _flo.bits.sign = X##_s; \
- + (val) = _flo.flt; \
- + } while (0)
- +
- +#define _FP_PACK_RAW_4_P(fs, val, X) \
- + do { \
- + union _FP_UNION_##fs *_flo = \
- + (union _FP_UNION_##fs *)(val); \
- + \
- + _flo->bits.frac0 = X##_f[0]; \
- + _flo->bits.frac1 = X##_f[1]; \
- + _flo->bits.frac2 = X##_f[2]; \
- + _flo->bits.frac3 = X##_f[3]; \
- + _flo->bits.exp = X##_e; \
- + _flo->bits.sign = X##_s; \
- + } while (0)
- +
- +/*
- + * Multiplication algorithms:
- + */
- +
- +/* Given a 1W * 1W => 2W primitive, do the extended multiplication. */
- +
- +#define _FP_MUL_MEAT_4_wide(wfracbits, R, X, Y, doit) \
- + do { \
- + _FP_FRAC_DECL_8(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c); \
- + _FP_FRAC_DECL_2(_d); _FP_FRAC_DECL_2(_e); _FP_FRAC_DECL_2(_f); \
- + \
- + doit(_FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0), X##_f[0], Y##_f[0]); \
- + doit(_b_f1, _b_f0, X##_f[0], Y##_f[1]); \
- + doit(_c_f1, _c_f0, X##_f[1], Y##_f[0]); \
- + doit(_d_f1, _d_f0, X##_f[1], Y##_f[1]); \
- + doit(_e_f1, _e_f0, X##_f[0], Y##_f[2]); \
- + doit(_f_f1, _f_f0, X##_f[2], Y##_f[0]); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2), \
- + _FP_FRAC_WORD_8(_z,1), 0,_b_f1,_b_f0, \
- + 0,0,_FP_FRAC_WORD_8(_z,1)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2), \
- + _FP_FRAC_WORD_8(_z,1), 0,_c_f1,_c_f0, \
- + _FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2), \
- + _FP_FRAC_WORD_8(_z,1)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3), \
- + _FP_FRAC_WORD_8(_z,2), 0,_d_f1,_d_f0, \
- + 0,_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3), \
- + _FP_FRAC_WORD_8(_z,2), 0,_e_f1,_e_f0, \
- + _FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3), \
- + _FP_FRAC_WORD_8(_z,2)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3), \
- + _FP_FRAC_WORD_8(_z,2), 0,_f_f1,_f_f0, \
- + _FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3), \
- + _FP_FRAC_WORD_8(_z,2)); \
- + doit(_b_f1, _b_f0, X##_f[0], Y##_f[3]); \
- + doit(_c_f1, _c_f0, X##_f[3], Y##_f[0]); \
- + doit(_d_f1, _d_f0, X##_f[1], Y##_f[2]); \
- + doit(_e_f1, _e_f0, X##_f[2], Y##_f[1]); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4), \
- + _FP_FRAC_WORD_8(_z,3), 0,_b_f1,_b_f0, \
- + 0,_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4), \
- + _FP_FRAC_WORD_8(_z,3), 0,_c_f1,_c_f0, \
- + _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4), \
- + _FP_FRAC_WORD_8(_z,3)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4), \
- + _FP_FRAC_WORD_8(_z,3), 0,_d_f1,_d_f0, \
- + _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4), \
- + _FP_FRAC_WORD_8(_z,3)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4), \
- + _FP_FRAC_WORD_8(_z,3), 0,_e_f1,_e_f0, \
- + _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4), \
- + _FP_FRAC_WORD_8(_z,3)); \
- + doit(_b_f1, _b_f0, X##_f[2], Y##_f[2]); \
- + doit(_c_f1, _c_f0, X##_f[1], Y##_f[3]); \
- + doit(_d_f1, _d_f0, X##_f[3], Y##_f[1]); \
- + doit(_e_f1, _e_f0, X##_f[2], Y##_f[3]); \
- + doit(_f_f1, _f_f0, X##_f[3], Y##_f[2]); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5), \
- + _FP_FRAC_WORD_8(_z,4), 0,_b_f1,_b_f0, \
- + 0,_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5), \
- + _FP_FRAC_WORD_8(_z,4), 0,_c_f1,_c_f0, \
- + _FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5), \
- + _FP_FRAC_WORD_8(_z,4)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5), \
- + _FP_FRAC_WORD_8(_z,4), 0,_d_f1,_d_f0, \
- + _FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5), \
- + _FP_FRAC_WORD_8(_z,4)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6), \
- + _FP_FRAC_WORD_8(_z,5), 0,_e_f1,_e_f0, \
- + 0,_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5)); \
- + __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6), \
- + _FP_FRAC_WORD_8(_z,5), 0,_f_f1,_f_f0, \
- + _FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6), \
- + _FP_FRAC_WORD_8(_z,5)); \
- + doit(_b_f1, _b_f0, X##_f[3], Y##_f[3]); \
- + __FP_FRAC_ADD_2(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6), \
- + _b_f1,_b_f0, \
- + _FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6)); \
- + \
- + /* Normalize since we know where the msb of the multiplicands \
- + were (bit B), we know that the msb of the of the product is \
- + at either 2B or 2B-1. */ \
- + _FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits); \
- + __FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2), \
- + _FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0)); \
- + } while (0)
- +
- +#define _FP_MUL_MEAT_4_gmp(wfracbits, R, X, Y) \
- + do { \
- + _FP_FRAC_DECL_8(_z); \
- + \
- + mpn_mul_n(_z_f, _x_f, _y_f, 4); \
- + \
- + /* Normalize since we know where the msb of the multiplicands \
- + were (bit B), we know that the msb of the of the product is \
- + at either 2B or 2B-1. */ \
- + _FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits); \
- + __FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2), \
- + _FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0)); \
- + } while (0)
- +
- +/*
- + * Helper utility for _FP_DIV_MEAT_4_udiv:
- + * pppp = m * nnn
- + */
- +#define umul_ppppmnnn(p3,p2,p1,p0,m,n2,n1,n0) \
- + do { \
- + UWtype _t; \
- + umul_ppmm(p1,p0,m,n0); \
- + umul_ppmm(p2,_t,m,n1); \
- + __FP_FRAC_ADDI_2(p2,p1,_t); \
- + umul_ppmm(p3,_t,m,n2); \
- + __FP_FRAC_ADDI_2(p3,p2,_t); \
- + } while (0)
- +
- +/*
- + * Division algorithms:
- + */
- +
- +#define _FP_DIV_MEAT_4_udiv(fs, R, X, Y) \
- + do { \
- + int _i; \
- + _FP_FRAC_DECL_4(_n); _FP_FRAC_DECL_4(_m); \
- + _FP_FRAC_SET_4(_n, _FP_ZEROFRAC_4); \
- + if (_FP_FRAC_GT_4(X, Y)) \
- + { \
- + _n_f[3] = X##_f[0] << (_FP_W_TYPE_SIZE - 1); \
- + _FP_FRAC_SRL_4(X, 1); \
- + } \
- + else \
- + R##_e--; \
- + \
- + /* Normalize, i.e. make the most significant bit of the \
- + denominator set. */ \
- + _FP_FRAC_SLL_4(Y, _FP_WFRACXBITS_##fs); \
- + \
- + for (_i = 3; ; _i--) \
- + { \
- + if (X##_f[3] == Y##_f[3]) \
- + { \
- + /* This is a special case, not an optimization \
- + (X##_f[3]/Y##_f[3] would not fit into UWtype). \
- + As X## is guaranteed to be < Y, R##_f[_i] can be either \
- + (UWtype)-1 or (UWtype)-2. */ \
- + R##_f[_i] = -1; \
- + if (!_i) \
- + break; \
- + __FP_FRAC_SUB_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0], \
- + Y##_f[2], Y##_f[1], Y##_f[0], 0, \
- + X##_f[2], X##_f[1], X##_f[0], _n_f[_i]); \
- + _FP_FRAC_SUB_4(X, Y, X); \
- + if (X##_f[3] > Y##_f[3]) \
- + { \
- + R##_f[_i] = -2; \
- + _FP_FRAC_ADD_4(X, Y, X); \
- + } \
- + } \
- + else \
- + { \
- + udiv_qrnnd(R##_f[_i], X##_f[3], X##_f[3], X##_f[2], Y##_f[3]); \
- + umul_ppppmnnn(_m_f[3], _m_f[2], _m_f[1], _m_f[0], \
- + R##_f[_i], Y##_f[2], Y##_f[1], Y##_f[0]); \
- + X##_f[2] = X##_f[1]; \
- + X##_f[1] = X##_f[0]; \
- + X##_f[0] = _n_f[_i]; \
- + if (_FP_FRAC_GT_4(_m, X)) \
- + { \
- + R##_f[_i]--; \
- + _FP_FRAC_ADD_4(X, Y, X); \
- + if (_FP_FRAC_GE_4(X, Y) && _FP_FRAC_GT_4(_m, X)) \
- + { \
- + R##_f[_i]--; \
- + _FP_FRAC_ADD_4(X, Y, X); \
- + } \
- + } \
- + _FP_FRAC_DEC_4(X, _m); \
- + if (!_i) \
- + { \
- + if (!_FP_FRAC_EQ_4(X, _m)) \
- + R##_f[0] |= _FP_WORK_STICKY; \
- + break; \
- + } \
- + } \
- + } \
- + } while (0)
- +
- +
- +/*
- + * Square root algorithms:
- + * We have just one right now, maybe Newton approximation
- + * should be added for those machines where division is fast.
- + */
- +
- +#define _FP_SQRT_MEAT_4(R, S, T, X, q) \
- + do { \
- + while (q) \
- + { \
- + T##_f[3] = S##_f[3] + q; \
- + if (T##_f[3] <= X##_f[3]) \
- + { \
- + S##_f[3] = T##_f[3] + q; \
- + X##_f[3] -= T##_f[3]; \
- + R##_f[3] += q; \
- + } \
- + _FP_FRAC_SLL_4(X, 1); \
- + q >>= 1; \
- + } \
- + q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
- + while (q) \
- + { \
- + T##_f[2] = S##_f[2] + q; \
- + T##_f[3] = S##_f[3]; \
- + if (T##_f[3] < X##_f[3] || \
- + (T##_f[3] == X##_f[3] && T##_f[2] <= X##_f[2])) \
- + { \
- + S##_f[2] = T##_f[2] + q; \
- + S##_f[3] += (T##_f[2] > S##_f[2]); \
- + __FP_FRAC_DEC_2(X##_f[3], X##_f[2], \
- + T##_f[3], T##_f[2]); \
- + R##_f[2] += q; \
- + } \
- + _FP_FRAC_SLL_4(X, 1); \
- + q >>= 1; \
- + } \
- + q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
- + while (q) \
- + { \
- + T##_f[1] = S##_f[1] + q; \
- + T##_f[2] = S##_f[2]; \
- + T##_f[3] = S##_f[3]; \
- + if (T##_f[3] < X##_f[3] || \
- + (T##_f[3] == X##_f[3] && (T##_f[2] < X##_f[2] || \
- + (T##_f[2] == X##_f[2] && T##_f[1] <= X##_f[1])))) \
- + { \
- + S##_f[1] = T##_f[1] + q; \
- + S##_f[2] += (T##_f[1] > S##_f[1]); \
- + S##_f[3] += (T##_f[2] > S##_f[2]); \
- + __FP_FRAC_DEC_3(X##_f[3], X##_f[2], X##_f[1], \
- + T##_f[3], T##_f[2], T##_f[1]); \
- + R##_f[1] += q; \
- + } \
- + _FP_FRAC_SLL_4(X, 1); \
- + q >>= 1; \
- + } \
- + q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
- + while (q != _FP_WORK_ROUND) \
- + { \
- + T##_f[0] = S##_f[0] + q; \
- + T##_f[1] = S##_f[1]; \
- + T##_f[2] = S##_f[2]; \
- + T##_f[3] = S##_f[3]; \
- + if (_FP_FRAC_GE_4(X,T)) \
- + { \
- + S##_f[0] = T##_f[0] + q; \
- + S##_f[1] += (T##_f[0] > S##_f[0]); \
- + S##_f[2] += (T##_f[1] > S##_f[1]); \
- + S##_f[3] += (T##_f[2] > S##_f[2]); \
- + _FP_FRAC_DEC_4(X, T); \
- + R##_f[0] += q; \
- + } \
- + _FP_FRAC_SLL_4(X, 1); \
- + q >>= 1; \
- + } \
- + if (!_FP_FRAC_ZEROP_4(X)) \
- + { \
- + if (_FP_FRAC_GT_4(X,S)) \
- + R##_f[0] |= _FP_WORK_ROUND; \
- + R##_f[0] |= _FP_WORK_STICKY; \
- + } \
- + } while (0)
- +
- +
- +/*
- + * Internals
- + */
- +
- +#define __FP_FRAC_SET_4(X,I3,I2,I1,I0) \
- + (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0)
- +
- +#ifndef __FP_FRAC_ADD_3
- +#define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
- + do { \
- + _FP_W_TYPE _c1, _c2; \
- + r0 = x0 + y0; \
- + _c1 = r0 < x0; \
- + r1 = x1 + y1; \
- + _c2 = r1 < x1; \
- + r1 += _c1; \
- + _c2 |= r1 < _c1; \
- + r2 = x2 + y2 + _c2; \
- + } while (0)
- +#endif
- +
- +#ifndef __FP_FRAC_ADD_4
- +#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
- + do { \
- + _FP_W_TYPE _c1, _c2, _c3; \
- + r0 = x0 + y0; \
- + _c1 = r0 < x0; \
- + r1 = x1 + y1; \
- + _c2 = r1 < x1; \
- + r1 += _c1; \
- + _c2 |= r1 < _c1; \
- + r2 = x2 + y2; \
- + _c3 = r2 < x2; \
- + r2 += _c2; \
- + _c3 |= r2 < _c2; \
- + r3 = x3 + y3 + _c3; \
- + } while (0)
- +#endif
- +
- +#ifndef __FP_FRAC_SUB_3
- +#define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
- + do { \
- + _FP_W_TYPE _c1, _c2; \
- + r0 = x0 - y0; \
- + _c1 = r0 > x0; \
- + r1 = x1 - y1; \
- + _c2 = r1 > x1; \
- + r1 -= _c1; \
- + _c2 |= _c1 && (y1 == x1); \
- + r2 = x2 - y2 - _c2; \
- + } while (0)
- +#endif
- +
- +#ifndef __FP_FRAC_SUB_4
- +#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
- + do { \
- + _FP_W_TYPE _c1, _c2, _c3; \
- + r0 = x0 - y0; \
- + _c1 = r0 > x0; \
- + r1 = x1 - y1; \
- + _c2 = r1 > x1; \
- + r1 -= _c1; \
- + _c2 |= _c1 && (y1 == x1); \
- + r2 = x2 - y2; \
- + _c3 = r2 > x2; \
- + r2 -= _c2; \
- + _c3 |= _c2 && (y2 == x2); \
- + r3 = x3 - y3 - _c3; \
- + } while (0)
- +#endif
- +
- +#ifndef __FP_FRAC_DEC_3
- +#define __FP_FRAC_DEC_3(x2,x1,x0,y2,y1,y0) \
- + do { \
- + UWtype _t0, _t1, _t2; \
- + _t0 = x0, _t1 = x1, _t2 = x2; \
- + __FP_FRAC_SUB_3 (x2, x1, x0, _t2, _t1, _t0, y2, y1, y0); \
- + } while (0)
- +#endif
- +
- +#ifndef __FP_FRAC_DEC_4
- +#define __FP_FRAC_DEC_4(x3,x2,x1,x0,y3,y2,y1,y0) \
- + do { \
- + UWtype _t0, _t1, _t2, _t3; \
- + _t0 = x0, _t1 = x1, _t2 = x2, _t3 = x3; \
- + __FP_FRAC_SUB_4 (x3,x2,x1,x0,_t3,_t2,_t1,_t0, y3,y2,y1,y0); \
- + } while (0)
- +#endif
- +
- +#ifndef __FP_FRAC_ADDI_4
- +#define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i) \
- + do { \
- + UWtype _t; \
- + _t = ((x0 += i) < i); \
- + x1 += _t; _t = (x1 < _t); \
- + x2 += _t; _t = (x2 < _t); \
- + x3 += _t; \
- + } while (0)
- +#endif
- +
- +/* Convert FP values between word sizes. This appears to be more
- + * complicated than I'd have expected it to be, so these might be
- + * wrong... These macros are in any case somewhat bogus because they
- + * use information about what various FRAC_n variables look like
- + * internally [eg, that 2 word vars are X_f0 and x_f1]. But so do
- + * the ones in op-2.h and op-1.h.
- + */
- +#define _FP_FRAC_COPY_1_4(D, S) (D##_f = S##_f[0])
- +
- +#define _FP_FRAC_COPY_2_4(D, S) \
- +do { \
- + D##_f0 = S##_f[0]; \
- + D##_f1 = S##_f[1]; \
- +} while (0)
- +
- +/* Assembly/disassembly for converting to/from integral types.
- + * No shifting or overflow handled here.
- + */
- +/* Put the FP value X into r, which is an integer of size rsize. */
- +#define _FP_FRAC_ASSEMBLE_4(r, X, rsize) \
- + do { \
- + if (rsize <= _FP_W_TYPE_SIZE) \
- + r = X##_f[0]; \
- + else if (rsize <= 2*_FP_W_TYPE_SIZE) \
- + { \
- + r = X##_f[1]; \
- + r <<= _FP_W_TYPE_SIZE; \
- + r += X##_f[0]; \
- + } \
- + else \
- + { \
- + /* I'm feeling lazy so we deal with int == 3words (implausible)*/ \
- + /* and int == 4words as a single case. */ \
- + r = X##_f[3]; \
- + r <<= _FP_W_TYPE_SIZE; \
- + r += X##_f[2]; \
- + r <<= _FP_W_TYPE_SIZE; \
- + r += X##_f[1]; \
- + r <<= _FP_W_TYPE_SIZE; \
- + r += X##_f[0]; \
- + } \
- + } while (0)
- +
- +/* "No disassemble Number Five!" */
- +/* move an integer of size rsize into X's fractional part. We rely on
- + * the _f[] array consisting of words of size _FP_W_TYPE_SIZE to avoid
- + * having to mask the values we store into it.
- + */
- +#define _FP_FRAC_DISASSEMBLE_4(X, r, rsize) \
- + do { \
- + X##_f[0] = r; \
- + X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \
- + X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \
- + X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \
- + } while (0);
- +
- +#define _FP_FRAC_COPY_4_1(D, S) \
- +do { \
- + D##_f[0] = S##_f; \
- + D##_f[1] = D##_f[2] = D##_f[3] = 0; \
- +} while (0)
- +
- +#define _FP_FRAC_COPY_4_2(D, S) \
- +do { \
- + D##_f[0] = S##_f0; \
- + D##_f[1] = S##_f1; \
- + D##_f[2] = D##_f[3] = 0; \
- +} while (0)
- +
- +#define _FP_FRAC_COPY_4_4(D,S) _FP_FRAC_COPY_4(D,S)
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/op-8.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/op-8.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/op-8.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/op-8.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,111 @@
- +/* Software floating-point emulation.
- + Basic eight-word fraction declaration and manipulation.
- + Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com),
- + Jakub Jelinek (jj@ultra.linux.cz) and
- + Peter Maydell (pmaydell@chiark.greenend.org.uk).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + In addition to the permissions in the GNU Lesser General Public
- + License, the Free Software Foundation gives you unlimited
- + permission to link the compiled version of this file into
- + combinations with other programs, and to distribute those
- + combinations without any restriction coming from the use of this
- + file. (The Lesser General Public License restrictions do apply in
- + other respects; for example, they cover modification of the file,
- + and distribution when not linked into a combine executable.)
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
- + MA 02110-1301, USA. */
- +
- +/* We need just a few things from here for op-4, if we ever need some
- + other macros, they can be added. */
- +#define _FP_FRAC_DECL_8(X) _FP_W_TYPE X##_f[8]
- +#define _FP_FRAC_HIGH_8(X) (X##_f[7])
- +#define _FP_FRAC_LOW_8(X) (X##_f[0])
- +#define _FP_FRAC_WORD_8(X,w) (X##_f[w])
- +
- +#define _FP_FRAC_SLL_8(X,N) \
- + do { \
- + _FP_I_TYPE _up, _down, _skip, _i; \
- + _skip = (N) / _FP_W_TYPE_SIZE; \
- + _up = (N) % _FP_W_TYPE_SIZE; \
- + _down = _FP_W_TYPE_SIZE - _up; \
- + if (!_up) \
- + for (_i = 7; _i >= _skip; --_i) \
- + X##_f[_i] = X##_f[_i-_skip]; \
- + else \
- + { \
- + for (_i = 7; _i > _skip; --_i) \
- + X##_f[_i] = X##_f[_i-_skip] << _up \
- + | X##_f[_i-_skip-1] >> _down; \
- + X##_f[_i--] = X##_f[0] << _up; \
- + } \
- + for (; _i >= 0; --_i) \
- + X##_f[_i] = 0; \
- + } while (0)
- +
- +#define _FP_FRAC_SRL_8(X,N) \
- + do { \
- + _FP_I_TYPE _up, _down, _skip, _i; \
- + _skip = (N) / _FP_W_TYPE_SIZE; \
- + _down = (N) % _FP_W_TYPE_SIZE; \
- + _up = _FP_W_TYPE_SIZE - _down; \
- + if (!_down) \
- + for (_i = 0; _i <= 7-_skip; ++_i) \
- + X##_f[_i] = X##_f[_i+_skip]; \
- + else \
- + { \
- + for (_i = 0; _i < 7-_skip; ++_i) \
- + X##_f[_i] = X##_f[_i+_skip] >> _down \
- + | X##_f[_i+_skip+1] << _up; \
- + X##_f[_i++] = X##_f[7] >> _down; \
- + } \
- + for (; _i < 8; ++_i) \
- + X##_f[_i] = 0; \
- + } while (0)
- +
- +
- +/* Right shift with sticky-lsb.
- + * What this actually means is that we do a standard right-shift,
- + * but that if any of the bits that fall off the right hand side
- + * were one then we always set the LSbit.
- + */
- +#define _FP_FRAC_SRS_8(X,N,size) \
- + do { \
- + _FP_I_TYPE _up, _down, _skip, _i; \
- + _FP_W_TYPE _s; \
- + _skip = (N) / _FP_W_TYPE_SIZE; \
- + _down = (N) % _FP_W_TYPE_SIZE; \
- + _up = _FP_W_TYPE_SIZE - _down; \
- + for (_s = _i = 0; _i < _skip; ++_i) \
- + _s |= X##_f[_i]; \
- + if (!_down) \
- + for (_i = 0; _i <= 7-_skip; ++_i) \
- + X##_f[_i] = X##_f[_i+_skip]; \
- + else \
- + { \
- + _s |= X##_f[_i] << _up; \
- + for (_i = 0; _i < 7-_skip; ++_i) \
- + X##_f[_i] = X##_f[_i+_skip] >> _down \
- + | X##_f[_i+_skip+1] << _up; \
- + X##_f[_i++] = X##_f[7] >> _down; \
- + } \
- + for (; _i < 8; ++_i) \
- + X##_f[_i] = 0; \
- + /* don't fix the LSB until the very end when we're sure f[0] is stable */ \
- + X##_f[0] |= (_s != 0); \
- + } while (0)
- +
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/op-common.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/op-common.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/op-common.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/op-common.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,1359 @@
- +/* Software floating-point emulation. Common operations.
- + Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com),
- + Jakub Jelinek (jj@ultra.linux.cz),
- + David S. Miller (davem@redhat.com) and
- + Peter Maydell (pmaydell@chiark.greenend.org.uk).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + In addition to the permissions in the GNU Lesser General Public
- + License, the Free Software Foundation gives you unlimited
- + permission to link the compiled version of this file into
- + combinations with other programs, and to distribute those
- + combinations without any restriction coming from the use of this
- + file. (The Lesser General Public License restrictions do apply in
- + other respects; for example, they cover modification of the file,
- + and distribution when not linked into a combine executable.)
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
- + MA 02110-1301, USA. */
- +
- +#define _FP_DECL(wc, X) \
- + _FP_I_TYPE X##_c __attribute__((unused)), X##_s, X##_e; \
- + _FP_FRAC_DECL_##wc(X)
- +
- +/*
- + * Finish truely unpacking a native fp value by classifying the kind
- + * of fp value and normalizing both the exponent and the fraction.
- + */
- +
- +#define _FP_UNPACK_CANONICAL(fs, wc, X) \
- +do { \
- + switch (X##_e) \
- + { \
- + default: \
- + _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_IMPLBIT_##fs; \
- + _FP_FRAC_SLL_##wc(X, _FP_WORKBITS); \
- + X##_e -= _FP_EXPBIAS_##fs; \
- + X##_c = FP_CLS_NORMAL; \
- + break; \
- + \
- + case 0: \
- + if (_FP_FRAC_ZEROP_##wc(X)) \
- + X##_c = FP_CLS_ZERO; \
- + else \
- + { \
- + /* a denormalized number */ \
- + _FP_I_TYPE _shift; \
- + _FP_FRAC_CLZ_##wc(_shift, X); \
- + _shift -= _FP_FRACXBITS_##fs; \
- + _FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS)); \
- + X##_e -= _FP_EXPBIAS_##fs - 1 + _shift; \
- + X##_c = FP_CLS_NORMAL; \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + } \
- + break; \
- + \
- + case _FP_EXPMAX_##fs: \
- + if (_FP_FRAC_ZEROP_##wc(X)) \
- + X##_c = FP_CLS_INF; \
- + else \
- + { \
- + X##_c = FP_CLS_NAN; \
- + /* Check for signaling NaN */ \
- + if (!(_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)) \
- + FP_SET_EXCEPTION(FP_EX_INVALID); \
- + } \
- + break; \
- + } \
- +} while (0)
- +
- +/* Finish unpacking an fp value in semi-raw mode: the mantissa is
- + shifted by _FP_WORKBITS but the implicit MSB is not inserted and
- + other classification is not done. */
- +#define _FP_UNPACK_SEMIRAW(fs, wc, X) _FP_FRAC_SLL_##wc(X, _FP_WORKBITS)
- +
- +/* A semi-raw value has overflowed to infinity. Adjust the mantissa
- + and exponent appropriately. */
- +#define _FP_OVERFLOW_SEMIRAW(fs, wc, X) \
- +do { \
- + if (FP_ROUNDMODE == FP_RND_NEAREST \
- + || (FP_ROUNDMODE == FP_RND_PINF && !X##_s) \
- + || (FP_ROUNDMODE == FP_RND_MINF && X##_s)) \
- + { \
- + X##_e = _FP_EXPMAX_##fs; \
- + _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \
- + } \
- + else \
- + { \
- + X##_e = _FP_EXPMAX_##fs - 1; \
- + _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc); \
- + } \
- + FP_SET_EXCEPTION(FP_EX_INEXACT); \
- + FP_SET_EXCEPTION(FP_EX_OVERFLOW); \
- +} while (0)
- +
- +/* Check for a semi-raw value being a signaling NaN and raise the
- + invalid exception if so. */
- +#define _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X) \
- +do { \
- + if (X##_e == _FP_EXPMAX_##fs \
- + && !_FP_FRAC_ZEROP_##wc(X) \
- + && !(_FP_FRAC_HIGH_##fs(X) & _FP_QNANBIT_SH_##fs)) \
- + FP_SET_EXCEPTION(FP_EX_INVALID); \
- +} while (0)
- +
- +/* Choose a NaN result from an operation on two semi-raw NaN
- + values. */
- +#define _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP) \
- +do { \
- + /* _FP_CHOOSENAN expects raw values, so shift as required. */ \
- + _FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
- + _FP_FRAC_SRL_##wc(Y, _FP_WORKBITS); \
- + _FP_CHOOSENAN(fs, wc, R, X, Y, OP); \
- + _FP_FRAC_SLL_##wc(R, _FP_WORKBITS); \
- +} while (0)
- +
- +/* Test whether a biased exponent is normal (not zero or maximum). */
- +#define _FP_EXP_NORMAL(fs, wc, X) (((X##_e + 1) & _FP_EXPMAX_##fs) > 1)
- +
- +/* Prepare to pack an fp value in semi-raw mode: the mantissa is
- + rounded and shifted right, with the rounding possibly increasing
- + the exponent (including changing a finite value to infinity). */
- +#define _FP_PACK_SEMIRAW(fs, wc, X) \
- +do { \
- + _FP_ROUND(wc, X); \
- + if (_FP_FRAC_HIGH_##fs(X) \
- + & (_FP_OVERFLOW_##fs >> 1)) \
- + { \
- + _FP_FRAC_HIGH_##fs(X) &= ~(_FP_OVERFLOW_##fs >> 1); \
- + X##_e++; \
- + if (X##_e == _FP_EXPMAX_##fs) \
- + _FP_OVERFLOW_SEMIRAW(fs, wc, X); \
- + } \
- + _FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
- + if (!_FP_EXP_NORMAL(fs, wc, X) && !_FP_FRAC_ZEROP_##wc(X)) \
- + { \
- + if (X##_e == 0) \
- + FP_SET_EXCEPTION(FP_EX_UNDERFLOW); \
- + else \
- + { \
- + if (!_FP_KEEPNANFRACP) \
- + { \
- + _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs); \
- + X##_s = _FP_NANSIGN_##fs; \
- + } \
- + else \
- + _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs; \
- + } \
- + } \
- +} while (0)
- +
- +/*
- + * Before packing the bits back into the native fp result, take care
- + * of such mundane things as rounding and overflow. Also, for some
- + * kinds of fp values, the original parts may not have been fully
- + * extracted -- but that is ok, we can regenerate them now.
- + */
- +
- +#define _FP_PACK_CANONICAL(fs, wc, X) \
- +do { \
- + switch (X##_c) \
- + { \
- + case FP_CLS_NORMAL: \
- + X##_e += _FP_EXPBIAS_##fs; \
- + if (X##_e > 0) \
- + { \
- + _FP_ROUND(wc, X); \
- + if (_FP_FRAC_OVERP_##wc(fs, X)) \
- + { \
- + _FP_FRAC_CLEAR_OVERP_##wc(fs, X); \
- + X##_e++; \
- + } \
- + _FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
- + if (X##_e >= _FP_EXPMAX_##fs) \
- + { \
- + /* overflow */ \
- + switch (FP_ROUNDMODE) \
- + { \
- + case FP_RND_NEAREST: \
- + X##_c = FP_CLS_INF; \
- + break; \
- + case FP_RND_PINF: \
- + if (!X##_s) X##_c = FP_CLS_INF; \
- + break; \
- + case FP_RND_MINF: \
- + if (X##_s) X##_c = FP_CLS_INF; \
- + break; \
- + } \
- + if (X##_c == FP_CLS_INF) \
- + { \
- + /* Overflow to infinity */ \
- + X##_e = _FP_EXPMAX_##fs; \
- + _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \
- + } \
- + else \
- + { \
- + /* Overflow to maximum normal */ \
- + X##_e = _FP_EXPMAX_##fs - 1; \
- + _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc); \
- + } \
- + FP_SET_EXCEPTION(FP_EX_OVERFLOW); \
- + FP_SET_EXCEPTION(FP_EX_INEXACT); \
- + } \
- + } \
- + else \
- + { \
- + /* we've got a denormalized number */ \
- + X##_e = -X##_e + 1; \
- + if (X##_e <= _FP_WFRACBITS_##fs) \
- + { \
- + _FP_FRAC_SRS_##wc(X, X##_e, _FP_WFRACBITS_##fs); \
- + _FP_ROUND(wc, X); \
- + if (_FP_FRAC_HIGH_##fs(X) \
- + & (_FP_OVERFLOW_##fs >> 1)) \
- + { \
- + X##_e = 1; \
- + _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \
- + } \
- + else \
- + { \
- + X##_e = 0; \
- + _FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
- + FP_SET_EXCEPTION(FP_EX_UNDERFLOW); \
- + } \
- + } \
- + else \
- + { \
- + /* underflow to zero */ \
- + X##_e = 0; \
- + if (!_FP_FRAC_ZEROP_##wc(X)) \
- + { \
- + _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc); \
- + _FP_ROUND(wc, X); \
- + _FP_FRAC_LOW_##wc(X) >>= (_FP_WORKBITS); \
- + } \
- + FP_SET_EXCEPTION(FP_EX_UNDERFLOW); \
- + } \
- + } \
- + break; \
- + \
- + case FP_CLS_ZERO: \
- + X##_e = 0; \
- + _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \
- + break; \
- + \
- + case FP_CLS_INF: \
- + X##_e = _FP_EXPMAX_##fs; \
- + _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \
- + break; \
- + \
- + case FP_CLS_NAN: \
- + X##_e = _FP_EXPMAX_##fs; \
- + if (!_FP_KEEPNANFRACP) \
- + { \
- + _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs); \
- + X##_s = _FP_NANSIGN_##fs; \
- + } \
- + else \
- + _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs; \
- + break; \
- + } \
- +} while (0)
- +
- +/* This one accepts raw argument and not cooked, returns
- + * 1 if X is a signaling NaN.
- + */
- +#define _FP_ISSIGNAN(fs, wc, X) \
- +({ \
- + int __ret = 0; \
- + if (X##_e == _FP_EXPMAX_##fs) \
- + { \
- + if (!_FP_FRAC_ZEROP_##wc(X) \
- + && !(_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)) \
- + __ret = 1; \
- + } \
- + __ret; \
- +})
- +
- +
- +
- +
- +
- +/* Addition on semi-raw values. */
- +#define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP) \
- +do { \
- + if (X##_s == Y##_s) \
- + { \
- + /* Addition. */ \
- + R##_s = X##_s; \
- + int ediff = X##_e - Y##_e; \
- + if (ediff > 0) \
- + { \
- + R##_e = X##_e; \
- + if (Y##_e == 0) \
- + { \
- + /* Y is zero or denormalized. */ \
- + if (_FP_FRAC_ZEROP_##wc(Y)) \
- + { \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X); \
- + _FP_FRAC_COPY_##wc(R, X); \
- + goto add_done; \
- + } \
- + else \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + ediff--; \
- + if (ediff == 0) \
- + { \
- + _FP_FRAC_ADD_##wc(R, X, Y); \
- + goto add3; \
- + } \
- + if (X##_e == _FP_EXPMAX_##fs) \
- + { \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X); \
- + _FP_FRAC_COPY_##wc(R, X); \
- + goto add_done; \
- + } \
- + goto add1; \
- + } \
- + } \
- + else if (X##_e == _FP_EXPMAX_##fs) \
- + { \
- + /* X is NaN or Inf, Y is normal. */ \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X); \
- + _FP_FRAC_COPY_##wc(R, X); \
- + goto add_done; \
- + } \
- + \
- + /* Insert implicit MSB of Y. */ \
- + _FP_FRAC_HIGH_##fs(Y) |= _FP_IMPLBIT_SH_##fs; \
- + \
- + add1: \
- + /* Shift the mantissa of Y to the right EDIFF steps; \
- + remember to account later for the implicit MSB of X. */ \
- + if (ediff <= _FP_WFRACBITS_##fs) \
- + _FP_FRAC_SRS_##wc(Y, ediff, _FP_WFRACBITS_##fs); \
- + else if (!_FP_FRAC_ZEROP_##wc(Y)) \
- + _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc); \
- + _FP_FRAC_ADD_##wc(R, X, Y); \
- + } \
- + else if (ediff < 0) \
- + { \
- + ediff = -ediff; \
- + R##_e = Y##_e; \
- + if (X##_e == 0) \
- + { \
- + /* X is zero or denormalized. */ \
- + if (_FP_FRAC_ZEROP_##wc(X)) \
- + { \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y); \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + goto add_done; \
- + } \
- + else \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + ediff--; \
- + if (ediff == 0) \
- + { \
- + _FP_FRAC_ADD_##wc(R, Y, X); \
- + goto add3; \
- + } \
- + if (Y##_e == _FP_EXPMAX_##fs) \
- + { \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y); \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + goto add_done; \
- + } \
- + goto add2; \
- + } \
- + } \
- + else if (Y##_e == _FP_EXPMAX_##fs) \
- + { \
- + /* Y is NaN or Inf, X is normal. */ \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y); \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + goto add_done; \
- + } \
- + \
- + /* Insert implicit MSB of X. */ \
- + _FP_FRAC_HIGH_##fs(X) |= _FP_IMPLBIT_SH_##fs; \
- + \
- + add2: \
- + /* Shift the mantissa of X to the right EDIFF steps; \
- + remember to account later for the implicit MSB of Y. */ \
- + if (ediff <= _FP_WFRACBITS_##fs) \
- + _FP_FRAC_SRS_##wc(X, ediff, _FP_WFRACBITS_##fs); \
- + else if (!_FP_FRAC_ZEROP_##wc(X)) \
- + _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc); \
- + _FP_FRAC_ADD_##wc(R, Y, X); \
- + } \
- + else \
- + { \
- + /* ediff == 0. */ \
- + if (!_FP_EXP_NORMAL(fs, wc, X)) \
- + { \
- + if (X##_e == 0) \
- + { \
- + /* X and Y are zero or denormalized. */ \
- + R##_e = 0; \
- + if (_FP_FRAC_ZEROP_##wc(X)) \
- + { \
- + if (!_FP_FRAC_ZEROP_##wc(Y)) \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + goto add_done; \
- + } \
- + else if (_FP_FRAC_ZEROP_##wc(Y)) \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + _FP_FRAC_COPY_##wc(R, X); \
- + goto add_done; \
- + } \
- + else \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + _FP_FRAC_ADD_##wc(R, X, Y); \
- + if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs) \
- + { \
- + /* Normalized result. */ \
- + _FP_FRAC_HIGH_##fs(R) \
- + &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs; \
- + R##_e = 1; \
- + } \
- + goto add_done; \
- + } \
- + } \
- + else \
- + { \
- + /* X and Y are NaN or Inf. */ \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X); \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y); \
- + R##_e = _FP_EXPMAX_##fs; \
- + if (_FP_FRAC_ZEROP_##wc(X)) \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + else if (_FP_FRAC_ZEROP_##wc(Y)) \
- + _FP_FRAC_COPY_##wc(R, X); \
- + else \
- + _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP); \
- + goto add_done; \
- + } \
- + } \
- + /* The exponents of X and Y, both normal, are equal. The \
- + implicit MSBs will always add to increase the \
- + exponent. */ \
- + _FP_FRAC_ADD_##wc(R, X, Y); \
- + R##_e = X##_e + 1; \
- + _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs); \
- + if (R##_e == _FP_EXPMAX_##fs) \
- + /* Overflow to infinity (depending on rounding mode). */ \
- + _FP_OVERFLOW_SEMIRAW(fs, wc, R); \
- + goto add_done; \
- + } \
- + add3: \
- + if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs) \
- + { \
- + /* Overflow. */ \
- + _FP_FRAC_HIGH_##fs(R) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs; \
- + R##_e++; \
- + _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs); \
- + if (R##_e == _FP_EXPMAX_##fs) \
- + /* Overflow to infinity (depending on rounding mode). */ \
- + _FP_OVERFLOW_SEMIRAW(fs, wc, R); \
- + } \
- + add_done: ; \
- + } \
- + else \
- + { \
- + /* Subtraction. */ \
- + int ediff = X##_e - Y##_e; \
- + if (ediff > 0) \
- + { \
- + R##_e = X##_e; \
- + R##_s = X##_s; \
- + if (Y##_e == 0) \
- + { \
- + /* Y is zero or denormalized. */ \
- + if (_FP_FRAC_ZEROP_##wc(Y)) \
- + { \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X); \
- + _FP_FRAC_COPY_##wc(R, X); \
- + goto sub_done; \
- + } \
- + else \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + ediff--; \
- + if (ediff == 0) \
- + { \
- + _FP_FRAC_SUB_##wc(R, X, Y); \
- + goto sub3; \
- + } \
- + if (X##_e == _FP_EXPMAX_##fs) \
- + { \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X); \
- + _FP_FRAC_COPY_##wc(R, X); \
- + goto sub_done; \
- + } \
- + goto sub1; \
- + } \
- + } \
- + else if (X##_e == _FP_EXPMAX_##fs) \
- + { \
- + /* X is NaN or Inf, Y is normal. */ \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X); \
- + _FP_FRAC_COPY_##wc(R, X); \
- + goto sub_done; \
- + } \
- + \
- + /* Insert implicit MSB of Y. */ \
- + _FP_FRAC_HIGH_##fs(Y) |= _FP_IMPLBIT_SH_##fs; \
- + \
- + sub1: \
- + /* Shift the mantissa of Y to the right EDIFF steps; \
- + remember to account later for the implicit MSB of X. */ \
- + if (ediff <= _FP_WFRACBITS_##fs) \
- + _FP_FRAC_SRS_##wc(Y, ediff, _FP_WFRACBITS_##fs); \
- + else if (!_FP_FRAC_ZEROP_##wc(Y)) \
- + _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc); \
- + _FP_FRAC_SUB_##wc(R, X, Y); \
- + } \
- + else if (ediff < 0) \
- + { \
- + ediff = -ediff; \
- + R##_e = Y##_e; \
- + R##_s = Y##_s; \
- + if (X##_e == 0) \
- + { \
- + /* X is zero or denormalized. */ \
- + if (_FP_FRAC_ZEROP_##wc(X)) \
- + { \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y); \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + goto sub_done; \
- + } \
- + else \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + ediff--; \
- + if (ediff == 0) \
- + { \
- + _FP_FRAC_SUB_##wc(R, Y, X); \
- + goto sub3; \
- + } \
- + if (Y##_e == _FP_EXPMAX_##fs) \
- + { \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y); \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + goto sub_done; \
- + } \
- + goto sub2; \
- + } \
- + } \
- + else if (Y##_e == _FP_EXPMAX_##fs) \
- + { \
- + /* Y is NaN or Inf, X is normal. */ \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y); \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + goto sub_done; \
- + } \
- + \
- + /* Insert implicit MSB of X. */ \
- + _FP_FRAC_HIGH_##fs(X) |= _FP_IMPLBIT_SH_##fs; \
- + \
- + sub2: \
- + /* Shift the mantissa of X to the right EDIFF steps; \
- + remember to account later for the implicit MSB of Y. */ \
- + if (ediff <= _FP_WFRACBITS_##fs) \
- + _FP_FRAC_SRS_##wc(X, ediff, _FP_WFRACBITS_##fs); \
- + else if (!_FP_FRAC_ZEROP_##wc(X)) \
- + _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc); \
- + _FP_FRAC_SUB_##wc(R, Y, X); \
- + } \
- + else \
- + { \
- + /* ediff == 0. */ \
- + if (!_FP_EXP_NORMAL(fs, wc, X)) \
- + { \
- + if (X##_e == 0) \
- + { \
- + /* X and Y are zero or denormalized. */ \
- + R##_e = 0; \
- + if (_FP_FRAC_ZEROP_##wc(X)) \
- + { \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + if (_FP_FRAC_ZEROP_##wc(Y)) \
- + R##_s = (FP_ROUNDMODE == FP_RND_MINF); \
- + else \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + R##_s = Y##_s; \
- + } \
- + goto sub_done; \
- + } \
- + else if (_FP_FRAC_ZEROP_##wc(Y)) \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + _FP_FRAC_COPY_##wc(R, X); \
- + R##_s = X##_s; \
- + goto sub_done; \
- + } \
- + else \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + _FP_FRAC_SUB_##wc(R, X, Y); \
- + R##_s = X##_s; \
- + if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs) \
- + { \
- + /* |X| < |Y|, negate result. */ \
- + _FP_FRAC_SUB_##wc(R, Y, X); \
- + R##_s = Y##_s; \
- + } \
- + else if (_FP_FRAC_ZEROP_##wc(R)) \
- + R##_s = (FP_ROUNDMODE == FP_RND_MINF); \
- + goto sub_done; \
- + } \
- + } \
- + else \
- + { \
- + /* X and Y are NaN or Inf, of opposite signs. */ \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X); \
- + _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y); \
- + R##_e = _FP_EXPMAX_##fs; \
- + if (_FP_FRAC_ZEROP_##wc(X)) \
- + { \
- + if (_FP_FRAC_ZEROP_##wc(Y)) \
- + { \
- + /* Inf - Inf. */ \
- + R##_s = _FP_NANSIGN_##fs; \
- + _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \
- + _FP_FRAC_SLL_##wc(R, _FP_WORKBITS); \
- + FP_SET_EXCEPTION(FP_EX_INVALID); \
- + } \
- + else \
- + { \
- + /* Inf - NaN. */ \
- + R##_s = Y##_s; \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + } \
- + } \
- + else \
- + { \
- + if (_FP_FRAC_ZEROP_##wc(Y)) \
- + { \
- + /* NaN - Inf. */ \
- + R##_s = X##_s; \
- + _FP_FRAC_COPY_##wc(R, X); \
- + } \
- + else \
- + { \
- + /* NaN - NaN. */ \
- + _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP); \
- + } \
- + } \
- + goto sub_done; \
- + } \
- + } \
- + /* The exponents of X and Y, both normal, are equal. The \
- + implicit MSBs cancel. */ \
- + R##_e = X##_e; \
- + _FP_FRAC_SUB_##wc(R, X, Y); \
- + R##_s = X##_s; \
- + if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs) \
- + { \
- + /* |X| < |Y|, negate result. */ \
- + _FP_FRAC_SUB_##wc(R, Y, X); \
- + R##_s = Y##_s; \
- + } \
- + else if (_FP_FRAC_ZEROP_##wc(R)) \
- + { \
- + R##_e = 0; \
- + R##_s = (FP_ROUNDMODE == FP_RND_MINF); \
- + goto sub_done; \
- + } \
- + goto norm; \
- + } \
- + sub3: \
- + if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs) \
- + { \
- + int diff; \
- + /* Carry into most significant bit of larger one of X and Y, \
- + canceling it; renormalize. */ \
- + _FP_FRAC_HIGH_##fs(R) &= _FP_IMPLBIT_SH_##fs - 1; \
- + norm: \
- + _FP_FRAC_CLZ_##wc(diff, R); \
- + diff -= _FP_WFRACXBITS_##fs; \
- + _FP_FRAC_SLL_##wc(R, diff); \
- + if (R##_e <= diff) \
- + { \
- + /* R is denormalized. */ \
- + diff = diff - R##_e + 1; \
- + _FP_FRAC_SRS_##wc(R, diff, _FP_WFRACBITS_##fs); \
- + R##_e = 0; \
- + } \
- + else \
- + { \
- + R##_e -= diff; \
- + _FP_FRAC_HIGH_##fs(R) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs; \
- + } \
- + } \
- + sub_done: ; \
- + } \
- +} while (0)
- +
- +#define _FP_ADD(fs, wc, R, X, Y) _FP_ADD_INTERNAL(fs, wc, R, X, Y, '+')
- +#define _FP_SUB(fs, wc, R, X, Y) \
- + do { \
- + if (!(Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) Y##_s ^= 1; \
- + _FP_ADD_INTERNAL(fs, wc, R, X, Y, '-'); \
- + } while (0)
- +
- +
- +/*
- + * Main negation routine. FIXME -- when we care about setting exception
- + * bits reliably, this will not do. We should examine all of the fp classes.
- + */
- +
- +#define _FP_NEG(fs, wc, R, X) \
- + do { \
- + _FP_FRAC_COPY_##wc(R, X); \
- + R##_c = X##_c; \
- + R##_e = X##_e; \
- + R##_s = 1 ^ X##_s; \
- + } while (0)
- +
- +
- +/*
- + * Main multiplication routine. The input values should be cooked.
- + */
- +
- +#define _FP_MUL(fs, wc, R, X, Y) \
- +do { \
- + R##_s = X##_s ^ Y##_s; \
- + switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \
- + { \
- + case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL): \
- + R##_c = FP_CLS_NORMAL; \
- + R##_e = X##_e + Y##_e + 1; \
- + \
- + _FP_MUL_MEAT_##fs(R,X,Y); \
- + \
- + if (_FP_FRAC_OVERP_##wc(fs, R)) \
- + _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs); \
- + else \
- + R##_e--; \
- + break; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN): \
- + _FP_CHOOSENAN(fs, wc, R, X, Y, '*'); \
- + break; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL): \
- + case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF): \
- + case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO): \
- + R##_s = X##_s; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF): \
- + case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL): \
- + case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL): \
- + case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO): \
- + _FP_FRAC_COPY_##wc(R, X); \
- + R##_c = X##_c; \
- + break; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN): \
- + case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN): \
- + case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN): \
- + R##_s = Y##_s; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF): \
- + case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO): \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + R##_c = Y##_c; \
- + break; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO): \
- + case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF): \
- + R##_s = _FP_NANSIGN_##fs; \
- + R##_c = FP_CLS_NAN; \
- + _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \
- + FP_SET_EXCEPTION(FP_EX_INVALID); \
- + break; \
- + \
- + default: \
- + abort(); \
- + } \
- +} while (0)
- +
- +
- +/*
- + * Main division routine. The input values should be cooked.
- + */
- +
- +#define _FP_DIV(fs, wc, R, X, Y) \
- +do { \
- + R##_s = X##_s ^ Y##_s; \
- + switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \
- + { \
- + case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL): \
- + R##_c = FP_CLS_NORMAL; \
- + R##_e = X##_e - Y##_e; \
- + \
- + _FP_DIV_MEAT_##fs(R,X,Y); \
- + break; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN): \
- + _FP_CHOOSENAN(fs, wc, R, X, Y, '/'); \
- + break; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL): \
- + case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF): \
- + case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO): \
- + R##_s = X##_s; \
- + _FP_FRAC_COPY_##wc(R, X); \
- + R##_c = X##_c; \
- + break; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN): \
- + case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN): \
- + case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN): \
- + R##_s = Y##_s; \
- + _FP_FRAC_COPY_##wc(R, Y); \
- + R##_c = Y##_c; \
- + break; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF): \
- + case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF): \
- + case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL): \
- + R##_c = FP_CLS_ZERO; \
- + break; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO): \
- + FP_SET_EXCEPTION(FP_EX_DIVZERO); \
- + case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO): \
- + case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL): \
- + R##_c = FP_CLS_INF; \
- + break; \
- + \
- + case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF): \
- + case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO): \
- + R##_s = _FP_NANSIGN_##fs; \
- + R##_c = FP_CLS_NAN; \
- + _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \
- + FP_SET_EXCEPTION(FP_EX_INVALID); \
- + break; \
- + \
- + default: \
- + abort(); \
- + } \
- +} while (0)
- +
- +
- +/*
- + * Main differential comparison routine. The inputs should be raw not
- + * cooked. The return is -1,0,1 for normal values, 2 otherwise.
- + */
- +
- +#define _FP_CMP(fs, wc, ret, X, Y, un) \
- + do { \
- + /* NANs are unordered */ \
- + if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \
- + || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \
- + { \
- + ret = un; \
- + } \
- + else \
- + { \
- + int __is_zero_x; \
- + int __is_zero_y; \
- + \
- + __is_zero_x = (!X##_e && _FP_FRAC_ZEROP_##wc(X)) ? 1 : 0; \
- + __is_zero_y = (!Y##_e && _FP_FRAC_ZEROP_##wc(Y)) ? 1 : 0; \
- + \
- + if (__is_zero_x && __is_zero_y) \
- + ret = 0; \
- + else if (__is_zero_x) \
- + ret = Y##_s ? 1 : -1; \
- + else if (__is_zero_y) \
- + ret = X##_s ? -1 : 1; \
- + else if (X##_s != Y##_s) \
- + ret = X##_s ? -1 : 1; \
- + else if (X##_e > Y##_e) \
- + ret = X##_s ? -1 : 1; \
- + else if (X##_e < Y##_e) \
- + ret = X##_s ? 1 : -1; \
- + else if (_FP_FRAC_GT_##wc(X, Y)) \
- + ret = X##_s ? -1 : 1; \
- + else if (_FP_FRAC_GT_##wc(Y, X)) \
- + ret = X##_s ? 1 : -1; \
- + else \
- + ret = 0; \
- + } \
- + } while (0)
- +
- +
- +/* Simplification for strict equality. */
- +
- +#define _FP_CMP_EQ(fs, wc, ret, X, Y) \
- + do { \
- + /* NANs are unordered */ \
- + if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \
- + || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \
- + { \
- + ret = 1; \
- + } \
- + else \
- + { \
- + ret = !(X##_e == Y##_e \
- + && _FP_FRAC_EQ_##wc(X, Y) \
- + && (X##_s == Y##_s || (!X##_e && _FP_FRAC_ZEROP_##wc(X)))); \
- + } \
- + } while (0)
- +
- +/* Version to test unordered. */
- +
- +#define _FP_CMP_UNORD(fs, wc, ret, X, Y) \
- + do { \
- + ret = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \
- + || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))); \
- + } while (0)
- +
- +/*
- + * Main square root routine. The input value should be cooked.
- + */
- +
- +#define _FP_SQRT(fs, wc, R, X) \
- +do { \
- + _FP_FRAC_DECL_##wc(T); _FP_FRAC_DECL_##wc(S); \
- + _FP_W_TYPE q; \
- + switch (X##_c) \
- + { \
- + case FP_CLS_NAN: \
- + _FP_FRAC_COPY_##wc(R, X); \
- + R##_s = X##_s; \
- + R##_c = FP_CLS_NAN; \
- + break; \
- + case FP_CLS_INF: \
- + if (X##_s) \
- + { \
- + R##_s = _FP_NANSIGN_##fs; \
- + R##_c = FP_CLS_NAN; /* NAN */ \
- + _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \
- + FP_SET_EXCEPTION(FP_EX_INVALID); \
- + } \
- + else \
- + { \
- + R##_s = 0; \
- + R##_c = FP_CLS_INF; /* sqrt(+inf) = +inf */ \
- + } \
- + break; \
- + case FP_CLS_ZERO: \
- + R##_s = X##_s; \
- + R##_c = FP_CLS_ZERO; /* sqrt(+-0) = +-0 */ \
- + break; \
- + case FP_CLS_NORMAL: \
- + R##_s = 0; \
- + if (X##_s) \
- + { \
- + R##_c = FP_CLS_NAN; /* sNAN */ \
- + R##_s = _FP_NANSIGN_##fs; \
- + _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \
- + FP_SET_EXCEPTION(FP_EX_INVALID); \
- + break; \
- + } \
- + R##_c = FP_CLS_NORMAL; \
- + if (X##_e & 1) \
- + _FP_FRAC_SLL_##wc(X, 1); \
- + R##_e = X##_e >> 1; \
- + _FP_FRAC_SET_##wc(S, _FP_ZEROFRAC_##wc); \
- + _FP_FRAC_SET_##wc(R, _FP_ZEROFRAC_##wc); \
- + q = _FP_OVERFLOW_##fs >> 1; \
- + _FP_SQRT_MEAT_##wc(R, S, T, X, q); \
- + } \
- + } while (0)
- +
- +/*
- + * Convert from FP to integer. Input is raw.
- + */
- +
- +/* RSIGNED can have following values:
- + * 0: the number is required to be 0..(2^rsize)-1, if not, NV is set plus
- + * the result is either 0 or (2^rsize)-1 depending on the sign in such
- + * case.
- + * 1: the number is required to be -(2^(rsize-1))..(2^(rsize-1))-1, if not,
- + * NV is set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
- + * depending on the sign in such case.
- + * -1: the number is required to be -(2^(rsize-1))..(2^rsize)-1, if not, NV is
- + * set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
- + * depending on the sign in such case.
- + */
- +#define _FP_TO_INT(fs, wc, r, X, rsize, rsigned) \
- +do { \
- + if (X##_e < _FP_EXPBIAS_##fs) \
- + { \
- + r = 0; \
- + if (X##_e == 0) \
- + { \
- + if (!_FP_FRAC_ZEROP_##wc(X)) \
- + { \
- + FP_SET_EXCEPTION(FP_EX_INEXACT); \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + } \
- + } \
- + else \
- + FP_SET_EXCEPTION(FP_EX_INEXACT); \
- + } \
- + else if (X##_e >= _FP_EXPBIAS_##fs + rsize - (rsigned > 0 || X##_s) \
- + || (!rsigned && X##_s)) \
- + { \
- + /* Overflow or converting to the most negative integer. */ \
- + if (rsigned) \
- + { \
- + r = 1; \
- + r <<= rsize - 1; \
- + r -= 1 - X##_s; \
- + } else { \
- + r = 0; \
- + if (X##_s) \
- + r = ~r; \
- + } \
- + \
- + if (rsigned && X##_s && X##_e == _FP_EXPBIAS_##fs + rsize - 1) \
- + { \
- + /* Possibly converting to most negative integer; check the \
- + mantissa. */ \
- + int inexact = 0; \
- + (void)((_FP_FRACBITS_##fs > rsize) \
- + ? ({ _FP_FRAC_SRST_##wc(X, inexact, \
- + _FP_FRACBITS_##fs - rsize, \
- + _FP_FRACBITS_##fs); 0; }) \
- + : 0); \
- + if (!_FP_FRAC_ZEROP_##wc(X)) \
- + FP_SET_EXCEPTION(FP_EX_INVALID); \
- + else if (inexact) \
- + FP_SET_EXCEPTION(FP_EX_INEXACT); \
- + } \
- + else \
- + FP_SET_EXCEPTION(FP_EX_INVALID); \
- + } \
- + else \
- + { \
- + _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_IMPLBIT_##fs; \
- + if (X##_e >= _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1) \
- + { \
- + _FP_FRAC_ASSEMBLE_##wc(r, X, rsize); \
- + r <<= X##_e - _FP_EXPBIAS_##fs - _FP_FRACBITS_##fs + 1; \
- + } \
- + else \
- + { \
- + int inexact; \
- + _FP_FRAC_SRST_##wc(X, inexact, \
- + (_FP_FRACBITS_##fs + _FP_EXPBIAS_##fs - 1 \
- + - X##_e), \
- + _FP_FRACBITS_##fs); \
- + if (inexact) \
- + FP_SET_EXCEPTION(FP_EX_INEXACT); \
- + _FP_FRAC_ASSEMBLE_##wc(r, X, rsize); \
- + } \
- + if (rsigned && X##_s) \
- + r = -r; \
- + } \
- +} while (0)
- +
- +/* Convert integer to fp. Output is raw. RTYPE is unsigned even if
- + input is signed. */
- +#define _FP_FROM_INT(fs, wc, X, r, rsize, rtype) \
- + do { \
- + if (r) \
- + { \
- + rtype ur_; \
- + \
- + if ((X##_s = (r < 0))) \
- + r = -(rtype)r; \
- + \
- + ur_ = (rtype) r; \
- + (void)((rsize <= _FP_W_TYPE_SIZE) \
- + ? ({ \
- + int lz_; \
- + __FP_CLZ(lz_, (_FP_W_TYPE)ur_); \
- + X##_e = _FP_EXPBIAS_##fs + _FP_W_TYPE_SIZE - 1 - lz_; \
- + }) \
- + : ((rsize <= 2 * _FP_W_TYPE_SIZE) \
- + ? ({ \
- + int lz_; \
- + __FP_CLZ_2(lz_, (_FP_W_TYPE)(ur_ >> _FP_W_TYPE_SIZE), \
- + (_FP_W_TYPE)ur_); \
- + X##_e = (_FP_EXPBIAS_##fs + 2 * _FP_W_TYPE_SIZE - 1 \
- + - lz_); \
- + }) \
- + : (abort(), 0))); \
- + \
- + if (rsize - 1 + _FP_EXPBIAS_##fs >= _FP_EXPMAX_##fs \
- + && X##_e >= _FP_EXPMAX_##fs) \
- + { \
- + /* Exponent too big; overflow to infinity. (May also \
- + happen after rounding below.) */ \
- + _FP_OVERFLOW_SEMIRAW(fs, wc, X); \
- + goto pack_semiraw; \
- + } \
- + \
- + if (rsize <= _FP_FRACBITS_##fs \
- + || X##_e < _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs) \
- + { \
- + /* Exactly representable; shift left. */ \
- + _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize); \
- + _FP_FRAC_SLL_##wc(X, (_FP_EXPBIAS_##fs \
- + + _FP_FRACBITS_##fs - 1 - X##_e)); \
- + } \
- + else \
- + { \
- + /* More bits in integer than in floating type; need to \
- + round. */ \
- + if (_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 < X##_e) \
- + ur_ = ((ur_ >> (X##_e - _FP_EXPBIAS_##fs \
- + - _FP_WFRACBITS_##fs + 1)) \
- + | ((ur_ << (rsize - (X##_e - _FP_EXPBIAS_##fs \
- + - _FP_WFRACBITS_##fs + 1))) \
- + != 0)); \
- + _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize); \
- + if ((_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 - X##_e) > 0) \
- + _FP_FRAC_SLL_##wc(X, (_FP_EXPBIAS_##fs \
- + + _FP_WFRACBITS_##fs - 1 - X##_e)); \
- + _FP_FRAC_HIGH_##fs(X) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs; \
- + pack_semiraw: \
- + _FP_PACK_SEMIRAW(fs, wc, X); \
- + } \
- + } \
- + else \
- + { \
- + X##_s = 0; \
- + X##_e = 0; \
- + _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \
- + } \
- + } while (0)
- +
- +
- +/* Extend from a narrower floating-point format to a wider one. Input
- + and output are raw. */
- +#define FP_EXTEND(dfs,sfs,dwc,swc,D,S) \
- +do { \
- + if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs \
- + || (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs \
- + < _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs) \
- + || (_FP_EXPBIAS_##dfs < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1 \
- + && _FP_EXPBIAS_##dfs != _FP_EXPBIAS_##sfs)) \
- + abort(); \
- + D##_s = S##_s; \
- + _FP_FRAC_COPY_##dwc##_##swc(D, S); \
- + if (_FP_EXP_NORMAL(sfs, swc, S)) \
- + { \
- + D##_e = S##_e + _FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs; \
- + _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs - _FP_FRACBITS_##sfs)); \
- + } \
- + else \
- + { \
- + if (S##_e == 0) \
- + { \
- + if (_FP_FRAC_ZEROP_##swc(S)) \
- + D##_e = 0; \
- + else if (_FP_EXPBIAS_##dfs \
- + < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1) \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs \
- + - _FP_FRACBITS_##sfs)); \
- + D##_e = 0; \
- + } \
- + else \
- + { \
- + int _lz; \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + _FP_FRAC_CLZ_##swc(_lz, S); \
- + _FP_FRAC_SLL_##dwc(D, \
- + _lz + _FP_FRACBITS_##dfs \
- + - _FP_FRACTBITS_##sfs); \
- + D##_e = (_FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs + 1 \
- + + _FP_FRACXBITS_##sfs - _lz); \
- + } \
- + } \
- + else \
- + { \
- + D##_e = _FP_EXPMAX_##dfs; \
- + if (!_FP_FRAC_ZEROP_##swc(S)) \
- + { \
- + if (!(_FP_FRAC_HIGH_RAW_##sfs(S) & _FP_QNANBIT_##sfs)) \
- + FP_SET_EXCEPTION(FP_EX_INVALID); \
- + _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs \
- + - _FP_FRACBITS_##sfs)); \
- + } \
- + } \
- + } \
- +} while (0)
- +
- +/* Truncate from a wider floating-point format to a narrower one.
- + Input and output are semi-raw. */
- +#define FP_TRUNC(dfs,sfs,dwc,swc,D,S) \
- +do { \
- + if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs \
- + || (_FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1 \
- + && _FP_EXPBIAS_##sfs != _FP_EXPBIAS_##dfs)) \
- + abort(); \
- + D##_s = S##_s; \
- + if (_FP_EXP_NORMAL(sfs, swc, S)) \
- + { \
- + D##_e = S##_e + _FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs; \
- + if (D##_e >= _FP_EXPMAX_##dfs) \
- + _FP_OVERFLOW_SEMIRAW(dfs, dwc, D); \
- + else \
- + { \
- + if (D##_e <= 0) \
- + { \
- + if (D##_e < 1 - _FP_FRACBITS_##dfs) \
- + { \
- + _FP_FRAC_SET_##swc(S, _FP_ZEROFRAC_##swc); \
- + _FP_FRAC_LOW_##swc(S) |= 1; \
- + } \
- + else \
- + { \
- + _FP_FRAC_HIGH_##sfs(S) |= _FP_IMPLBIT_SH_##sfs; \
- + _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs \
- + - _FP_WFRACBITS_##dfs + 1 - D##_e), \
- + _FP_WFRACBITS_##sfs); \
- + } \
- + D##_e = 0; \
- + } \
- + else \
- + _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs \
- + - _FP_WFRACBITS_##dfs), \
- + _FP_WFRACBITS_##sfs); \
- + _FP_FRAC_COPY_##dwc##_##swc(D, S); \
- + } \
- + } \
- + else \
- + { \
- + if (S##_e == 0) \
- + { \
- + D##_e = 0; \
- + if (_FP_FRAC_ZEROP_##swc(S)) \
- + _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc); \
- + else \
- + { \
- + FP_SET_EXCEPTION(FP_EX_DENORM); \
- + if (_FP_EXPBIAS_##sfs \
- + < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1) \
- + { \
- + _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs \
- + - _FP_WFRACBITS_##dfs), \
- + _FP_WFRACBITS_##sfs); \
- + _FP_FRAC_COPY_##dwc##_##swc(D, S); \
- + } \
- + else \
- + { \
- + _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc); \
- + _FP_FRAC_LOW_##dwc(D) |= 1; \
- + } \
- + } \
- + } \
- + else \
- + { \
- + D##_e = _FP_EXPMAX_##dfs; \
- + if (_FP_FRAC_ZEROP_##swc(S)) \
- + _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc); \
- + else \
- + { \
- + _FP_CHECK_SIGNAN_SEMIRAW(sfs, swc, S); \
- + _FP_FRAC_SRL_##swc(S, (_FP_WFRACBITS_##sfs \
- + - _FP_WFRACBITS_##dfs)); \
- + _FP_FRAC_COPY_##dwc##_##swc(D, S); \
- + /* Semi-raw NaN must have all workbits cleared. */ \
- + _FP_FRAC_LOW_##dwc(D) \
- + &= ~(_FP_W_TYPE) ((1 << _FP_WORKBITS) - 1); \
- + _FP_FRAC_HIGH_##dfs(D) |= _FP_QNANBIT_SH_##dfs; \
- + } \
- + } \
- + } \
- +} while (0)
- +
- +/*
- + * Helper primitives.
- + */
- +
- +/* Count leading zeros in a word. */
- +
- +#ifndef __FP_CLZ
- +/* GCC 3.4 and later provide the builtins for us. */
- +#define __FP_CLZ(r, x) \
- + do { \
- + if (sizeof (_FP_W_TYPE) == sizeof (unsigned int)) \
- + r = __builtin_clz (x); \
- + else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long)) \
- + r = __builtin_clzl (x); \
- + else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long long)) \
- + r = __builtin_clzll (x); \
- + else \
- + abort (); \
- + } while (0)
- +#endif /* ndef __FP_CLZ */
- +
- +#define _FP_DIV_HELP_imm(q, r, n, d) \
- + do { \
- + q = n / d, r = n % d; \
- + } while (0)
- +
- +
- +/* A restoring bit-by-bit division primitive. */
- +
- +#define _FP_DIV_MEAT_N_loop(fs, wc, R, X, Y) \
- + do { \
- + int count = _FP_WFRACBITS_##fs; \
- + _FP_FRAC_DECL_##wc (u); \
- + _FP_FRAC_DECL_##wc (v); \
- + _FP_FRAC_COPY_##wc (u, X); \
- + _FP_FRAC_COPY_##wc (v, Y); \
- + _FP_FRAC_SET_##wc (R, _FP_ZEROFRAC_##wc); \
- + /* Normalize U and V. */ \
- + _FP_FRAC_SLL_##wc (u, _FP_WFRACXBITS_##fs); \
- + _FP_FRAC_SLL_##wc (v, _FP_WFRACXBITS_##fs); \
- + /* First round. Since the operands are normalized, either the \
- + first or second bit will be set in the fraction. Produce a \
- + normalized result by checking which and adjusting the loop \
- + count and exponent accordingly. */ \
- + if (_FP_FRAC_GE_1 (u, v)) \
- + { \
- + _FP_FRAC_SUB_##wc (u, u, v); \
- + _FP_FRAC_LOW_##wc (R) |= 1; \
- + count--; \
- + } \
- + else \
- + R##_e--; \
- + /* Subsequent rounds. */ \
- + do { \
- + int msb = (_FP_WS_TYPE) _FP_FRAC_HIGH_##wc (u) < 0; \
- + _FP_FRAC_SLL_##wc (u, 1); \
- + _FP_FRAC_SLL_##wc (R, 1); \
- + if (msb || _FP_FRAC_GE_1 (u, v)) \
- + { \
- + _FP_FRAC_SUB_##wc (u, u, v); \
- + _FP_FRAC_LOW_##wc (R) |= 1; \
- + } \
- + } while (--count > 0); \
- + /* If there's anything left in U, the result is inexact. */ \
- + _FP_FRAC_LOW_##wc (R) |= !_FP_FRAC_ZEROP_##wc (u); \
- + } while (0)
- +
- +#define _FP_DIV_MEAT_1_loop(fs, R, X, Y) _FP_DIV_MEAT_N_loop (fs, 1, R, X, Y)
- +#define _FP_DIV_MEAT_2_loop(fs, R, X, Y) _FP_DIV_MEAT_N_loop (fs, 2, R, X, Y)
- +#define _FP_DIV_MEAT_4_loop(fs, R, X, Y) _FP_DIV_MEAT_N_loop (fs, 4, R, X, Y)
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_add.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_add.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_add.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_add.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,39 @@
- +/* Software floating-point emulation.
- + Return a + b
- + Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long double _Q_add(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C);
- + long double c;
- +
- + FP_INIT_ROUNDMODE;
- + FP_UNPACK_SEMIRAW_Q(A, a);
- + FP_UNPACK_SEMIRAW_Q(B, b);
- + FP_ADD_Q(C, A, B);
- + FP_PACK_SEMIRAW_Q(c, C);
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_cmp.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_cmp.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_cmp.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_cmp.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,41 @@
- +/* Software floating-point emulation.
- + Compare a and b, return float condition code.
- + Copyright (C) 1997,1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +int _Q_cmp(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B);
- + int r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_UNPACK_RAW_Q(B, b);
- + FP_CMP_Q(r, B, A, 3);
- + if (r == -1) r = 2;
- + if (r == 3 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
- + FP_SET_EXCEPTION(FP_EX_INVALID);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return r;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_cmpe.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_cmpe.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_cmpe.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_cmpe.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,42 @@
- +/* Software floating-point emulation.
- + Compare a and b, return float condition code.
- + Signal exception (unless masked) if unordered.
- + Copyright (C) 1997,1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +int _Q_cmpe(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B);
- + int r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_UNPACK_RAW_Q(B, b);
- + FP_CMP_Q(r, B, A, 3);
- + if (r == -1) r = 2;
- + if (r == 3)
- + FP_SET_EXCEPTION(FP_EX_INVALID);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return r;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_div.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_div.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_div.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_div.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,39 @@
- +/* Software floating-point emulation.
- + Return a / b
- + Copyright (C) 1997, 1999, 2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long double _Q_div(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C);
- + long double c;
- +
- + FP_INIT_ROUNDMODE;
- + FP_UNPACK_Q(A, a);
- + FP_UNPACK_Q(B, b);
- + FP_DIV_Q(C, A, B);
- + FP_PACK_Q(c, C);
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_dtoq.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_dtoq.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_dtoq.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_dtoq.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,44 @@
- +/* Software floating-point emulation.
- + Return (long double)(a)
- + Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "double.h"
- +#include "quad.h"
- +
- +long double _Q_dtoq(const double a)
- +{
- + FP_DECL_EX;
- + FP_DECL_D(A);
- + FP_DECL_Q(C);
- + long double c;
- +
- + FP_INIT_ROUNDMODE;
- + FP_UNPACK_RAW_D(A, a);
- +#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
- + FP_EXTEND(Q,D,4,2,C,A);
- +#else
- + FP_EXTEND(Q,D,2,1,C,A);
- +#endif
- + FP_PACK_RAW_Q(c, C);
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_feq.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_feq.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_feq.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_feq.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,40 @@
- +/* Software floating-point emulation.
- + Return 1 if a == b
- + Copyright (C) 1997,1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +int _Q_feq(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B);
- + int r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_UNPACK_RAW_Q(B, b);
- + FP_CMP_EQ_Q(r, A, B);
- + if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
- + FP_SET_EXCEPTION(FP_EX_INVALID);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return !r;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_fge.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_fge.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_fge.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_fge.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,40 @@
- +/* Software floating-point emulation.
- + Return 1 if a >= b
- + Copyright (C) 1997,1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +int _Q_fge(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B);
- + int r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_UNPACK_RAW_Q(B, b);
- + FP_CMP_Q(r, B, A, 3);
- + if (r == 3)
- + FP_SET_EXCEPTION(FP_EX_INVALID);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return (r <= 0);
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_fgt.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_fgt.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_fgt.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_fgt.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,40 @@
- +/* Software floating-point emulation.
- + Return 1 if a > b
- + Copyright (C) 1997,1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +int _Q_fgt(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B);
- + int r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_UNPACK_RAW_Q(B, b);
- + FP_CMP_Q(r, B, A, 3);
- + if (r == 3)
- + FP_SET_EXCEPTION(FP_EX_INVALID);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return (r == -1);
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_fle.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_fle.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_fle.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_fle.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,40 @@
- +/* Software floating-point emulation.
- + Return 1 if a <= b
- + Copyright (C) 1997,1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +int _Q_fle(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B);
- + int r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_UNPACK_RAW_Q(B, b);
- + FP_CMP_Q(r, B, A, -2);
- + if (r == -2)
- + FP_SET_EXCEPTION(FP_EX_INVALID);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return (r >= 0);
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_flt.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_flt.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_flt.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_flt.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,40 @@
- +/* Software floating-point emulation.
- + Return 1 if a < b
- + Copyright (C) 1997,1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +int _Q_flt(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B);
- + int r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_UNPACK_RAW_Q(B, b);
- + FP_CMP_Q(r, B, A, 3);
- + if (r == 3)
- + FP_SET_EXCEPTION(FP_EX_INVALID);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return (r == 1);
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_fne.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_fne.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_fne.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_fne.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,40 @@
- +/* Software floating-point emulation.
- + Return 1 if a != b
- + Copyright (C) 1997,1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +int _Q_fne(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B);
- + int r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_UNPACK_RAW_Q(B, b);
- + FP_CMP_EQ_Q(r, A, B);
- + if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
- + FP_SET_EXCEPTION(FP_EX_INVALID);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return r;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_itoq.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_itoq.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_itoq.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_itoq.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,38 @@
- +/* Software floating-point emulation.
- + Return (long double)(a)
- + Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long double _Q_itoq(const int a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(C);
- + int b = a;
- + long double c;
- +
- + FP_FROM_INT_Q(C, b, 32, unsigned int);
- + FP_PACK_RAW_Q(c, C);
- + FP_CLEAR_EXCEPTIONS;
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_lltoq.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_lltoq.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_lltoq.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_lltoq.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,38 @@
- +/* Software floating-point emulation.
- + Return (long double)a
- + Copyright (C) 1997, 1999, 2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long double _Q_lltoq(const long long a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(C);
- + long double c;
- + long long b = a;
- +
- + FP_FROM_INT_Q(C, b, 64, unsigned long long);
- + FP_PACK_RAW_Q(c, C);
- + FP_CLEAR_EXCEPTIONS;
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_mul.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_mul.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_mul.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_mul.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,39 @@
- +/* Software floating-point emulation.
- + Return a * b
- + Copyright (C) 1997,1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long double _Q_mul(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C);
- + long double c;
- +
- + FP_INIT_ROUNDMODE;
- + FP_UNPACK_Q(A, a);
- + FP_UNPACK_Q(B, b);
- + FP_MUL_Q(C, A, B);
- + FP_PACK_Q(c, C);
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_neg.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_neg.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_neg.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_neg.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,47 @@
- +/* Software floating-point emulation.
- + Return !a
- + Copyright (C) 1997,1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long double _Q_neg(const long double a)
- +{
- + FP_DECL_EX;
- + long double c = a;
- +
- +#if (__BYTE_ORDER == __BIG_ENDIAN)
- + ((UWtype *)&c)[0] ^= (((UWtype)1) << (W_TYPE_SIZE - 1));
- +#elif (__BYTE_ORDER == __LITTLE_ENDIAN) && (W_TYPE_SIZE == 64)
- + ((UWtype *)&c)[1] ^= (((UWtype)1) << (W_TYPE_SIZE - 1));
- +#elif (__BYTE_ORDER == __LITTLE_ENDIAN) && (W_TYPE_SIZE == 32)
- + ((UWtype *)&c)[3] ^= (((UWtype)1) << (W_TYPE_SIZE - 1));
- +#else
- + FP_DECL_Q(A); FP_DECL_Q(C);
- +
- + FP_UNPACK_Q(A, a);
- + FP_NEG_Q(C, A);
- + FP_PACK_Q(c, C);
- +#endif
- + FP_CLEAR_EXCEPTIONS;
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtod.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtod.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtod.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtod.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,45 @@
- +/* Software floating-point emulation.
- + Return (double)a
- + Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "double.h"
- +#include "quad.h"
- +
- +double _Q_qtod(const long double a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A);
- + FP_DECL_D(R);
- + double r;
- +
- + FP_INIT_ROUNDMODE;
- + FP_UNPACK_SEMIRAW_Q(A, a);
- +#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
- + FP_TRUNC(D,Q,2,4,R,A);
- +#else
- + FP_TRUNC(D,Q,1,2,R,A);
- +#endif
- + FP_PACK_SEMIRAW_D(r, R);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return r;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtoi.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtoi.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtoi.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtoi.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,38 @@
- +/* Software floating-point emulation.
- + Return (int)a
- + Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#define FP_ROUNDMODE FP_RND_ZERO
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +int _Q_qtoi(const long double a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A);
- + unsigned int r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_TO_INT_Q(r, A, 32, 1);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return r;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtoll.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtoll.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtoll.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtoll.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,38 @@
- +/* Software floating-point emulation.
- + Return (long long)a
- + Copyright (C) 1997, 1999, 2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#define FP_ROUNDMODE FP_RND_ZERO
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long long _Q_qtoll(const long double a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A);
- + unsigned long long r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_TO_INT_Q(r, A, 64, 1);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return r;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtos.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtos.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtos.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtos.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,45 @@
- +/* Software floating-point emulation.
- + Return (float)a
- + Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "single.h"
- +#include "quad.h"
- +
- +float _Q_qtos(const long double a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A);
- + FP_DECL_S(R);
- + float r;
- +
- + FP_INIT_ROUNDMODE;
- + FP_UNPACK_SEMIRAW_Q(A, a);
- +#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
- + FP_TRUNC(S,Q,1,4,R,A);
- +#else
- + FP_TRUNC(S,Q,1,2,R,A);
- +#endif
- + FP_PACK_SEMIRAW_S(r, R);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return r;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtou.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtou.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtou.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtou.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,38 @@
- +/* Software floating-point emulation.
- + Return (unsigned int)a
- + Copyright (C) 1997, 1999, 2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#define FP_ROUNDMODE FP_RND_ZERO
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +unsigned int _Q_qtou(const long double a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A);
- + unsigned int r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_TO_INT_Q(r, A, 32, -1);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return r;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtoull.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtoull.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_qtoull.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_qtoull.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,38 @@
- +/* Software floating-point emulation.
- + Return (unsigned long long)a
- + Copyright (C) 1997, 1999, 2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#define FP_ROUNDMODE FP_RND_ZERO
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +unsigned long long _Q_qtoull(const long double a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A);
- + unsigned long long r;
- +
- + FP_UNPACK_RAW_Q(A, a);
- + FP_TO_INT_Q(r, A, 64, -1);
- + FP_HANDLE_EXCEPTIONS;
- +
- + return r;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_sqrt.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_sqrt.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_sqrt.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_sqrt.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,39 @@
- +/* Software floating-point emulation.
- + Return sqrtl(a)
- + Copyright (C) 1997, 1999, 2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long double _Q_sqrt(const long double a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(C);
- + long double c;
- +
- + FP_INIT_ROUNDMODE;
- + FP_UNPACK_Q(A, a);
- + FP_SQRT_Q(C, A);
- + FP_PACK_Q(c, C);
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- +strong_alias (_Q_sqrt, __ieee754_sqrtl);
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_stoq.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_stoq.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_stoq.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_stoq.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,43 @@
- +/* Software floating-point emulation.
- + c = (long double)(a)
- + Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "single.h"
- +#include "quad.h"
- +
- +long double _Q_stoq(const float a)
- +{
- + FP_DECL_EX;
- + FP_DECL_S(A);
- + FP_DECL_Q(C);
- + long double c;
- +
- + FP_UNPACK_RAW_S(A, a);
- +#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
- + FP_EXTEND(Q,S,4,1,C,A);
- +#else
- + FP_EXTEND(Q,S,2,1,C,A);
- +#endif
- + FP_PACK_RAW_Q(c, C);
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_sub.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_sub.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_sub.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_sub.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,39 @@
- +/* Software floating-point emulation.
- + c = a - b
- + Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long double _Q_sub(const long double a, const long double b)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C);
- + long double c;
- +
- + FP_INIT_ROUNDMODE;
- + FP_UNPACK_SEMIRAW_Q(A, a);
- + FP_UNPACK_SEMIRAW_Q(B, b);
- + FP_SUB_Q(C, A, B);
- + FP_PACK_SEMIRAW_Q(c, C);
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_ulltoq.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_ulltoq.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_ulltoq.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_ulltoq.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,38 @@
- +/* Software floating-point emulation.
- + Return (long double)(a)
- + Copyright (C) 1997, 1999, 2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long double _Q_ulltoq(const unsigned long long a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(C);
- + long double c;
- + unsigned long long b = a;
- +
- + FP_FROM_INT_Q(C, b, 64, unsigned long long);
- + FP_PACK_RAW_Q(c, C);
- + FP_CLEAR_EXCEPTIONS;
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_util.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_util.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_util.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_util.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,57 @@
- +/* Software floating-point emulation.
- + Helper routine for _Q_* routines.
- + Simulate exceptions using double arithmetics.
- + Copyright (C) 1999 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +
- +unsigned long long ___Q_numbers [] = {
- +0x0000000000000000ULL, /* Zero */
- +0x0010100000000000ULL, /* Very tiny number */
- +0x0010000000000000ULL, /* Minimum normalized number */
- +0x7fef000000000000ULL, /* A huge double number */
- +};
- +
- +double ___Q_simulate_exceptions(int exceptions)
- +{
- + double d, *p = (double *)___Q_numbers;
- + if (exceptions & FP_EX_INVALID)
- + d = p[0]/p[0];
- + if (exceptions & FP_EX_OVERFLOW)
- + {
- + d = p[3] + p[3];
- + exceptions &= ~FP_EX_INEXACT;
- + }
- + if (exceptions & FP_EX_UNDERFLOW)
- + {
- + if (exceptions & FP_EX_INEXACT)
- + {
- + d = p[2] * p[2];
- + exceptions &= ~FP_EX_INEXACT;
- + }
- + else
- + d = p[1] - p[2];
- + }
- + if (exceptions & FP_EX_DIVZERO)
- + d = 1.0/p[0];
- + if (exceptions & FP_EX_INEXACT)
- + d = p[3] - p[2];
- + return d;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_utoq.c uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_utoq.c
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/q_utoq.c 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/q_utoq.c 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,38 @@
- +/* Software floating-point emulation.
- + c = (long double)(a)
- + Copyright (C) 1997, 1999, 2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com) and
- + Jakub Jelinek (jj@ultra.linux.cz).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include "soft-fp.h"
- +#include "quad.h"
- +
- +long double _Q_utoq(const unsigned int a)
- +{
- + FP_DECL_EX;
- + FP_DECL_Q(C);
- + long double c;
- + unsigned int b = a;
- +
- + FP_FROM_INT_Q(C, b, 32, unsigned int);
- + FP_PACK_RAW_Q(c, C);
- + FP_CLEAR_EXCEPTIONS;
- + FP_HANDLE_EXCEPTIONS;
- + return c;
- +}
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/quad.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/quad.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/quad.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/quad.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,271 @@
- +/* Software floating-point emulation.
- + Definitions for IEEE Quad Precision.
- + Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com),
- + Jakub Jelinek (jj@ultra.linux.cz),
- + David S. Miller (davem@redhat.com) and
- + Peter Maydell (pmaydell@chiark.greenend.org.uk).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + In addition to the permissions in the GNU Lesser General Public
- + License, the Free Software Foundation gives you unlimited
- + permission to link the compiled version of this file into
- + combinations with other programs, and to distribute those
- + combinations without any restriction coming from the use of this
- + file. (The Lesser General Public License restrictions do apply in
- + other respects; for example, they cover modification of the file,
- + and distribution when not linked into a combine executable.)
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
- + MA 02110-1301, USA. */
- +
- +#if _FP_W_TYPE_SIZE < 32
- +#error "Here's a nickel, kid. Go buy yourself a real computer."
- +#endif
- +
- +#if _FP_W_TYPE_SIZE < 64
- +#define _FP_FRACTBITS_Q (4*_FP_W_TYPE_SIZE)
- +#else
- +#define _FP_FRACTBITS_Q (2*_FP_W_TYPE_SIZE)
- +#endif
- +
- +#define _FP_FRACBITS_Q 113
- +#define _FP_FRACXBITS_Q (_FP_FRACTBITS_Q - _FP_FRACBITS_Q)
- +#define _FP_WFRACBITS_Q (_FP_WORKBITS + _FP_FRACBITS_Q)
- +#define _FP_WFRACXBITS_Q (_FP_FRACTBITS_Q - _FP_WFRACBITS_Q)
- +#define _FP_EXPBITS_Q 15
- +#define _FP_EXPBIAS_Q 16383
- +#define _FP_EXPMAX_Q 32767
- +
- +#define _FP_QNANBIT_Q \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2) % _FP_W_TYPE_SIZE)
- +#define _FP_QNANBIT_SH_Q \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
- +#define _FP_IMPLBIT_Q \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1) % _FP_W_TYPE_SIZE)
- +#define _FP_IMPLBIT_SH_Q \
- + ((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
- +#define _FP_OVERFLOW_Q \
- + ((_FP_W_TYPE)1 << (_FP_WFRACBITS_Q % _FP_W_TYPE_SIZE))
- +
- +typedef float TFtype __attribute__((mode(TF)));
- +
- +#if _FP_W_TYPE_SIZE < 64
- +
- +union _FP_UNION_Q
- +{
- + TFtype flt;
- + struct
- + {
- +#if __BYTE_ORDER == __BIG_ENDIAN
- + unsigned sign : 1;
- + unsigned exp : _FP_EXPBITS_Q;
- + unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
- + unsigned long frac2 : _FP_W_TYPE_SIZE;
- + unsigned long frac1 : _FP_W_TYPE_SIZE;
- + unsigned long frac0 : _FP_W_TYPE_SIZE;
- +#else
- + unsigned long frac0 : _FP_W_TYPE_SIZE;
- + unsigned long frac1 : _FP_W_TYPE_SIZE;
- + unsigned long frac2 : _FP_W_TYPE_SIZE;
- + unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
- + unsigned exp : _FP_EXPBITS_Q;
- + unsigned sign : 1;
- +#endif /* not bigendian */
- + } bits __attribute__((packed));
- +};
- +
- +
- +#define FP_DECL_Q(X) _FP_DECL(4,X)
- +#define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_4(Q,X,val)
- +#define FP_UNPACK_RAW_QP(X,val) _FP_UNPACK_RAW_4_P(Q,X,val)
- +#define FP_PACK_RAW_Q(val,X) _FP_PACK_RAW_4(Q,val,X)
- +#define FP_PACK_RAW_QP(val,X) \
- + do { \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_4_P(Q,val,X); \
- + } while (0)
- +
- +#define FP_UNPACK_Q(X,val) \
- + do { \
- + _FP_UNPACK_RAW_4(Q,X,val); \
- + _FP_UNPACK_CANONICAL(Q,4,X); \
- + } while (0)
- +
- +#define FP_UNPACK_QP(X,val) \
- + do { \
- + _FP_UNPACK_RAW_4_P(Q,X,val); \
- + _FP_UNPACK_CANONICAL(Q,4,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_Q(X,val) \
- + do { \
- + _FP_UNPACK_RAW_4(Q,X,val); \
- + _FP_UNPACK_SEMIRAW(Q,4,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_QP(X,val) \
- + do { \
- + _FP_UNPACK_RAW_4_P(Q,X,val); \
- + _FP_UNPACK_SEMIRAW(Q,4,X); \
- + } while (0)
- +
- +#define FP_PACK_Q(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(Q,4,X); \
- + _FP_PACK_RAW_4(Q,val,X); \
- + } while (0)
- +
- +#define FP_PACK_QP(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(Q,4,X); \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_4_P(Q,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_Q(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(Q,4,X); \
- + _FP_PACK_RAW_4(Q,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_QP(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(Q,4,X); \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_4_P(Q,val,X); \
- + } while (0)
- +
- +#define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN(Q,4,X)
- +#define FP_NEG_Q(R,X) _FP_NEG(Q,4,R,X)
- +#define FP_ADD_Q(R,X,Y) _FP_ADD(Q,4,R,X,Y)
- +#define FP_SUB_Q(R,X,Y) _FP_SUB(Q,4,R,X,Y)
- +#define FP_MUL_Q(R,X,Y) _FP_MUL(Q,4,R,X,Y)
- +#define FP_DIV_Q(R,X,Y) _FP_DIV(Q,4,R,X,Y)
- +#define FP_SQRT_Q(R,X) _FP_SQRT(Q,4,R,X)
- +#define _FP_SQRT_MEAT_Q(R,S,T,X,Q) _FP_SQRT_MEAT_4(R,S,T,X,Q)
- +
- +#define FP_CMP_Q(r,X,Y,un) _FP_CMP(Q,4,r,X,Y,un)
- +#define FP_CMP_EQ_Q(r,X,Y) _FP_CMP_EQ(Q,4,r,X,Y)
- +#define FP_CMP_UNORD_Q(r,X,Y) _FP_CMP_UNORD(Q,4,r,X,Y)
- +
- +#define FP_TO_INT_Q(r,X,rsz,rsg) _FP_TO_INT(Q,4,r,X,rsz,rsg)
- +#define FP_FROM_INT_Q(X,r,rs,rt) _FP_FROM_INT(Q,4,X,r,rs,rt)
- +
- +#define _FP_FRAC_HIGH_Q(X) _FP_FRAC_HIGH_4(X)
- +#define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_4(X)
- +
- +#else /* not _FP_W_TYPE_SIZE < 64 */
- +union _FP_UNION_Q
- +{
- + TFtype flt /* __attribute__((mode(TF))) */ ;
- + struct {
- + _FP_W_TYPE a, b;
- + } longs;
- + struct {
- +#if __BYTE_ORDER == __BIG_ENDIAN
- + unsigned sign : 1;
- + unsigned exp : _FP_EXPBITS_Q;
- + _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
- + _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
- +#else
- + _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
- + _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
- + unsigned exp : _FP_EXPBITS_Q;
- + unsigned sign : 1;
- +#endif
- + } bits;
- +};
- +
- +#define FP_DECL_Q(X) _FP_DECL(2,X)
- +#define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_2(Q,X,val)
- +#define FP_UNPACK_RAW_QP(X,val) _FP_UNPACK_RAW_2_P(Q,X,val)
- +#define FP_PACK_RAW_Q(val,X) _FP_PACK_RAW_2(Q,val,X)
- +#define FP_PACK_RAW_QP(val,X) \
- + do { \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_2_P(Q,val,X); \
- + } while (0)
- +
- +#define FP_UNPACK_Q(X,val) \
- + do { \
- + _FP_UNPACK_RAW_2(Q,X,val); \
- + _FP_UNPACK_CANONICAL(Q,2,X); \
- + } while (0)
- +
- +#define FP_UNPACK_QP(X,val) \
- + do { \
- + _FP_UNPACK_RAW_2_P(Q,X,val); \
- + _FP_UNPACK_CANONICAL(Q,2,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_Q(X,val) \
- + do { \
- + _FP_UNPACK_RAW_2(Q,X,val); \
- + _FP_UNPACK_SEMIRAW(Q,2,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_QP(X,val) \
- + do { \
- + _FP_UNPACK_RAW_2_P(Q,X,val); \
- + _FP_UNPACK_SEMIRAW(Q,2,X); \
- + } while (0)
- +
- +#define FP_PACK_Q(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(Q,2,X); \
- + _FP_PACK_RAW_2(Q,val,X); \
- + } while (0)
- +
- +#define FP_PACK_QP(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(Q,2,X); \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_2_P(Q,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_Q(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(Q,2,X); \
- + _FP_PACK_RAW_2(Q,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_QP(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(Q,2,X); \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_2_P(Q,val,X); \
- + } while (0)
- +
- +#define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN(Q,2,X)
- +#define FP_NEG_Q(R,X) _FP_NEG(Q,2,R,X)
- +#define FP_ADD_Q(R,X,Y) _FP_ADD(Q,2,R,X,Y)
- +#define FP_SUB_Q(R,X,Y) _FP_SUB(Q,2,R,X,Y)
- +#define FP_MUL_Q(R,X,Y) _FP_MUL(Q,2,R,X,Y)
- +#define FP_DIV_Q(R,X,Y) _FP_DIV(Q,2,R,X,Y)
- +#define FP_SQRT_Q(R,X) _FP_SQRT(Q,2,R,X)
- +#define _FP_SQRT_MEAT_Q(R,S,T,X,Q) _FP_SQRT_MEAT_2(R,S,T,X,Q)
- +
- +#define FP_CMP_Q(r,X,Y,un) _FP_CMP(Q,2,r,X,Y,un)
- +#define FP_CMP_EQ_Q(r,X,Y) _FP_CMP_EQ(Q,2,r,X,Y)
- +#define FP_CMP_UNORD_Q(r,X,Y) _FP_CMP_UNORD(Q,2,r,X,Y)
- +
- +#define FP_TO_INT_Q(r,X,rsz,rsg) _FP_TO_INT(Q,2,r,X,rsz,rsg)
- +#define FP_FROM_INT_Q(X,r,rs,rt) _FP_FROM_INT(Q,2,X,r,rs,rt)
- +
- +#define _FP_FRAC_HIGH_Q(X) _FP_FRAC_HIGH_2(X)
- +#define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_2(X)
- +
- +#endif /* not _FP_W_TYPE_SIZE < 64 */
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/sfp-machine.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/sfp-machine.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/sfp-machine.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/sfp-machine.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,213 @@
- +/* Machine-dependent software floating-point definitions.
- + Sparc userland (_Q_*) version.
- + Copyright (C) 1997,1998,1999, 2002, 2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com),
- + Jakub Jelinek (jj@ultra.linux.cz) and
- + David S. Miller (davem@redhat.com).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- + 02111-1307 USA. */
- +
- +#include <fpu_control.h>
- +#include <stdlib.h>
- +
- +#define _FP_W_TYPE_SIZE 32
- +#define _FP_W_TYPE unsigned long
- +#define _FP_WS_TYPE signed long
- +#define _FP_I_TYPE long
- +
- +#define _FP_MUL_MEAT_S(R,X,Y) \
- + _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
- +#define _FP_MUL_MEAT_D(R,X,Y) \
- + _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
- +#define _FP_MUL_MEAT_Q(R,X,Y) \
- + _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
- +
- +#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv(S,R,X,Y)
- +#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y)
- +#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y)
- +
- +#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
- +#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1), -1
- +#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
- +#define _FP_NANSIGN_S 0
- +#define _FP_NANSIGN_D 0
- +#define _FP_NANSIGN_Q 0
- +
- +#define _FP_KEEPNANFRACP 1
- +
- +/* If one NaN is signaling and the other is not,
- + * we choose that one, otherwise we choose X.
- + */
- +/* For _Qp_* and _Q_*, this should prefer X, for
- + * CPU instruction emulation this should prefer Y.
- + * (see SPAMv9 B.2.2 section).
- + */
- +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
- + do { \
- + if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs) \
- + && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)) \
- + { \
- + R##_s = Y##_s; \
- + _FP_FRAC_COPY_##wc(R,Y); \
- + } \
- + else \
- + { \
- + R##_s = X##_s; \
- + _FP_FRAC_COPY_##wc(R,X); \
- + } \
- + R##_c = FP_CLS_NAN; \
- + } while (0)
- +
- +/* Some assembly to speed things up. */
- +#define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
- + __asm__ ("addcc %r7,%8,%2\n\
- + addxcc %r5,%6,%1\n\
- + addx %r3,%4,%0" \
- + : "=r" ((USItype)(r2)), \
- + "=&r" ((USItype)(r1)), \
- + "=&r" ((USItype)(r0)) \
- + : "%rJ" ((USItype)(x2)), \
- + "rI" ((USItype)(y2)), \
- + "%rJ" ((USItype)(x1)), \
- + "rI" ((USItype)(y1)), \
- + "%rJ" ((USItype)(x0)), \
- + "rI" ((USItype)(y0)) \
- + : "cc")
- +
- +#define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
- + __asm__ ("subcc %r7,%8,%2\n\
- + subxcc %r5,%6,%1\n\
- + subx %r3,%4,%0" \
- + : "=r" ((USItype)(r2)), \
- + "=&r" ((USItype)(r1)), \
- + "=&r" ((USItype)(r0)) \
- + : "%rJ" ((USItype)(x2)), \
- + "rI" ((USItype)(y2)), \
- + "%rJ" ((USItype)(x1)), \
- + "rI" ((USItype)(y1)), \
- + "%rJ" ((USItype)(x0)), \
- + "rI" ((USItype)(y0)) \
- + : "cc")
- +
- +#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
- + do { \
- + /* We need to fool gcc, as we need to pass more than 10 \
- + input/outputs. */ \
- + register USItype _t1 __asm__ ("g1"), _t2 __asm__ ("g2"); \
- + __asm__ __volatile__ ("\
- + addcc %r8,%9,%1\n\
- + addxcc %r6,%7,%0\n\
- + addxcc %r4,%5,%%g2\n\
- + addx %r2,%3,%%g1" \
- + : "=&r" ((USItype)(r1)), \
- + "=&r" ((USItype)(r0)) \
- + : "%rJ" ((USItype)(x3)), \
- + "rI" ((USItype)(y3)), \
- + "%rJ" ((USItype)(x2)), \
- + "rI" ((USItype)(y2)), \
- + "%rJ" ((USItype)(x1)), \
- + "rI" ((USItype)(y1)), \
- + "%rJ" ((USItype)(x0)), \
- + "rI" ((USItype)(y0)) \
- + : "cc", "g1", "g2"); \
- + __asm__ __volatile__ ("" : "=r" (_t1), "=r" (_t2)); \
- + r3 = _t1; r2 = _t2; \
- + } while (0)
- +
- +#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
- + do { \
- + /* We need to fool gcc, as we need to pass more than 10 \
- + input/outputs. */ \
- + register USItype _t1 __asm__ ("g1"), _t2 __asm__ ("g2"); \
- + __asm__ __volatile__ ("\
- + subcc %r8,%9,%1\n\
- + subxcc %r6,%7,%0\n\
- + subxcc %r4,%5,%%g2\n\
- + subx %r2,%3,%%g1" \
- + : "=&r" ((USItype)(r1)), \
- + "=&r" ((USItype)(r0)) \
- + : "%rJ" ((USItype)(x3)), \
- + "rI" ((USItype)(y3)), \
- + "%rJ" ((USItype)(x2)), \
- + "rI" ((USItype)(y2)), \
- + "%rJ" ((USItype)(x1)), \
- + "rI" ((USItype)(y1)), \
- + "%rJ" ((USItype)(x0)), \
- + "rI" ((USItype)(y0)) \
- + : "cc", "g1", "g2"); \
- + __asm__ __volatile__ ("" : "=r" (_t1), "=r" (_t2)); \
- + r3 = _t1; r2 = _t2; \
- + } while (0)
- +
- +#define __FP_FRAC_DEC_3(x2,x1,x0,y2,y1,y0) __FP_FRAC_SUB_3(x2,x1,x0,x2,x1,x0,y2,y1,y0)
- +
- +#define __FP_FRAC_DEC_4(x3,x2,x1,x0,y3,y2,y1,y0) __FP_FRAC_SUB_4(x3,x2,x1,x0,x3,x2,x1,x0,y3,y2,y1,y0)
- +
- +#define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i) \
- + __asm__ ("addcc %3,%4,%3\n\
- + addxcc %2,%%g0,%2\n\
- + addxcc %1,%%g0,%1\n\
- + addx %0,%%g0,%0" \
- + : "=&r" ((USItype)(x3)), \
- + "=&r" ((USItype)(x2)), \
- + "=&r" ((USItype)(x1)), \
- + "=&r" ((USItype)(x0)) \
- + : "rI" ((USItype)(i)), \
- + "0" ((USItype)(x3)), \
- + "1" ((USItype)(x2)), \
- + "2" ((USItype)(x1)), \
- + "3" ((USItype)(x0)) \
- + : "cc")
- +
- +/* Obtain the current rounding mode. */
- +#ifndef FP_ROUNDMODE
- +#define FP_ROUNDMODE ((_fcw >> 30) & 0x3)
- +#endif
- +
- +/* Exception flags. */
- +#define FP_EX_INVALID (1 << 4)
- +#define FP_EX_OVERFLOW (1 << 3)
- +#define FP_EX_UNDERFLOW (1 << 2)
- +#define FP_EX_DIVZERO (1 << 1)
- +#define FP_EX_INEXACT (1 << 0)
- +
- +#define _FP_DECL_EX fpu_control_t _fcw
- +
- +#define FP_INIT_ROUNDMODE \
- +do { \
- + _FPU_GETCW(_fcw); \
- +} while (0)
- +
- +/* Simulate exceptions using double arithmetics. */
- +extern double ___Q_simulate_exceptions(int exc);
- +
- +#define FP_HANDLE_EXCEPTIONS \
- +do { \
- + if (!_fex) \
- + { \
- + /* This is the common case, so we do it inline. \
- + * We need to clear cexc bits if any. \
- + */ \
- + extern unsigned long long ___Q_numbers[]; \
- + __asm__ __volatile__("\
- + ldd [%0], %%f30\n\
- + faddd %%f30, %%f30, %%f30\
- + " : : "r" (___Q_numbers) : "f30"); \
- + } \
- + else \
- + ___Q_simulate_exceptions (_fex); \
- +} while (0)
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/single.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/single.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/single.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/single.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,151 @@
- +/* Software floating-point emulation.
- + Definitions for IEEE Single Precision.
- + Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com),
- + Jakub Jelinek (jj@ultra.linux.cz),
- + David S. Miller (davem@redhat.com) and
- + Peter Maydell (pmaydell@chiark.greenend.org.uk).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + In addition to the permissions in the GNU Lesser General Public
- + License, the Free Software Foundation gives you unlimited
- + permission to link the compiled version of this file into
- + combinations with other programs, and to distribute those
- + combinations without any restriction coming from the use of this
- + file. (The Lesser General Public License restrictions do apply in
- + other respects; for example, they cover modification of the file,
- + and distribution when not linked into a combine executable.)
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
- + MA 02110-1301, USA. */
- +
- +#if _FP_W_TYPE_SIZE < 32
- +#error "Here's a nickel kid. Go buy yourself a real computer."
- +#endif
- +
- +#define _FP_FRACTBITS_S _FP_W_TYPE_SIZE
- +
- +#define _FP_FRACBITS_S 24
- +#define _FP_FRACXBITS_S (_FP_FRACTBITS_S - _FP_FRACBITS_S)
- +#define _FP_WFRACBITS_S (_FP_WORKBITS + _FP_FRACBITS_S)
- +#define _FP_WFRACXBITS_S (_FP_FRACTBITS_S - _FP_WFRACBITS_S)
- +#define _FP_EXPBITS_S 8
- +#define _FP_EXPBIAS_S 127
- +#define _FP_EXPMAX_S 255
- +#define _FP_QNANBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2))
- +#define _FP_QNANBIT_SH_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2+_FP_WORKBITS))
- +#define _FP_IMPLBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1))
- +#define _FP_IMPLBIT_SH_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1+_FP_WORKBITS))
- +#define _FP_OVERFLOW_S ((_FP_W_TYPE)1 << (_FP_WFRACBITS_S))
- +
- +/* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be
- + chosen by the target machine. */
- +
- +typedef float SFtype __attribute__((mode(SF)));
- +
- +union _FP_UNION_S
- +{
- + SFtype flt;
- + struct {
- +#if __BYTE_ORDER == __BIG_ENDIAN
- + unsigned sign : 1;
- + unsigned exp : _FP_EXPBITS_S;
- + unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0);
- +#else
- + unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0);
- + unsigned exp : _FP_EXPBITS_S;
- + unsigned sign : 1;
- +#endif
- + } bits __attribute__((packed));
- +};
- +
- +#define FP_DECL_S(X) _FP_DECL(1,X)
- +#define FP_UNPACK_RAW_S(X,val) _FP_UNPACK_RAW_1(S,X,val)
- +#define FP_UNPACK_RAW_SP(X,val) _FP_UNPACK_RAW_1_P(S,X,val)
- +#define FP_PACK_RAW_S(val,X) _FP_PACK_RAW_1(S,val,X)
- +#define FP_PACK_RAW_SP(val,X) \
- + do { \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_1_P(S,val,X); \
- + } while (0)
- +
- +#define FP_UNPACK_S(X,val) \
- + do { \
- + _FP_UNPACK_RAW_1(S,X,val); \
- + _FP_UNPACK_CANONICAL(S,1,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SP(X,val) \
- + do { \
- + _FP_UNPACK_RAW_1_P(S,X,val); \
- + _FP_UNPACK_CANONICAL(S,1,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_S(X,val) \
- + do { \
- + _FP_UNPACK_RAW_1(S,X,val); \
- + _FP_UNPACK_SEMIRAW(S,1,X); \
- + } while (0)
- +
- +#define FP_UNPACK_SEMIRAW_SP(X,val) \
- + do { \
- + _FP_UNPACK_RAW_1_P(S,X,val); \
- + _FP_UNPACK_SEMIRAW(S,1,X); \
- + } while (0)
- +
- +#define FP_PACK_S(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(S,1,X); \
- + _FP_PACK_RAW_1(S,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SP(val,X) \
- + do { \
- + _FP_PACK_CANONICAL(S,1,X); \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_1_P(S,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_S(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(S,1,X); \
- + _FP_PACK_RAW_1(S,val,X); \
- + } while (0)
- +
- +#define FP_PACK_SEMIRAW_SP(val,X) \
- + do { \
- + _FP_PACK_SEMIRAW(S,1,X); \
- + if (!FP_INHIBIT_RESULTS) \
- + _FP_PACK_RAW_1_P(S,val,X); \
- + } while (0)
- +
- +#define FP_ISSIGNAN_S(X) _FP_ISSIGNAN(S,1,X)
- +#define FP_NEG_S(R,X) _FP_NEG(S,1,R,X)
- +#define FP_ADD_S(R,X,Y) _FP_ADD(S,1,R,X,Y)
- +#define FP_SUB_S(R,X,Y) _FP_SUB(S,1,R,X,Y)
- +#define FP_MUL_S(R,X,Y) _FP_MUL(S,1,R,X,Y)
- +#define FP_DIV_S(R,X,Y) _FP_DIV(S,1,R,X,Y)
- +#define FP_SQRT_S(R,X) _FP_SQRT(S,1,R,X)
- +#define _FP_SQRT_MEAT_S(R,S,T,X,Q) _FP_SQRT_MEAT_1(R,S,T,X,Q)
- +
- +#define FP_CMP_S(r,X,Y,un) _FP_CMP(S,1,r,X,Y,un)
- +#define FP_CMP_EQ_S(r,X,Y) _FP_CMP_EQ(S,1,r,X,Y)
- +#define FP_CMP_UNORD_S(r,X,Y) _FP_CMP_UNORD(S,1,r,X,Y)
- +
- +#define FP_TO_INT_S(r,X,rsz,rsg) _FP_TO_INT(S,1,r,X,rsz,rsg)
- +#define FP_FROM_INT_S(X,r,rs,rt) _FP_FROM_INT(S,1,X,r,rs,rt)
- +
- +#define _FP_FRAC_HIGH_S(X) _FP_FRAC_HIGH_1(X)
- +#define _FP_FRAC_HIGH_RAW_S(X) _FP_FRAC_HIGH_1(X)
- diff -Naur uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/soft-fp.h uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/soft-fp.h
- --- uClibc-0.9.31.ori/libc/sysdeps/linux/sparc/soft-fp/soft-fp.h 1970-01-01 01:00:00.000000000 +0100
- +++ uClibc-0.9.31/libc/sysdeps/linux/sparc/soft-fp/soft-fp.h 2010-10-14 14:05:37.000000000 +0200
- @@ -0,0 +1,205 @@
- +/* Software floating-point emulation.
- + Copyright (C) 1997,1998,1999,2000,2002,2003,2005,2006,2007
- + Free Software Foundation, Inc.
- + This file is part of the GNU C Library.
- + Contributed by Richard Henderson (rth@cygnus.com),
- + Jakub Jelinek (jj@ultra.linux.cz),
- + David S. Miller (davem@redhat.com) and
- + Peter Maydell (pmaydell@chiark.greenend.org.uk).
- +
- + The GNU C Library is free software; you can redistribute it and/or
- + modify it under the terms of the GNU Lesser General Public
- + License as published by the Free Software Foundation; either
- + version 2.1 of the License, or (at your option) any later version.
- +
- + In addition to the permissions in the GNU Lesser General Public
- + License, the Free Software Foundation gives you unlimited
- + permission to link the compiled version of this file into
- + combinations with other programs, and to distribute those
- + combinations without any restriction coming from the use of this
- + file. (The Lesser General Public License restrictions do apply in
- + other respects; for example, they cover modification of the file,
- + and distribution when not linked into a combine executable.)
- +
- + The GNU C Library is distributed in the hope that it will be useful,
- + but WITHOUT ANY WARRANTY; without even the implied warranty of
- + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- + Lesser General Public License for more details.
- +
- + You should have received a copy of the GNU Lesser General Public
- + License along with the GNU C Library; if not, write to the Free
- + Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
- + MA 02110-1301, USA. */
- +
- +#ifndef SOFT_FP_H
- +#define SOFT_FP_H
- +
- +#include "sfp-machine.h"
- +
- +/* Allow sfp-machine to have its own byte order definitions. */
- +#ifndef __BYTE_ORDER
- +#ifdef _LIBC
- +#include <endian.h>
- +#else
- +#error "endianness not defined by sfp-machine.h"
- +#endif
- +#endif
- +
- +#define _FP_WORKBITS 3
- +#define _FP_WORK_LSB ((_FP_W_TYPE)1 << 3)
- +#define _FP_WORK_ROUND ((_FP_W_TYPE)1 << 2)
- +#define _FP_WORK_GUARD ((_FP_W_TYPE)1 << 1)
- +#define _FP_WORK_STICKY ((_FP_W_TYPE)1 << 0)
- +
- +#ifndef FP_RND_NEAREST
- +# define FP_RND_NEAREST 0
- +# define FP_RND_ZERO 1
- +# define FP_RND_PINF 2
- +# define FP_RND_MINF 3
- +#endif
- +#ifndef FP_ROUNDMODE
- +# define FP_ROUNDMODE FP_RND_NEAREST
- +#endif
- +
- +/* By default don't care about exceptions. */
- +#ifndef FP_EX_INVALID
- +#define FP_EX_INVALID 0
- +#endif
- +#ifndef FP_EX_OVERFLOW
- +#define FP_EX_OVERFLOW 0
- +#endif
- +#ifndef FP_EX_UNDERFLOW
- +#define FP_EX_UNDERFLOW 0
- +#endif
- +#ifndef FP_EX_DIVZERO
- +#define FP_EX_DIVZERO 0
- +#endif
- +#ifndef FP_EX_INEXACT
- +#define FP_EX_INEXACT 0
- +#endif
- +#ifndef FP_EX_DENORM
- +#define FP_EX_DENORM 0
- +#endif
- +
- +#ifdef _FP_DECL_EX
- +#define FP_DECL_EX \
- + int _fex = 0; \
- + _FP_DECL_EX
- +#else
- +#define FP_DECL_EX int _fex = 0
- +#endif
- +
- +#ifndef FP_INIT_ROUNDMODE
- +#define FP_INIT_ROUNDMODE do {} while (0)
- +#endif
- +
- +#ifndef FP_HANDLE_EXCEPTIONS
- +#define FP_HANDLE_EXCEPTIONS do {} while (0)
- +#endif
- +
- +#ifndef FP_INHIBIT_RESULTS
- +/* By default we write the results always.
- + * sfp-machine may override this and e.g.
- + * check if some exceptions are unmasked
- + * and inhibit it in such a case.
- + */
- +#define FP_INHIBIT_RESULTS 0
- +#endif
- +
- +#define FP_SET_EXCEPTION(ex) \
- + _fex |= (ex)
- +
- +#define FP_UNSET_EXCEPTION(ex) \
- + _fex &= ~(ex)
- +
- +#define FP_CLEAR_EXCEPTIONS \
- + _fex = 0
- +
- +#define _FP_ROUND_NEAREST(wc, X) \
- +do { \
- + if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND) \
- + _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \
- +} while (0)
- +
- +#define _FP_ROUND_ZERO(wc, X) (void)0
- +
- +#define _FP_ROUND_PINF(wc, X) \
- +do { \
- + if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \
- + _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
- +} while (0)
- +
- +#define _FP_ROUND_MINF(wc, X) \
- +do { \
- + if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \
- + _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
- +} while (0)
- +
- +#define _FP_ROUND(wc, X) \
- +do { \
- + if (_FP_FRAC_LOW_##wc(X) & 7) \
- + FP_SET_EXCEPTION(FP_EX_INEXACT); \
- + switch (FP_ROUNDMODE) \
- + { \
- + case FP_RND_NEAREST: \
- + _FP_ROUND_NEAREST(wc,X); \
- + break; \
- + case FP_RND_ZERO: \
- + _FP_ROUND_ZERO(wc,X); \
- + break; \
- + case FP_RND_PINF: \
- + _FP_ROUND_PINF(wc,X); \
- + break; \
- + case FP_RND_MINF: \
- + _FP_ROUND_MINF(wc,X); \
- + break; \
- + } \
- +} while (0)
- +
- +#define FP_CLS_NORMAL 0
- +#define FP_CLS_ZERO 1
- +#define FP_CLS_INF 2
- +#define FP_CLS_NAN 3
- +
- +#define _FP_CLS_COMBINE(x,y) (((x) << 2) | (y))
- +
- +#include "op-1.h"
- +#include "op-2.h"
- +#include "op-4.h"
- +#include "op-8.h"
- +#include "op-common.h"
- +
- +/* Sigh. Silly things longlong.h needs. */
- +#define UWtype _FP_W_TYPE
- +#define W_TYPE_SIZE _FP_W_TYPE_SIZE
- +
- +typedef int QItype __attribute__((mode(QI)));
- +typedef int SItype __attribute__((mode(SI)));
- +typedef int DItype __attribute__((mode(DI)));
- +typedef unsigned int UQItype __attribute__((mode(QI)));
- +typedef unsigned int USItype __attribute__((mode(SI)));
- +typedef unsigned int UDItype __attribute__((mode(DI)));
- +#if _FP_W_TYPE_SIZE == 32
- +typedef unsigned int UHWtype __attribute__((mode(HI)));
- +#elif _FP_W_TYPE_SIZE == 64
- +typedef USItype UHWtype;
- +#endif
- +
- +#ifndef CMPtype
- +#define CMPtype int
- +#endif
- +
- +#define SI_BITS (__CHAR_BIT__ * (int)sizeof(SItype))
- +#define DI_BITS (__CHAR_BIT__ * (int)sizeof(DItype))
- +
- +#ifndef umul_ppmm
- +#include "longlong.h"
- +#endif
- +
- +#ifdef _LIBC
- +#include <stdlib.h>
- +#else
- +extern void abort (void);
- +#endif
- +
- +#endif
|