123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770 |
- MODULE FoxArrayBase; (* stubs for array base runtime - can only be compiled by oc compiler *)
- (* (c) fof, fn, ETH Zürich, 2008 *)
- (*! do do: MAX(array,scalar) and MAX(array,array) for all datatypes*)
- IMPORT SYSTEM, KernelLog, Heaps, MathL;
- TYPE
-
- GenericUnaryAALoopS = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: SHORTINT): SHORTINT );
- GenericUnaryAALoopI = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: INTEGER): INTEGER );
- GenericUnaryAALoopL = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGINT): LONGINT );
- GenericUnaryAALoopH = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: HUGEINT): HUGEINT );
- GenericUnaryAALoopR = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: REAL): REAL );
- GenericUnaryAALoopX = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGREAL): LONGREAL );
- GenericUnaryAALoopZ = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: COMPLEX): COMPLEX );
- GenericUnaryAALoopLZ = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGCOMPLEX): LONGCOMPLEX );
- UnaryAALoop = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- UnaryASLoop = PROCEDURE ( ladr, dadr: ADDRESS; linc, len: SIZE );
- UnarySALoop = PROCEDURE ( ladr, dadr: ADDRESS; dinc, len: SIZE );
- BinaryAAALoop = PROCEDURE ( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- BinaryASALoop = PROCEDURE ( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BinaryAASLoop = PROCEDURE ( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- BinaryAABLoop = PROCEDURE ( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- BinaryASBLoop = PROCEDURE ( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
-
- LenType = SIZE; (* should be SIZE but for legacy reasons we have to use this *)
-
- CONST
- debug = FALSE; (* warning: debug=true -> a lot of output is generated -> traps are not displayed in Oberon (Kernel overflow) *)
- statistics= FALSE;
- conservative=TRUE;
- ArrDataArrayOffset=4*SIZEOF (ADDRESS); (* offset of data in array with pointers *)
- AddressSize=SIZEOF(ADDRESS);
- MathPtrOffset=0*AddressSize;
- MathAdrOffset=1*AddressSize;
- MathFlagsOffset=2*AddressSize;
- MathDimOffset=3*AddressSize;
- MathElementSizeOffset=4*AddressSize;
- MathLenOffset=5*AddressSize;
- MathIncrOffset=6*AddressSize;
- GeometryMismatch = 400;
- DimensionMismatch=401;
- AllocationForbidden=402;
-
- ArrayAlignment=16;
- TensorFlag = 0; RangeFlag = 1; TemporaryFlag = 2;
- down = 0; up = 1; (* memory copy modes *)
- (* flags for optimizations with small matricies and vectors (Alexey Morozov) *)
- SmallMatrixFlag = 3; (* flag for identification of a small matrix *)
- SmallVectorFlag = 3; (* flag for identification of a small vector *)
- Size2Flag = 4; (* size = 2 *)
- Size3Flag = 5; (* size = 3 *)
- Size4Flag = 6; (* size = 4 *)
- Size5Flag = 7; (* size = 5 *)
- Size6Flag = 8; (* size = 6 *)
- Size7Flag = 9; (* size = 7 *)
- Size8Flag = 10; (* size = 8 *)
- Mat2x2 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size2Flag});
- Mat3x3 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size3Flag});
- Mat4x4 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size4Flag});
- Mat5x5 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size5Flag});
- Mat6x6 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size6Flag});
- Mat7x7 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size7Flag});
- Mat8x8 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size8Flag});
- Vec2 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size2Flag});
- Vec3 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size3Flag});
- Vec4 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size4Flag});
- Vec5 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size5Flag});
- Vec6 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size6Flag});
- Vec7 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size7Flag});
- Vec8 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size8Flag});
- MatVec2x2 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size2Flag});
- MatVec3x3 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size3Flag});
- MatVec4x4 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size4Flag});
- MatVec5x5 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size5Flag});
- MatVec6x6 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size6Flag});
- MatVec7x7 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size7Flag});
- MatVec8x8 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size8Flag});
- SmallArrayMask = {SmallMatrixFlag,SmallVectorFlag,Size2Flag,Size3Flag,Size4Flag,Size5Flag,Size6Flag,Size7Flag,Size8Flag};
- TYPE
- FastMatMul* = PROCEDURE ( matrixA, matrixB, matrixC: ADDRESS; IncA, StrideA, IncB, StrideB, IncC, StrideC, RowsA, ColsA, RowsB, ColsB: SIZE ): BOOLEAN;
- TransposeP* = PROCEDURE ( ladr, dadr: ADDRESS; lstride, linc, dstride, dinc, rows, cols:SIZE );
- LenInc* = RECORD
- len*: SIZE;
- inc*: SIZE
- END;
- ArrayDescriptor*= RECORD
- ptr*: ANY;
- adr*: ADDRESS;
- flags*: SET;
- dim*: SIZE;
- elementSize*: SIZE;
- END;
-
- Tensor = POINTER TO ArrayDescriptor;
-
- UnsafeArray*= POINTER {UNSAFE,UNTRACED} TO RECORD(ArrayDescriptor)
- lens*: ARRAY 8 OF LenInc;
- END;
- UnsafeArrayT*= POINTER {UNSAFE} TO RECORD(ArrayDescriptor)
- lens*: ARRAY 8 OF LenInc;
- END;
-
- A0 = RECORD(ArrayDescriptor) END;
- A1 = RECORD(ArrayDescriptor) lens : ARRAY 1 OF LenInc; END;
- A2 = RECORD(ArrayDescriptor) lens : ARRAY 2 OF LenInc; END;
- A3 = RECORD(ArrayDescriptor) lens : ARRAY 3 OF LenInc; END;
- A4 = RECORD(ArrayDescriptor) lens : ARRAY 4 OF LenInc; END;
- A5 = RECORD(ArrayDescriptor) lens : ARRAY 5 OF LenInc; END;
- A6 = RECORD(ArrayDescriptor) lens : ARRAY 6 OF LenInc; END;
- A7 = RECORD(ArrayDescriptor) lens : ARRAY 7 OF LenInc; END;
- A8 = RECORD(ArrayDescriptor) lens : ARRAY 8 OF LenInc; END;
-
- T0 = POINTER TO A0;
- T1 = POINTER TO A1;
- T2 = POINTER TO A2;
- T3 = POINTER TO A3;
- T4 = POINTER TO A4;
- T5 = POINTER TO A5;
- T6 = POINTER TO A6;
- T7 = POINTER TO A7;
- T8 = POINTER TO A8;
-
- (* used for optimizations of MatMul with small sizes (Alexey Morozov) *)
- SmallMatMul* = PROCEDURE(dadr, ladr, radr: ADDRESS);
-
-
- VAR
- temporary*: T0;
- alloc*: LONGINT; (* statistics *)
- allocTemp*: LONGINT; (* statistics *)
- (* procedures that might be replaced by ASM methods *)
- loopSPAXAX*, loopSPARAR*: BinaryAASLoop;
- loopSPAZAZ, loopSPALZALZ: BinaryAASLoop;
- loopAddAXAX*, loopAddARAR*, loopAddAZAZ*, loopAddALZALZ*: BinaryAAALoop;
- loopMatMulAXAX*, loopMatMulARAR*: BinaryAASLoop;
- loopMatMulIncAXAX*, loopMatMulIncARAR*: BinaryAASLoop;
- loopMulAXSX*, loopMulARSR*, loopMulAZSZ*, loopMulALZSLZ*: BinaryASALoop;
- loopIncMulAXSX*, loopIncMulARSR*: BinaryASALoop;
- matMulX*, matMulR*: FastMatMul; matMulIncX*, matMulIncR*: FastMatMul;
- transpose4*: TransposeP; transpose8*: TransposeP;
- (* optimizations for small arrays (Alexey Morozov) *)
- matMulR2x2*: SmallMatMul;
- matMulR3x3*: SmallMatMul;
- matMulR4x4*: SmallMatMul;
- matVecMulR2x2*: SmallMatMul;
- matVecMulR3x3*: SmallMatMul;
- matVecMulR4x4*: SmallMatMul;
- matMulLR2x2*: SmallMatMul;
- matMulLR3x3*: SmallMatMul;
- matMulLR4x4*: SmallMatMul;
- matVecMulLR2x2*: SmallMatMul;
- matVecMulLR3x3*: SmallMatMul;
- matVecMulLR4x4*: SmallMatMul;
- (*
- TensorTypePool: ARRAY 32 OF TensorType;
- *)
- PROCEDURE SetDefaults*; (* set standard procedures *)
- BEGIN
- KernelLog.String( "ArrayBase XXXXXXX: setting runtime library (semi-optimized) default methods." ); KernelLog.Ln; loopSPAXAX := SPAXAXLoop;
- loopSPARAR := SPARARLoop; loopAddAXAX := AddAXAXLoop;
- loopSPAZAZ := SPAZAZLoop; loopSPALZALZ := SPALZALZLoop;
- loopAddARAR := AddARARLoop; loopMatMulAXAX := MatMulAXAXLoop;
- loopAddAZAZ := AddAZAZLoop; loopAddALZALZ := AddALZALZLoop;
- loopMatMulIncAXAX := MatMulIncAXAXLoop;
- loopMatMulARAR := MatMulARARLoop; loopMulAXSX := MulAXSXLoop;
- loopIncMulAXSX := IncMulAXSXLoop;
- loopMatMulIncARAR := MatMulIncARARLoop;
- loopMulARSR := MulARSRLoop; loopIncMulARSR := IncMulARSRLoop;
- matMulX := NIL; matMulR := NIL; matMulIncX := NIL; matMulIncR := NIL;
- loopMulAZSZ := MulAZSZLoop;
- loopMulALZSLZ := MulALZSLZLoop;
- END SetDefaults;
- PROCEDURE Err(CONST s: ARRAY OF CHAR );
- BEGIN
- KernelLog.String( "Runtime Error: " ); KernelLog.String( s ); KernelLog.Ln; HALT( 100 );
- END Err;
- (* get increment of dimension dim *)
- PROCEDURE GetIncr(base: UnsafeArray; dim: SIZE): SIZE;
- BEGIN{UNCHECKED}
- RETURN base.lens[dim].inc
- END GetIncr;
- (* set increment of dimension dim *)
- PROCEDURE PutInc(base: UnsafeArray; dim,val: SIZE);
- BEGIN{UNCHECKED}
- base.lens[dim].inc := val
- END PutInc;
- (* get length of dimension dim *)
- PROCEDURE GetLen(base: UnsafeArray; dim: SIZE): SIZE;
- BEGIN{UNCHECKED}
- RETURN base.lens[dim].len
- END GetLen;
- (* set length of dimension dim *)
- PROCEDURE PutLen(base: UnsafeArray; dim,val: SIZE);
- BEGIN{UNCHECKED}
- base.lens[dim].len := val
- END PutLen;
- (* get data address *)
- PROCEDURE GetAdr(base: UnsafeArray): ADDRESS;
- BEGIN
- RETURN base.adr;
- END GetAdr;
- (* set data address *)
- PROCEDURE PutAdr(base: UnsafeArray; value: ADDRESS);
- BEGIN
- base.adr := value
- END PutAdr;
-
- PROCEDURE Align(value: ADDRESS): ADDRESS;
- BEGIN RETURN value + (-value) MOD ArrayAlignment;
- END Align;
-
- (* get data base pointer (GC protection) *)
- PROCEDURE GetPtr(base: UnsafeArray): ANY;
- BEGIN
- RETURN base.ptr;
- END GetPtr;
- PROCEDURE SafePut(VAR dest: ANY; src: ANY);
- BEGIN
- dest := src;
- END SafePut;
-
- (* set data base pointer (GC protection) *)
- PROCEDURE PutPtr(CONST base: UnsafeArray; value: ANY);
- BEGIN
- base.ptr := value;
- (*
- SafePut(base.ptr,value);
- *)
- END PutPtr;
- PROCEDURE GetSize( base: UnsafeArray ): SIZE;
- BEGIN
- IF base = NIL THEN RETURN 0 ELSE RETURN base.elementSize END
- END GetSize;
- PROCEDURE PutSize( base: UnsafeArray; val: SIZE );
- BEGIN
- base.elementSize := val
- END PutSize;
- PROCEDURE GetDim( base: UnsafeArray ): SIZE;
- BEGIN
- IF base = 0 THEN RETURN 0 ELSE RETURN base.dim END;
- END GetDim;
- PROCEDURE GetFlags( base: UnsafeArray ): SET;
- BEGIN
- IF base = 0 THEN RETURN {} ELSE RETURN base.flags END;
- END GetFlags;
- PROCEDURE PutDim( base: UnsafeArray; dim: SIZE );
- BEGIN
- base.dim := dim
- END PutDim;
- PROCEDURE PutFlags( base: UnsafeArray; flags: SET );
- BEGIN
- base.flags := flags
- END PutFlags;
- (* report geometry of array passed via address s *)
- PROCEDURE Report(CONST name: ARRAY OF CHAR; s: ADDRESS );
- VAR i: SIZE; dim: SIZE;
- PROCEDURE Set( s: SET );
- VAR i: SIZE; first: BOOLEAN;
- BEGIN
- KernelLog.String( "{" ); first := TRUE;
- FOR i := 31 TO 0 BY -1 DO
- IF i IN s THEN
- IF ~first THEN KernelLog.String( "," ); ELSE first := FALSE END;
- KernelLog.Int( i, 1 );
- END;
- END;
- KernelLog.String( "}" );
- END Set;
- BEGIN
- KernelLog.String( name );
- IF s = 0 THEN KernelLog.String( " : NIL " ); KernelLog.Ln;
- ELSE
- KernelLog.String( " at adr " ); KernelLog.Int( s, 1 ); KernelLog.String( "; ptr= " );
- KernelLog.Address( GetPtr( s )); KernelLog.String( "; adr= " );
- KernelLog.Address( GetAdr( s )); KernelLog.String( "; dim=" );
- KernelLog.Int( GetDim( s ), 1 ); KernelLog.String( "; flags=" ); Set( GetFlags( s ) );
- KernelLog.Ln; dim := GetDim( s );
- IF dim > 32 THEN dim := 0 END;
- FOR i := 0 TO dim - 1 DO
- KernelLog.String( "dim (rev)=" ); KernelLog.Int( i, 1 ); KernelLog.String( ", len=" );
- KernelLog.Int( GetLen( s, i ), 1 ); KernelLog.String( ", inc=" );
- KernelLog.Int( GetIncr( s, i ), 1 ); KernelLog.Ln;
- END;
- (*
- FindPattern1( s, dim, ldim, len, inc ); KernelLog.String( "increment: " );
- KernelLog.Int( inc, 10 ); KernelLog.Ln; KernelLog.String( "longest dim:" ); KernelLog.Int( ldim, 10 );
- KernelLog.Ln; KernelLog.String( "len:" ); KernelLog.Int( len, 10 ); KernelLog.Ln;
- *)
- END;
- END Report;
- PROCEDURE GetArrayDesc( dim: SIZE ): Tensor;
- VAR (* t: TensorType; *) ptr: Tensor;
- p0: T0;
- p1: T1; p2: T2; p3: T3; p4: T4; p5: T5; p6: T6; p7: T7; p8: T8;
- BEGIN
- CASE dim OF
- |0: NEW(p0); ptr := p0;
- |1:NEW(p1); ptr := p1;
- |2:NEW(p2); ptr := p2;
- |3:NEW(p3); ptr := p3;
- |4:NEW(p4); ptr := p4;
- |5:NEW(p5); ptr := p5;
- |6:NEW(p6); ptr := p6;
- |7:NEW(p7); ptr := p7;
- |8:NEW(p8); ptr := p8;
- ELSE
- HALT(200)
- END;
- ptr.dim := dim;
- ptr.flags := {TensorFlag};
- RETURN ptr;
- END GetArrayDesc;
-
- PROCEDURE EnsureArrayDesc*(dim: SIZE; VAR d: Tensor);
- BEGIN
- IF d = NIL THEN
- d := GetArrayDesc(dim);
- ELSIF d.dim # dim THEN
- IF ~(TensorFlag IN d.flags) &
- ~(TemporaryFlag IN d.flags) THEN (* no, not allowed*)
- HALT( 100 );
- END;
- d := GetArrayDesc(dim)
- (* ELSE keep as is *)
- END;
- END EnsureArrayDesc;
-
- PROCEDURE Halt( code: SIZE; left, right, dest: ADDRESS );
- VAR reason: ARRAY 64 OF CHAR;
- BEGIN
- IF left # 0 THEN Report( "Source operand ", left ) END;
- IF right # 0 THEN Report( "Source operand 2 ", right ) END;
- IF dest # 0 THEN Report( "Dest operand ", dest ) END;
- IF code = GeometryMismatch THEN reason := "Geometry mismatch";
- ELSIF code = DimensionMismatch THEN reason := "Dimension mismatch";
- ELSIF code = AllocationForbidden THEN reason := "Allocation forbidden for dest";
- ELSE reason := "unknown";
- END;
- KernelLog.String( "ArrayBase Halt. Reason= " ); KernelLog.String( reason ); KernelLog.Ln;
- HALT( 400 );
- END Halt;
- (** patterns ********************************************************************)
- (* find the largest block with a regular pattern of the form offset+{i*li: 0<=i<len}. d is dimension applying to the resulting loop *)
- PROCEDURE FindPattern1( left, dim: ADDRESS; VAR d, len, linc: SIZE );
- BEGIN
- d := dim - 1; len := GetLen( left, d );
- WHILE (len = 1) & (d > 0) DO DEC( d ); len := GetLen( left, d );
- END; (* skip lower dimensions with len=1, in most cases d=0 *)
- linc := GetIncr( left, d ); DEC( d );
- WHILE (d >= 0) & (GetIncr( left, d ) = len * linc) DO
- len := len * GetLen( left, d ); DEC( d );
- END; (* find dimension where pattern does not work any more *)
- INC( d );
- IF debug THEN
- KernelLog.String( "FindPattern1: " ); KernelLog.Int( len, 10 ); KernelLog.Int( linc, 10 );
- KernelLog.Ln;
- END;
- END FindPattern1;
- (* find the largest block with a regular pattern of the form offset+{i*linc: 0<=i<len} for two arrays simultaneously. d is dimension applying to the resulting loop *)
- PROCEDURE FindPattern2( left, right: ADDRESS; dim: SIZE;
- VAR d, len, linc, ri: SIZE );
- (* geometric precondition: lengths must coincide *)
- BEGIN
- d := dim - 1; len := GetLen( left, d ); ASSERT( len = GetLen( right, d ) );
- WHILE (len = 1) & (d > 0) DO DEC( d ); len := GetLen( left, d ); END;
- linc := GetIncr( left, d ); ri := GetIncr( right, d ); DEC( d );
- WHILE (d >= 0) & (GetIncr( left, d ) = len * linc) & (GetIncr( right, d ) = len * ri) DO
- len := len * GetLen( left, d ); DEC( d );
- END;
- INC( d );
- IF debug THEN
- KernelLog.String( "FindPattern2: " ); KernelLog.Int( d, 10 ); KernelLog.Int( len, 10 );
- KernelLog.Int( linc, 10 ); KernelLog.Int( ri, 10 ); KernelLog.Ln;
- END;
- END FindPattern2;
- (* find the largest block with a regular pattern of the form offset+{i*linc: 0<=i<len} for three arrays simultaneously. d is dimension applying to the resulting loop *)
- PROCEDURE FindPattern3( left, right, dest: ADDRESS; dim: SIZE;
- VAR d, len, linc, ri, di: SIZE );
- (* geometric precondition: lengths must coincide *)
- BEGIN
- d := dim - 1; len := GetLen( left, d );
- WHILE (len = 1) & (d > 0) DO DEC( d ); len := GetLen( left, d );
- END;
- linc := GetIncr( left, d ); ri := GetIncr( right, d ); di := GetIncr( dest, d );
- DEC( d );
- WHILE (d >= 0) & (GetIncr( left, d ) = len * linc) &
- (GetIncr( right, d ) = len * ri) & (GetIncr( dest, d ) = len * di) DO
- len := len * GetLen( left, d ); DEC( d );
- END;
- INC( d );
- IF debug THEN
- KernelLog.String( "FindPattern3: " ); KernelLog.Int( len, 10 ); KernelLog.Int( linc, 10 );
- KernelLog.Int( ri, 10 ); KernelLog.Int( di, 10 ); KernelLog.Ln;
- END;
- END FindPattern3;
- PROCEDURE Reverse( src: ADDRESS; dim: SIZE );
- VAR d, sl, sr: SIZE;
- BEGIN
- d := 0; sl := GetAdr( src );
- WHILE (d < dim) DO
- INC( sr, GetIncr( src, d ) * (GetLen( src, d ) - 1) );
- PutInc( src, d, -GetIncr( src, d ) ); INC( d );
- END;
- PutAdr( src, sl + sr );
- END Reverse;
- (* check if forward copy may be performed *)
- PROCEDURE CopyUpCompatible( dest, src: ADDRESS; VAR modes: SET );
- VAR d, sl, sr, dl, dr: SIZE; dim: SIZE;
- (* precondition: len(src,i)=len(dest,i) *)
- (* for forward src -> dest copy compatibility src must not be overwritten before src is copied.
- Sufficient (but not necessary) conditions:
- 1.) no overlap: src right < dest left or src left > dest right or
- 2.) same geometry and src left >= dest left
- same geometry if ginc(s)=ginc(d) with
- ginc(s)=inc(s,0)*len(s,0)+inc(s,1)*len(s,1)+...
- ginc(d)=inc(d,0)*len(d,0)+inc(d,1)*len(d,1)+...
- *)
- BEGIN
- d := 0; sl := GetAdr( src ); sr := sl; dl := GetAdr( dest ); dr := dl;
- dim := GetDim( src );
- WHILE (d < dim) DO
- INC( sr, GetIncr( src, d ) * (GetLen( src, d ) - 1) );
- INC( dr, GetIncr( dest, d ) * (GetLen( dest, d ) - 1) ); INC( d );
- END;
- IF (sr < dl) OR (sl > dr) THEN (* no overlap, both directions possible *)
- ELSIF ((sr - sl) = (dr - dl)) THEN
- IF (sl = dl) THEN (* same memory region, both directions possible *)
- ELSIF (sl > dl) THEN
- EXCL( modes, down ) (* only copy up possible *)
- ELSE (*sl < dl*)
- EXCL( modes, up ) (* only copy down possible *)
- END;
- ELSE
- modes := modes - {down, up}; (* neither nor *)
- END;
- END CopyUpCompatible;
- PROCEDURE AllocateTemp(dest: ADDRESS; src: ADDRESS;
- Size: SIZE ): ANY;
- (* allocate a temporary block containing both descriptor and data *)
- BEGIN
- HALT(100);
- (*
- IF statistics THEN INC( allocTemp ) END;
- d := 0; len := Size; dim := GetDim( src );
- WHILE (d < dim) DO len := len * GetLen( src, d ); INC( d ); END;
- INC( len, 2 * dim * SIZEOF( SIZE ) + MathLenOffset ); SYSTEM.NEW( p, len );
- dest := SYSTEM.VAL( SIZE, p );
- PutAdr( dest, dest + dim * 2 * SIZEOF( SIZE ) + MathLenOffset );
- PutPtr( dest, dest ); PutDim( dest, dim ); len := Size;
- FOR i := 0 TO dim - 1 DO
- PutInc( dest, i, len ); PutLen( dest, i, GetLen( src, i ) );
- len := len * GetLen( src, i );
- END;
- (* Report("allocdest",dest,dim); *)
- RETURN p;
- *)
- END AllocateTemp;
-
- (*** procedures to traverse arrays and apply operators *)
-
- (** apply unary operator to array: array SHORTINT -> array SHORTINT *)
- PROCEDURE ApplyGenericUnaryAAOpS(VAR dest: UnsafeArrayT; CONST left: UnsafeArray; elementSize: SIZE; Loop: GenericUnaryAALoopS; op: PROCEDURE(x: SHORTINT): SHORTINT );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET;
- dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
-
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, left.adr, dest.adr);
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyGenericUnaryAAOpS;
- (** apply unary operator to array: array INTEGER -> array INTEGER *)
- PROCEDURE ApplyGenericUnaryAAOpI(VAR dest: UnsafeArrayT; CONST left: UnsafeArray; elementSize: SIZE; Loop: GenericUnaryAALoopI; op: PROCEDURE(x: INTEGER): INTEGER );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET;
- dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
-
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, left.adr, dest.adr);
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyGenericUnaryAAOpI;
- (** apply unary operator to array: array SIZE -> array SIZE *)
- PROCEDURE ApplyGenericUnaryAAOpL(VAR dest: UnsafeArrayT; CONST left: UnsafeArray; elementSize: SIZE; Loop: GenericUnaryAALoopL; op: PROCEDURE(x: LONGINT): LONGINT );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET;
- dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
-
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, left.adr, dest.adr);
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyGenericUnaryAAOpL;
-
- (** apply unary operator to array: array HUGEINT -> array HUGEINT *)
- PROCEDURE ApplyGenericUnaryAAOpH(VAR dest: UnsafeArrayT; CONST left: UnsafeArray; elementSize: SIZE; Loop: GenericUnaryAALoopH; op: PROCEDURE(x: HUGEINT): HUGEINT );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET;
- dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
-
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, left.adr, dest.adr);
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyGenericUnaryAAOpH;
-
- (** apply unary operator to array: array REAL -> array REAL *)
- PROCEDURE ApplyGenericUnaryAAOpR(VAR dest: UnsafeArrayT; CONST left: UnsafeArray; elementSize: SIZE; Loop: GenericUnaryAALoopR; op: PROCEDURE(x: REAL): REAL );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET;
- dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
-
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, left.adr, dest.adr);
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyGenericUnaryAAOpR;
-
- (** apply unary operator to array: array LONGREAL -> array LONGREAL *)
- PROCEDURE ApplyGenericUnaryAAOpX(VAR dest: UnsafeArrayT; CONST left: UnsafeArray; elementSize: SIZE; Loop: GenericUnaryAALoopX; op: PROCEDURE(x: LONGREAL): LONGREAL );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET;
- dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
-
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, left.adr, dest.adr);
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyGenericUnaryAAOpX;
-
- (** apply unary operator to array: array COMPLEX -> array COMPLEX *)
- PROCEDURE ApplyGenericUnaryAAOpZ(VAR dest: UnsafeArrayT; CONST left: UnsafeArray; elementSize: SIZE; Loop: GenericUnaryAALoopZ; op: PROCEDURE(x: COMPLEX): COMPLEX );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET;
- dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
-
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, left.adr, dest.adr);
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyGenericUnaryAAOpZ;
-
- (** apply unary operator to array: array LONGCOMPLEX -> array LONGCOMPLEX *)
- PROCEDURE ApplyGenericUnaryAAOpLZ(VAR dest: UnsafeArrayT; CONST left: UnsafeArray; elementSize: SIZE; Loop: GenericUnaryAALoopLZ; op: PROCEDURE(x: LONGCOMPLEX): LONGCOMPLEX );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET;
- dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
-
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, left.adr, dest.adr);
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyGenericUnaryAAOpLZ;
-
- (** apply unary operator to array: array -> array *)
- PROCEDURE ApplyUnaryAAOp(VAR dest: UnsafeArrayT; CONST left: UnsafeArray; elementSize: SIZE;
- Loop: UnaryAALoop );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET;
- dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (*
- (* allocate destination, if necessary *)
- IF GetAdr( dest ) = -1 THEN p := Allocate( left, dest, dim, elementSize )
- ELSIF CheckGeometry( left, dest, dim )
- END;
- *)
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyUnaryAAOp;
- (** apply unary operator to array: array -> scalar *)
- PROCEDURE ApplyUnaryASOp( dest: ADDRESS; CONST left: UnsafeArray; Loop: UnaryASLoop );
- VAR loopd, looplen, loopli: SIZE; glen: SIZE;
- VAR dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr: ADDRESS );
- VAR len: SIZE; linc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dest, loopli, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim ); INC( dim );
- WHILE (len > 0) DO Traverse( dim, ladr ); INC( ladr, linc ); DEC( len ); END;
- END;
- END Traverse;
- BEGIN
- dim := GetDim( left );
- IF debug THEN Report( "AS: left", left ); END;
- (* check pattern: longest piece that can be done with a loop *)
- IF conservative THEN glen := 0 END;
- FindPattern1( left, dim, loopd, looplen, loopli ); Traverse( 0, GetAdr( left ) );
- IF conservative THEN
- looplen := 1;
- WHILE (dim > 0) DO
- looplen := looplen * GetLen( left, dim - 1 ); DEC( dim );
- END;
- ASSERT( looplen = glen );
- END;
- END ApplyUnaryASOp;
- (** apply unary operator to array: scalar -> array *)
- PROCEDURE ApplyUnarySAOp( VAR dest: UnsafeArrayT; right: ADDRESS; Loop: UnarySALoop );
- VAR loopd, looplen, loopdi: SIZE; glen: SIZE;
- VAR dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; dadr: ADDRESS );
- VAR len: SIZE; dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( right, dadr, loopdi, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( dest, dim ); dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO Traverse( dim, dadr ); INC( dadr, dinc ); DEC( len ); END;
- END;
- END Traverse;
- BEGIN
- dim := GetDim( dest );
- IF debug THEN Report( "AS: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- IF conservative THEN glen := 0 END;
- FindPattern1( dest, dim, loopd, looplen, loopdi ); Traverse( 0, GetAdr( dest ) );
- IF conservative THEN
- looplen := 1;
- WHILE (dim > 0) DO
- looplen := looplen * GetLen( dest, dim - 1 ); DEC( dim );
- END;
- ASSERT( looplen = glen );
- END;
- END ApplyUnarySAOp;
- (** apply binary operator : array x array -> array *)
- PROCEDURE ApplyBinaryAAAOp( VAR dest: UnsafeArrayT; CONST left, right: UnsafeArrayT; elementSize: SIZE;
- Loop: BinaryAAALoop );
- VAR loopd, looplen, loopli, loopri, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, radr, dadr: ADDRESS );
- VAR len: SIZE; linc, rinc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, radr, dadr, loopli, loopri, loopdi, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- rinc := GetIncr( right, dim ); dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, radr, dadr ); INC( ladr, linc ); INC( radr, rinc );
- INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- dim := GetDim( left );
- (* allocate destination, if necessary *)
- IF ~SameShape( left, right ) THEN
- Halt( GeometryMismatch, left, right, 0 )
- END;
- origdest := 0; modes := {up, down};
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- CopyUpCompatible( dest, right, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN
- Reverse( left, dim ); Reverse( dest, dim ); Reverse( right, dim );
- ELSE
- origdest := dest; p := AllocateTemp( dest, origdest, elementSize ); (* 1d field ? *)
- END;
- END;
- (* debugging *)
- IF debug THEN Report( "AAA:left", left ); Report( "AAA:right", right ); Report( "AAA:dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern3( left, right, dest, dim, loopd, looplen, loopli, loopri, loopdi );
- (* run through dimensions *)
- Traverse( 0, GetAdr( left ), GetAdr( right ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN
- Reverse( left, dim ); Reverse( dest, dim ); Reverse( right, dim );
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyBinaryAAAOp;
- (** apply binary operator: array x scalar -> array *)
- PROCEDURE ApplyBinaryASAOp( VAR dest: UnsafeArrayT; CONST left: UnsafeArrayT; right: ADDRESS;
- elementSize: SIZE;
- Loop: BinaryASALoop );
- VAR loopd, looplen, loopli, loopdi: SIZE; glen: SIZE;
- origdest: SIZE; modes: SET; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, right, dadr, loopli, loopdi, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- dim := GetDim( left );
- (* allocate destination, if necessary *)
- origdest := 0; modes := {up, down};
- IF ~AllocateSameT( dest, left, elementSize ) THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; HALT(100); (*p := AllocateTemp( dest, origdest, elementSize );*)
- END;
- END;
- (* debugging *)
- IF debug THEN Report( "ASA:left", left ); Report( "ASA:dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- (* run through dimensions *)
- IF conservative THEN glen := 0 END;
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF conservative THEN
- looplen := 1;
- WHILE (dim > 0) DO
- looplen := looplen * GetLen( left, dim - 1 ); DEC( dim );
- END;
- ASSERT( looplen = glen );
- END;
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END ApplyBinaryASAOp;
- (** apply binary operator: array x array -> scalar *)
- PROCEDURE ApplyBinaryAASOp( dest: ADDRESS; CONST left, right: UnsafeArrayT; Loop: BinaryAASLoop );
- VAR loopd, looplen, loopli, loopri: SIZE; glen: SIZE;
- dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, radr: ADDRESS );
- VAR len: SIZE; linc, rinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, radr, dest, loopli, loopri, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- rinc := GetIncr( right, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, radr ); INC( ladr, linc ); INC( radr, rinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- dim := GetDim( left );
- (* check array lengths *)
- IF ~SameShape( left, right ) THEN
- Halt( GeometryMismatch, left, right, 0 )
- END;
- IF debug THEN Report( "AAS:left", left ); Report( "AAS:right", right ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, right, dim, loopd, looplen, loopli, loopri );
- (* run through dimensions *)
- IF conservative THEN glen := 0 END;
- Traverse( 0, GetAdr( left ), GetAdr( right ) );
- IF conservative THEN
- looplen := 1;
- WHILE (dim > 0) DO
- looplen := looplen * GetLen( left, dim - 1 ); DEC( dim );
- END;
- ASSERT( looplen = glen );
- END;
- END ApplyBinaryAASOp;
- (** special binary operator: array x array -> boolean *)
- PROCEDURE ApplyBinaryAABOp( CONST left, right: UnsafeArrayT;
- Loop: BinaryAABLoop; geometryMismatchDefault: BOOLEAN ): BOOLEAN;
- VAR loopd, looplen, loopli, loopri: SIZE; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, radr: ADDRESS ): BOOLEAN;
- VAR len: SIZE; linc, rinc: SIZE;
- BEGIN
- IF dim = loopd THEN RETURN Loop( ladr, radr, loopli, loopri, looplen );
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- rinc := GetIncr( right, dim ); INC( dim );
- WHILE (len > 0) DO
- IF ~Traverse( dim, ladr, radr ) THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END;
- END Traverse;
- BEGIN
- dim := GetDim( left );
- (* check array lengths *)
- IF ~SameShape( left, right ) THEN
- RETURN geometryMismatchDefault
- END;
- (* is destination already allocated? (might be a temporary result) *)
- IF debug THEN Report( "AAB:left", left ); Report( "AAB:right", right ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, right, dim, loopd, looplen, loopli, loopri );
- (* run through dimensions *)
- RETURN Traverse( 0, GetAdr( left ), GetAdr( right ) );
- END ApplyBinaryAABOp;
- (** special binary operator: array x scalar -> boolean *)
- PROCEDURE ApplyBinaryASBOp( CONST left: UnsafeArrayT; right: ADDRESS;
- Loop: BinaryASBLoop ): BOOLEAN;
- VAR loopd, looplen, loopli: SIZE; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr: ADDRESS ): BOOLEAN;
- VAR len: SIZE; linc: SIZE;
- BEGIN
- IF dim = loopd THEN RETURN Loop( ladr, right, loopli, looplen );
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim ); INC( dim );
- WHILE (len > 0) DO
- IF ~Traverse( dim, ladr ) THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END;
- END Traverse;
- BEGIN
- dim := GetDim( left );
- IF debug THEN Report( "AAB:left", left ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern1( left, dim, loopd, looplen, loopli );
- (* run through dimensions *)
- RETURN Traverse( 0, GetAdr( left ) );
- END ApplyBinaryASBOp;
- (**** operators *)
- (*** copy *)
- PROCEDURE Copy4( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- WHILE len > 0 DO
- SYSTEM.PUT32(dadr, SYSTEM.GET32(ladr));
- INC(ladr, linc); INC(dadr, dinc); DEC(len);
- END;
- (*CODE {SYSTEM.i386}
- MOV ECX, [EBP+ladr] ; ECX := ladr
- MOV EDX, [EBP+dadr] ; EDX := dadr
- MOV EBX, [EBP+len] ; EBX := len
- start:
- CMP EBX, 0 ;
- JLE end ; WHILE EBX > 0 DO
- MOV EAX, [ECX] ; EAX := SYSTEM.GET32(ECX)
- MOV [EDX], EAX ; SYSTEM.PUT32(EDX, EAX))
- ADD ECX, [EBP+linc] ; INC(ECX, linc)
- ADD EDX, [EBP+dinc] ; INC(EDX, rinc)
- DEC EBX ; DEC(EBX)
- JMP start
- end:*)
- END Copy4;
- PROCEDURE Copy2( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- WHILE len > 0 DO
- SYSTEM.PUT16(dadr, SYSTEM.GET16(ladr));
- INC(ladr, linc); INC(dadr, dinc); DEC(len);
- END;
- (*CODE {SYSTEM.i386}
- MOV ECX, [EBP+ladr] ; ECX := ladr
- MOV EDX, [EBP+dadr] ; EDX := dadr
- MOV EBX, [EBP+len] ; EBX := len
- start:
- CMP EBX, 0 ;
- JLE end ; WHILE EBX > 0 DO
- MOV AX, [ECX] ; EAX := SYSTEM.GET32(ECX)
- MOV [EDX], AX ; SYSTEM.PUT32(EDX, EAX))
- ADD ECX, [EBP+linc] ; INC(ECX, linc)
- ADD EDX, [EBP+dinc] ; INC(EDX, rinc)
- DEC EBX ; DEC(EBX)
- JMP start
- end:*)
- END Copy2;
- PROCEDURE Copy1( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- WHILE len > 0 DO
- SYSTEM.PUT8(dadr, SYSTEM.GET8(ladr));
- INC(ladr, linc); INC(dadr, dinc); DEC(len);
- END;
- (*CODE {SYSTEM.i386}
- MOV ECX, [EBP+ladr] ; ECX := ladr
- MOV EDX, [EBP+dadr] ; EDX := dadr
- MOV EBX, [EBP+len] ; EBX := len
- start:
- CMP EBX, 0 ;
- JLE end ; WHILE EBX > 0 DO
- MOV AL, [ECX] ; EAX := SYSTEM.GET32(ECX)
- MOV [EDX], AL ; SYSTEM.PUT32(EDX, EAX))
- ADD ECX, [EBP+linc] ; INC(ECX, linc)
- ADD EDX, [EBP+dinc] ; INC(EDX, rinc)
- DEC EBX ; DEC(EBX)
- JMP start
- end:*)
- END Copy1;
- PROCEDURE Copy8( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- WHILE len > 0 DO
- SYSTEM.PUT64(dadr, SYSTEM.GET64(ladr));
- INC(ladr, linc); INC(dadr, dinc); DEC(len);
- END;
- (*CODE {SYSTEM.i386}
- MOV ECX, [EBP+ladr] ; ECX := ladr
- MOV EDX, [EBP+dadr] ; EDX := dadr
- MOV EBX, [EBP+len] ; EBX := len
- start:
- CMP EBX, 0 ;
- JLE end ; WHILE EBX > 0 DO
- MOV EAX, [ECX] ; EAX := SYSTEM.GET32(ECX)
- MOV [EDX], EAX ; SYSTEM.PUT32(EDX, EAX))
- MOV EAX, [ECX+4] ; EAX := SYSTEM.GET32(ECX+4)
- MOV [EDX+4], EAX ; SYSTEM.PUT32(EDX+4, EAX))
- ADD ECX, [EBP+linc] ; INC(ECX, linc)
- ADD EDX, [EBP+dinc] ; INC(EDX, rinc)
- DEC EBX ; DEC(EBX)
- JMP start
- end:*)
- END Copy8;
- PROCEDURE (*-*)MoveB*( srcadr, destadr, len: SIZE );
- BEGIN
- IF (srcadr >= destadr) OR (srcadr+len >= destadr) THEN
- SYSTEM.MOVE(srcadr, destadr, len);
- ELSE
- INC(srcadr,len-1); INC(destadr,len-1);
- WHILE len > 0 DO
- SYSTEM.PUT8(destadr, SYSTEM.GET8(srcadr));
- DEC(srcadr); DEC(destadr); DEC(len);
- END;
- END;
- (**
- (** Correct move if overlap, might be important for some array operations,
- do not use SYSTEM.MOVE. *)
- CODE {SYSTEM.i386}
- MOV ECX, [ESP] ; len
- MOV EDI, [ESP+4] ; destadr
- MOV ESI, [ESP+8] ; srcadr
- CMP ESI, EDI
- JAE moveup ; src adr greater then dest adr, no problem with moving up
- MOV EAX, ESI
- ADD EAX, ECX
- CMP EAX, EDI
- JBE moveup ; no overlap, no problem, move up
- MOV ESI, EAX
- ADD EDI, ECX
- DEC ESI
- DEC EDI
- STD ; move down since overlap occured
- REP
- MOVSB
- JMP done
- moveup:
- CLD
- MOV BL, CL
- SHR ECX, 2
- AND BL, 00000003H ; rest to move after 4 byte move
- REP
- MOVSD ; move 4 bytes each step
- MOV CL, BL
- REP
- MOVSB ; move rest in one byte steps
- done:
- ADD ESP, 12 ; adjust stack pointer(inline procedure!)*)
- END MoveB;
- PROCEDURE CopyContent( dest, src: ADDRESS; elementSize: SIZE ); (**! optimize *)
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET; dim: SIZE;
- PROCEDURE Loop( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- IF (dinc = elementSize) & (linc = elementSize) THEN
- MoveB( ladr, dadr, len * elementSize );
- (*
- SYSTEM.MOVE( ladr, dadr, elementSize * len );
- *)
- ELSIF (dinc = -elementSize) & (linc = -elementSize) THEN
- len := len * elementSize;
- MoveB( ladr - len + elementSize, dadr - len + elementSize, len );
- ELSIF elementSize = 1 THEN
- Copy1( ladr, dadr, linc, dinc, len );
- (*
- WHILE (len > 0) DO
- SYSTEM.PUT8( dadr, SYSTEM.GET8( ladr ) ); DEC( len ); INC( ladr, linc ); INC( dadr, dinc );
- END;
- *)
- ELSIF elementSize = 2 THEN
- Copy2( ladr, dadr, linc, dinc, len );
- (*
- WHILE (len > 0) DO
- SYSTEM.PUT16( dadr, SYSTEM.GET16( ladr ) ); DEC( len ); INC( ladr, linc ); INC( dadr, dinc );
- END;
- *)
- ELSIF elementSize = 4 THEN
- Copy4( ladr, dadr, linc, dinc, len );
- (*
- WHILE (len > 0) DO
- SYSTEM.PUT32( dadr, SYSTEM.GET32( ladr ) ); DEC( len ); INC( ladr, linc ); INC( dadr, dinc );
- END;
- *)
- ELSIF elementSize = 8 THEN
- Copy8( ladr, dadr, linc, dinc, len );
- (*
- WHILE (len > 0) DO
- SYSTEM.PUT32( dadr, SYSTEM.GET32( ladr ) );
- SYSTEM.PUT32( dadr + 4, SYSTEM.GET32( ladr + 4 ) ); DEC( len ); INC( ladr, linc );
- INC( dadr, dinc );
- END;
- *)
- ELSE (* SYSTEM.MOVE is expensive ! *)
- WHILE (len > 0) DO
- SYSTEM.MOVE( ladr, dadr, elementSize ); DEC( len ); INC( ladr, linc );
- INC( dadr, dinc );
- END;
- END;
- END Loop;
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( src, dim ); linc := GetIncr( src, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- dim := GetDim( src );
- origdest := 0; modes := {up, down}; (* copy modes *)
- ASSERT( SameShape( src, dest ) ); (* must be ensured by caller *)
- CopyUpCompatible( dest, src, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN (* can only copy from top to bottom *)
- Reverse( src, dim ); Reverse( dest, dim )
- ELSE (* can only copy via double buffer *)
- origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- IF debug THEN Report( "AA: src", src ); Report( "AA: dest", dest );
- END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( src, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( src ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( src, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END CopyContent;
- PROCEDURE AllocateSameT( VAR dest: UnsafeArrayT; CONST src: UnsafeArrayT; elementsize: SIZE ): BOOLEAN;
- VAR data: ANY; Size: SIZE;
- (* allocate a structure in dest compatible with src, if necessary. returns if allocation has taken place *)
- PROCEDURE NewData;
- VAR dim, len, size: SIZE;
- BEGIN
- dim := GetDim( src ); size := elementsize;
- PutDim( dest, dim );
- PutSize( dest, elementsize );
- WHILE (dim > 0) DO
- DEC( dim ); len := GetLen( src, dim ); PutLen( dest, dim, len );
- PutInc( dest, dim, size ); size := size * len;
- END;
- SYSTEM.NEW( data, size + ArrayAlignment);
- PutAdr( dest, Align(data));
- PutPtr( dest, data );
- END NewData;
- BEGIN
- IF dest # NIL THEN Size := GetSize( dest ); ASSERT ((Size=0) OR (Size = elementsize )); END;
- IF debug THEN KernelLog.String( "Allocate same " ); Report( "allocation source", src ); Report( "allocation des", dest ); END;
- IF dest = NIL THEN (* NIL pointer, guaranteed to be tensor *)
- dest := GetArrayDesc( GetDim( src ) );
- PutFlags(dest, {TensorFlag});
- NewData();
- RETURN TRUE;
- ELSIF GetDim( dest ) # GetDim( src ) THEN (* different dimension *)
- (* check if re-allocation of descriptor is allowed *)
- IF ~(TensorFlag IN GetFlags( dest )) &
- ~(TemporaryFlag IN GetFlags( dest )) THEN (* no, not allowed*)
- HALT( 100 );
- END;
- dest := GetArrayDesc( GetDim( src ) );
- PutFlags(dest, {TensorFlag});
- NewData();
- RETURN TRUE;
- ELSIF (GetAdr( dest ) = 0) OR ~SameShape( dest, src ) THEN
- (* check if re-allocation of array data is allowed *)
- IF RangeFlag IN GetFlags( dest ) THEN (* no! not allowed *)
- HALT( 100 );
- END;
- NewData();
- RETURN TRUE;
- ELSE (* nothing to do *)
- RETURN FALSE;
- END;
- END AllocateSameT;
- PROCEDURE Assign*(VAR dest: ADDRESS; src: ADDRESS);
- VAR oldDest: ADDRESS;
- BEGIN
- IF (dest # NIL) THEN
- IF (TensorFlag IN GetFlags( dest )) THEN (* old heap pointer overwritten *)
- oldDest := dest;
- Heaps.Assign(dest, src);
- (*TRACE(Heaps.RefCount(oldDest)); *)
-
- ELSE
- (*
- Heaps.ResetMathArray(dest);
- *)
- dest := src;
- END;
- ELSE
- (* Heaps.Refer(src);*)
- dest := src;
- END;
- END Assign;
- PROCEDURE TempDescCopy( CONST src: UnsafeArrayT ): UnsafeArrayT;
- VAR dest: UnsafeArrayT; adr: ADDRESS;dim: SIZE;
- BEGIN
- dim := GetDim(src);
- dest := GetArrayDesc(dim);
- SYSTEM.MOVE( src, dest, dim * SIZEOF(LenInc) + MathLenOffset );
- dest.adr := NIL;
- SYSTEM.PUT(ADDRESS OF dest.ptr, NIL); (* no refcounting here ! *)
- PutFlags( dest, {} );
- RETURN dest;
- END TempDescCopy;
- (* used when arrays are passed by value *)
- PROCEDURE CopyArraySelf*( VAR dest: UnsafeArrayT; CONST src: UnsafeArrayT; elementsize: SIZE );
- VAR p: UnsafeArrayT;
- BEGIN
- ASSERT( src = dest );
- p := TempDescCopy( dest ); (* copy and prepare dest to be copied over *)
- CopyArray( dest, p, elementsize );
- END CopyArraySelf;
- PROCEDURE CopyArray*( dest: UnsafeArray (* untraced! *); CONST src: UnsafeArrayT; elementsize: SIZE );
- VAR srcdim, destdim: SIZE;
- BEGIN
- ASSERT(dest # NIL); (* only possible by compiler error *)
- IF GetDim( src ) # GetDim( dest ) THEN (* not allowed but possible (tensor) *)
- srcdim := GetDim(src);
- destdim := GetDim(dest);
- (*
- Debugging.Stack("copy array");
- *)
- Report( "copy array source", src ); Report( "copy array des", dest );
- HALT(100);
- ELSIF src = dest THEN (* self copy *)
- CopyArraySelf( dest, src, elementsize );
- ELSE
- IF AllocateSameT( dest, src, elementsize ) THEN END;
- CopyContent( dest, src, elementsize )
- END;
- END CopyArray;
- PROCEDURE CopyTensorSelf*( VAR dest: UnsafeArrayT; CONST src: UnsafeArrayT; elementsize: SIZE );
- BEGIN
- dest := NIL;
- CopyTensor( dest, src, elementsize );
- END CopyTensorSelf;
- PROCEDURE CopyTensor*( VAR dest: UnsafeArrayT; CONST src: UnsafeArrayT;
- elementsize: SIZE );
- BEGIN
- (* Report("dest",dest); Report("src",src); *)
- IF (src = NIL) THEN dest := NIL
- ELSIF (dest = NIL) OR ~(SameShape( dest, src )) OR (GetAdr( dest ) = 0) THEN
- IF AllocateSameT( dest, src, elementsize ) THEN END; (* includes check if allocation is allowed *)
- CopyContent( dest, src, elementsize );
- ELSIF dest = src THEN CopyTensorSelf( dest, src, elementsize );
- ELSE CopyContent( dest, src, elementsize )
- END;
- END CopyTensor;
- (* copy descriptor of src to that of dest. If not existent then create.*)
- PROCEDURE ShallowCopy*(VAR dest: UnsafeArrayT; CONST src: UnsafeArrayT);
- VAR ptr: ANY; flags: SET;
- PROCEDURE CopyDescriptor;
- BEGIN
- dest.ptr := src.ptr;(* GC! Must do before MOVE (NIL <- src.ptr), then copy redundant *)
- SYSTEM.MOVE( src , dest, MathLenOffset + SIZEOF(LenInc) * GetDim( src ));
- END CopyDescriptor;
- BEGIN
- (*
- ShallowCopy is either called with a reference to a pointer in which case the dest pointer is safe
- or it is called with an array descriptor in which case a reallocation is forbidden. The pointer cannot escape.
- *)
- IF dest = 0 THEN (* NIL pointer, guaranteed to be tensor *)
- dest := GetArrayDesc( GetDim( src ) );
- CopyDescriptor();
- PutFlags(dest, {TensorFlag});
- ELSIF GetDim( dest ) # GetDim( src ) THEN (* different dimension *)
- flags := GetFlags(dest);
- (* check if re-allocation of descriptor is allowed *)
- IF ~(TensorFlag IN GetFlags( dest )) & ~(TemporaryFlag IN GetFlags( dest )) THEN (* no, not allowed*)
- Halt(DimensionMismatch,src,0,dest);
- END;
- (* create a new descriptor!!! (added by Alexey) *)
- dest := GetArrayDesc( GetDim( src ) );
- CopyDescriptor();
- PutFlags(dest, flags);
- ELSE
- flags := GetFlags(dest);
- (* check if re-allocation of array data is allowed *)
- IF RangeFlag IN GetFlags( dest ) THEN (* no! not allowed *)
- Halt(AllocationForbidden,src,0,dest);
- END;
- CopyDescriptor();
- PutFlags(dest, flags);
- END;
- END ShallowCopy;
- (*
- PROCEDURE DescriptorCopy( src, dest: LONGINT );
- BEGIN
- IF debug THEN
- KernelLog.String( "DescriptorCopy from " ); KernelLog.Int( src, 1 ); KernelLog.String( " to " );
- KernelLog.Int( dest, 1 ); KernelLog.Ln;
- END;
- SYSTEM.MOVE( src, dest, 2*SIZEOF(ADDRESS) ); (* adr and ptr *)
- SYSTEM.MOVE( src + MathLenOffset, dest + MathLenOffset, SIZEOF(LenInc) * GetDim( src )); (* lens and increments *)
- END DescriptorCopy;
- *)
- PROCEDURE ZeroCopy*(CONST src: ARRAY [?]; VAR dest: ARRAY {UNSAFE} [?]);
- BEGIN
- ShallowCopy(dest,src);
- END ZeroCopy;
- OPERATOR "ALIAS"*(CONST src: ARRAY [?]): ARRAY[?];
- BEGIN
- ZeroCopy(src, RESULT);
- RETURN RESULT
- END "ALIAS";
- PROCEDURE SameShape( l, r: ADDRESS ): BOOLEAN;
- VAR dim: SIZE;
- BEGIN
- dim := GetDim( l );
- IF dim # GetDim( r ) THEN RETURN FALSE END;
- WHILE (dim > 0) DO
- DEC( dim );
- IF GetLen( l, dim ) # GetLen( r, dim ) THEN RETURN FALSE END;
- END;
- RETURN TRUE;
- END SameShape;
- (*
- PROCEDURE ZeroCopyArray*( dest: ADDRESS; src: ADDRESS; elementsize: LONGINT );
- (*
- called as ZeroCopy(A,B,Size) with enhanced arrays A,B
- check if deep copy can be avoided and if so then do a shallow copy
- *)
- BEGIN
- ASSERT( dest # 0 ); (* impossible *)
- IF GetDim( src ) # GetDim( dest ) THEN (* not allowed but possible (tensor) *)
- HALT( 100 );
- ELSIF (RangeFlag IN GetFlags( src )) THEN
- (* must copy (and allocate) *)
- CopyArray( dest, src, elementsize );
- ELSIF (RangeFlag IN GetFlags( dest )) THEN (* copy only allowed if shape matches *)
- IF ~SameShape( dest, src ) THEN HALT( 100 );
- ELSE CopyContent( dest, src, elementsize )
- END;
- ELSE DescriptorCopy( src, dest )
- END;
- END ZeroCopyArray;
- PROCEDURE ZeroCopyTensor*( VAR dest: ADDRESS; src: ADDRESS; elementsize: LONGINT );
- (*
- called as ZeroCopy(A,B,Size) with A,B: ARRAY [?] OF ...
- check if deep copy can be avoided and if so then do a shallow copy
- *)
- BEGIN
- IF debug THEN
- KernelLog.String( "ZeroCopy2: " ); KernelLog.String( "ADDRESSOF(dest) " ); KernelLog.Int( ADDRESSOF( dest ), 10 );
- KernelLog.Ln; KernelLog.String( "ADDRESSOF(src) " ); KernelLog.Int( ADDRESSOF( src ), 10 ); KernelLog.Ln;
- KernelLog.String( "dest " ); KernelLog.Int( dest, 10 ); KernelLog.Ln; KernelLog.String( "src " );
- KernelLog.Int( src, 10 ); KernelLog.Ln; KernelLog.String( "elementsize" );
- KernelLog.Int( elementsize, 10 ); KernelLog.Ln;
- END;
- IF (dest = 0) OR (TensorFlag IN GetFlags( dest )) THEN (* descriptor allocation allowed *)
- IF (TensorFlag IN GetFlags( src )) THEN dest := src;
- ELSE
- CopyTensor( dest, src, elementsize ); (* allocate freshly *)
- END;
- ELSIF (RangeFlag IN GetFlags( src )) THEN
- (* must copy (and allocate) *)
- CopyTensor( dest, src, elementsize );
- ELSIF (RangeFlag IN GetFlags( dest )) THEN (* descriptor copy forbidden *)
- IF SameShape( src, dest ) THEN CopyContent( dest, src, elementsize )
- ELSE
- HALT( 100 ); (* copy forbidden *)
- END;
- ELSIF GetDim( src ) = GetDim( dest ) THEN (* descriptor copy allowed *)
- DescriptorCopy( src, dest );
- ELSE
- HALT( 100 ); (* different shapes: not allowed *)
- END;
- END ZeroCopyTensor;
- PROCEDURE ZeroCopy*( left, elementSize, dest, dim: LONGINT ); (**! optimize *)
- VAR i: LONGINT;
- BEGIN
- IF GetPtr( dest ) = -1 THEN (* zero copy forbidden, try data copy *)
- CopyContent( dest, left, elementSize )
- ELSE
- IF debug THEN
- KernelLog.String( "Zero Copy" ); KernelLog.Int( left, 10 ); KernelLog.Int( dest, 10 );
- KernelLog.Ln;
- END;
- PutPtr( dest, GetPtr( left ) ); PutAdr( dest, GetAdr( left ) );
- FOR i := 0 TO dim - 1 DO
- PutInc( dest, i, GetIncr( left, i ) ); PutLen( dest, i, GetLen( left, i ) );
- END;
- END;
- END ZeroCopy;
- *)
- (*** conversions ****)
- (** SHORTINT -> INTEGER *)
- PROCEDURE ConvertASAILoop( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- WHILE (len > 0) DO (* SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); *)
- SYSTEM.PUT16( dadr, SYSTEM.GET8( ladr ) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END ConvertASAILoop;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp( RESULT, src, SIZEOF( INTEGER ),ConvertASAILoop );
- RETURN RESULT
- END "@Convert";
- OPERATOR "LONG"*(CONST src: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp( RESULT, src, SIZEOF( INTEGER ),ConvertASAILoop );
- RETURN RESULT
- END "LONG";
- (** SHORTINT -> LONGINT *)
- PROCEDURE ConvertLoopSL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- WHILE (len > 0) DO (* SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); *)
- SYSTEM.PUT32( dadr, SYSTEM.GET8( ladr ) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END ConvertLoopSL;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [?] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGINT ),ConvertLoopSL );
- RETURN RESULT
- END "@Convert";
- (** SHORTINT -> REAL *)
- PROCEDURE ConvertLoopSR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SHORTINT; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopSR;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( REAL ), ConvertLoopSR );
- RETURN RESULT
- END "@Convert";
- (** SHORTINT -> LONGREAL *)
- PROCEDURE ConvertLoopSX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SHORTINT; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopSX;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGREAL ), ConvertLoopSX );
- RETURN RESULT
- END "@Convert";
- (** INTEGER -> SHORTINT (SHORT) *)
- PROCEDURE ConvertLoopIS( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: INTEGER; dval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := SHORT( lval ); SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopIS;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( SHORTINT ), ConvertLoopIS );
- RETURN RESULT
- END "@Convert";
- OPERATOR "SHORT"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( SHORTINT ), ConvertLoopIS );
- RETURN RESULT
- END "SHORT";
- (** INTEGER -> LONGINT *)
- PROCEDURE ConvertLoopIL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- WHILE (len > 0) DO (* SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); *)
- SYSTEM.PUT32( dadr, SYSTEM.GET16( ladr ) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END ConvertLoopIL;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGINT ), ConvertLoopIL );
- RETURN RESULT
- END "@Convert";
- OPERATOR "LONG"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGINT ), ConvertLoopIL );
- RETURN RESULT
- END "LONG";
- (** INTEGER -> REAL *)
- PROCEDURE ConvertLoopIR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: INTEGER; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopIR;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( REAL ), ConvertLoopIR );
- RETURN RESULT
- END "@Convert";
- (** INTEGER -> LONGREAL *)
- PROCEDURE ConvertLoopIX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: INTEGER; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopIX;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGREAL ), ConvertLoopIX );
- RETURN RESULT
- END "@Convert";
- (** LONGINT -> INTEGER (SHORT) *)
- PROCEDURE ConvertLoopLI( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT; dval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := SHORT( lval ); SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopLI;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( INTEGER ),ConvertLoopLI );
- RETURN RESULT
- END "@Convert";
- OPERATOR "SHORT"*(CONST src: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( INTEGER ),ConvertLoopLI );
- RETURN RESULT
- END "SHORT";
- (** LONGINT -> REAL *)
- PROCEDURE ConvertLoopLR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopLR;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( REAL ), ConvertLoopLR );
- RETURN RESULT
- END "@Convert";
- (** LONGINT -> LONGREAL *)
- PROCEDURE ConvertLoopLX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopLX;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGREAL ), ConvertLoopLX );
- RETURN RESULT
- END "@Convert";
- (** REAL -> LONGINT (ENTIER) *)
- PROCEDURE ConvertLoopRL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: REAL; dval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := ENTIER( lval ); SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopRL;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGINT ), ConvertLoopRL );
- RETURN RESULT
- END "@Convert";
- OPERATOR "ENTIER"*(CONST src: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGINT ), ConvertLoopRL );
- RETURN RESULT
- END "ENTIER";
- (** REAL -> LONGREAL *)
- PROCEDURE ConvertLoopRX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: REAL; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopRX;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGREAL ), ConvertLoopRX );
- RETURN RESULT
- END "@Convert";
- OPERATOR "LONG"*(CONST src: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGREAL ), ConvertLoopRX );
- RETURN RESULT
- END "LONG";
- (** LONGREAL -> REAL (SHORT) *)
- PROCEDURE ConvertLoopXR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGREAL; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := SHORT( lval ); SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopXR;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( REAL ), ConvertLoopXR );
- RETURN RESULT
- END "@Convert";
- OPERATOR "SHORT"*(CONST src: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( REAL ), ConvertLoopXR );
- RETURN RESULT
- END "SHORT";
- (** LONGREAL -> LONGINT (ENTIER) *)
- PROCEDURE ConvertLoopXL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGREAL; dval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := ENTIER( lval ); SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopXL;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGINT ),ConvertLoopXL );
- RETURN RESULT
- END "@Convert";
-
- OPERATOR "ENTIER"*(CONST src: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGINT ),ConvertLoopXL );
- RETURN RESULT
- END "ENTIER";
-
- (** SIZES **)
- PROCEDURE ConvertLoopLY( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT; dval: SIZE;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopLY;
-
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( SIZE ), ConvertLoopLY );
- RETURN RESULT
- END "@Convert";
- PROCEDURE ConvertLoopYZ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SIZE; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopYZ;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF SIZE ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGREAL ), ConvertLoopYZ );
- RETURN RESULT
- END "@Convert";
- PROCEDURE ConvertLoopYR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SIZE; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopYR;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF SIZE ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( REAL ), ConvertLoopYR );
- RETURN RESULT
- END "@Convert";
- (*** monadic not A -> ~A ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE NotLoopAB( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ~lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END NotLoopAB;
- OPERATOR "~"*(CONST src: ARRAY [ ? ] OF BOOLEAN): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( BOOLEAN ), NotLoopAB );
- RETURN RESULT
- END "~";
-
- (*** monadic generic (A) -> -A ********************************************************************)
- (** SHORTINT *)
- PROCEDURE GenericLoopS( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: SHORTINT): SHORTINT );
- VAR lval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopS;
-
- (** INTEGER *)
- PROCEDURE GenericLoopI( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: INTEGER): INTEGER );
- VAR lval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopI;
- (** LONGINT *)
- PROCEDURE GenericLoopL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGINT): LONGINT );
- VAR lval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopL;
- (** HUGEINT *)
- PROCEDURE GenericLoopH( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: HUGEINT): HUGEINT );
- VAR lval: HUGEINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopH;
- (** REAL *)
- PROCEDURE GenericLoopR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: REAL): REAL );
- VAR lval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopR;
- (** LONGREAL *)
- PROCEDURE GenericLoopX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGREAL): LONGREAL );
- VAR lval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopX;
-
- (** COMPLEX *)
- PROCEDURE GenericLoopZ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: COMPLEX): COMPLEX );
- VAR lval,dval: POINTER{UNSAFE,UNTRACED} TO RECORD val: COMPLEX END;
- BEGIN
- WHILE (len > 0) DO
- lval := ladr;
- dval := dadr;
- dval.val := op(lval.val);
- INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopZ;
- (** LONGCOMPLEX *)
- PROCEDURE GenericLoopLZ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGCOMPLEX): LONGCOMPLEX );
- VAR lval,dval: POINTER{UNSAFE,UNTRACED} TO RECORD val: LONGCOMPLEX END;
- BEGIN
- WHILE (len > 0) DO
- lval := ladr;
- dval := dadr;
- dval.val := op (lval.val);
- INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopLZ;
- (*** monadic minus A -> -A ********************************************************************)
- (** SHORTINT *)
- PROCEDURE MinusLoopS( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopS;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( SHORTINT ), MinusLoopS );
- RETURN RESULT
- END "-";
- (** INTEGER *)
- PROCEDURE MinusLoopI( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopI;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( INTEGER ), MinusLoopI );
- RETURN RESULT
- END "-";
- (** LONGINT *)
- PROCEDURE MinusLoopL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopL;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGINT ), MinusLoopL );
- RETURN RESULT
- END "-";
- (** SIZE *)
- PROCEDURE MinusLoopY( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SIZE;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopY;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF SIZE): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( SIZE ), MinusLoopY );
- RETURN RESULT
- END "-";
- (** REAL *)
- PROCEDURE MinusLoopR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopR;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- IF debug THEN KernelLog.String( "MinusAR" ); KernelLog.Ln; END;
- ApplyUnaryAAOp(RESULT, src,SIZEOF( REAL ), MinusLoopR );
- RETURN RESULT
- END "-";
- (** LONGREAL *)
- PROCEDURE MinusLoopX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopX;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src, SIZEOF( LONGREAL ),
- MinusLoopX );
- RETURN RESULT
- END "-";
- (*** add array + array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE AddASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddASASLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( SHORTINT ), AddASASLoop );
- RETURN RESULT
- END "+";
- (** INTEGER *)
- PROCEDURE AddAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddAIAILoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( INTEGER ), AddAIAILoop );
- RETURN RESULT
- END "+";
- (** LONGINT *)
- PROCEDURE AddALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddALALLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY {UNSAFE} [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGINT ), AddALALLoop );
- RETURN RESULT
- END "+";
- (** REAL *)
- PROCEDURE AddARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddARARLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF REAL): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( REAL ),
- loopAddARAR );
- RETURN RESULT
- END "+";
- (** LONGREAL *)
- PROCEDURE AddAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddAXAXLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY {UNSAFE} [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGREAL ), loopAddAXAX );
- RETURN RESULT
- END "+";
- (** COMPLEX *)
- PROCEDURE AddAZAZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddAZAZLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF COMPLEX): ARRAY {UNSAFE} [?] OF COMPLEX;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( COMPLEX ), loopAddAZAZ );
- RETURN RESULT
- END "+";
- (** HUGEINT *)
- PROCEDURE AddAHAHLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: HUGEINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddAHAHLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF HUGEINT): ARRAY {UNSAFE} [?] OF HUGEINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( HUGEINT ), AddAHAHLoop);
- RETURN RESULT
- END "+";
- (** SIZE *)
- PROCEDURE AddAYAYLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SIZE;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddAYAYLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF SIZE): ARRAY {UNSAFE} [?] OF SIZE;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( SIZE ), AddAYAYLoop);
- RETURN RESULT
- END "+";
- (** LONGCOMPLEX *)
- PROCEDURE AddALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- SYSTEM.PUT( dadr, lvalRe+rvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalIm+rvalIm );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END AddALZALZLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF LONGCOMPLEX): ARRAY {UNSAFE} [?] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGCOMPLEX ), loopAddALZALZ );
- RETURN RESULT
- END "+";
- (*** add array + scalar -> array and scalar + array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE AddASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddASSSLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( SHORTINT ), AddASSSLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SHORTINT ), AddASSSLoop );
- RETURN RESULT
- END "+";
- (** INTEGER *)
- PROCEDURE AddAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddAISILoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( INTEGER ), AddAISILoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( INTEGER ), AddAISILoop );
- RETURN RESULT
- END "+";
- (** LONGINT *)
- PROCEDURE AddALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddALSLLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGINT ), AddALSLLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGINT ), AddALSLLoop );
- RETURN RESULT
- END "+";
- (** REAL *)
- PROCEDURE AddARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddARSRLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( REAL ),
- AddARSRLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( REAL ),
- AddARSRLoop );
- RETURN RESULT
- END "+";
- (** LONGREAL *)
- PROCEDURE AddAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddAXSXLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGREAL ), AddAXSXLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGREAL ), AddAXSXLoop );
- RETURN RESULT
- END "+";
- (** COMPLEX *)
- PROCEDURE AddAZSZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddAZSZLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF COMPLEX; right: COMPLEX ): ARRAY {UNSAFE} [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( COMPLEX ),
- AddAZSZLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: COMPLEX; CONST right: ARRAY [ ? ] OF COMPLEX): ARRAY {UNSAFE} [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( COMPLEX ),
- AddAZSZLoop );
- RETURN RESULT
- END "+";
-
- (** HUGEINT *)
- PROCEDURE AddAHSHLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: HUGEINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddAHSHLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF HUGEINT; right: HUGEINT ): ARRAY {UNSAFE} [ ? ] OF HUGEINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( HUGEINT ),
- AddAHSHLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: HUGEINT; CONST right: ARRAY [ ? ] OF HUGEINT): ARRAY {UNSAFE} [ ? ] OF HUGEINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( HUGEINT ),
- AddAHSHLoop );
- RETURN RESULT
- END "+";
- (** SIZE *)
- PROCEDURE AddAYSYLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddAYSYLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF SIZE; right: SIZE ): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( SIZE ),
- AddAYSYLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: SIZE; CONST right: ARRAY [ ? ] OF SIZE): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( SIZE ),
- AddAYSYLoop );
- RETURN RESULT
- END "+";
- (** LONGCOMPLEX *)
- PROCEDURE AddALZSLZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.PUT( dadr, lvalRe + rvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalIm + rvalIm );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddALZSLZLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF LONGCOMPLEX; right: LONGCOMPLEX ): ARRAY {UNSAFE} [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( LONGCOMPLEX ),
- AddALZSLZLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: LONGCOMPLEX; CONST right: ARRAY [ ? ] OF LONGCOMPLEX): ARRAY {UNSAFE} [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( LONGCOMPLEX ),
- AddALZSLZLoop );
- RETURN RESULT
- END "+";
- (*** subtraction array - array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE SubASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubASASLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( SHORTINT ), SubASASLoop );
- RETURN RESULT
- END "-";
- (** INTEGER *)
- PROCEDURE SubAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubAIAILoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( INTEGER ), SubAIAILoop );
- RETURN RESULT
- END "-";
- (** LONGINT *)
- PROCEDURE SubALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubALALLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY {UNSAFE} [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGINT ), SubALALLoop );
- RETURN RESULT
- END "-";
- (** SIZE *)
- PROCEDURE SubAYAYLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SIZE;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubAYAYLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF SIZE): ARRAY {UNSAFE} [?] OF SIZE;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( SIZE ), SubAYAYLoop );
- RETURN RESULT
- END "-";
- (** REAL *)
- PROCEDURE SubARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubARARLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF REAL): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( REAL ),
- SubARARLoop );
- RETURN RESULT
- END "-";
- (** LONGREAL *)
- PROCEDURE SubAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubAXAXLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY {UNSAFE} [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGREAL ), SubAXAXLoop );
- RETURN RESULT
- END "-";
- (** COMPLEX *)
- PROCEDURE SubAZAZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubAZAZLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF COMPLEX): ARRAY {UNSAFE} [?] OF COMPLEX;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( COMPLEX ), SubAZAZLoop );
- RETURN RESULT
- END "-";
- (** LONGCOMPLEX *)
- PROCEDURE SubALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- SYSTEM.PUT( dadr, lvalRe-rvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalIm-rvalIm );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END SubALZALZLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF LONGCOMPLEX): ARRAY {UNSAFE} [?] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGCOMPLEX ), SubALZALZLoop );
- RETURN RESULT
- END "-";
- (*** subtraction array-scalar -> array ********************************************************************)
- (** SHORTINT *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF SHORTINT; (* a: left, b: right, c: dest *)
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** INTEGER *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** LONGINT *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** LONGINT *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF SIZE; right: SIZE ): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
-
- (** REAL *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** LONGREAL *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** COMPLEX *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF COMPLEX; right: COMPLEX ): ARRAY {UNSAFE} [ ? ] OF COMPLEX;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** LONGCOMPLEX *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF LONGCOMPLEX; right: LONGCOMPLEX ): ARRAY {UNSAFE} [ ? ] OF LONGCOMPLEX;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (*** subtraction scalar-array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE SubSSASLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSSASLoop;
- OPERATOR "-"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SHORTINT ), SubSSASLoop );
- RETURN RESULT
- END "-";
- (** INTEGER *)
- PROCEDURE SubSIAILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSIAILoop;
- OPERATOR "-"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT, right, ADDRESSOF( left ),
- SIZEOF( INTEGER ), SubSIAILoop );
- RETURN RESULT
- END "-";
- (** LONGINT *)
- PROCEDURE SubSLALLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSLALLoop;
- OPERATOR "-"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGINT ), SubSLALLoop );
- RETURN RESULT
- END "-";
-
- (** SIZE *)
- PROCEDURE SubSYAYLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSYAYLoop;
- OPERATOR "-"*(left: SIZE; CONST right: ARRAY [ ? ] OF SIZE): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SIZE ), SubSYAYLoop );
- RETURN RESULT
- END "-";
- (** REAL *)
- PROCEDURE SubSRARLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSRARLoop;
- OPERATOR "-"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( REAL ),
- SubSRARLoop );
- RETURN RESULT
- END "-";
- (** LONGREAL *)
- PROCEDURE SubSXAXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSXAXLoop;
- OPERATOR "-"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGREAL ), SubSXAXLoop );
- RETURN RESULT
- END "-";
- (** COMPLEX *)
- PROCEDURE SubSZAZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: COMPLEX;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSZAZLoop;
- OPERATOR "-"*(left: COMPLEX; CONST right: ARRAY [ ? ] OF COMPLEX): ARRAY {UNSAFE} [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( COMPLEX ), SubSZAZLoop );
- RETURN RESULT
- END "-";
- (** LONGCOMPLEX *)
- PROCEDURE SubSLZALZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.PUT( dadr, rvalRe-lvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), rvalIm-lvalIm );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSLZALZLoop;
- OPERATOR "-"*(left: LONGCOMPLEX; CONST right: ARRAY [ ? ] OF LONGCOMPLEX): ARRAY {UNSAFE} [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGCOMPLEX ), SubSLZALZLoop );
- RETURN RESULT
- END "-";
- (*** element-wise multiply array x array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EMulASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulASASLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( SHORTINT ), EMulASASLoop );
- RETURN RESULT
- END ".*";
- (** INTEGER *)
- PROCEDURE EMulAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval * rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EMulAIAILoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( INTEGER ), EMulAIAILoop );
- RETURN RESULT
- END ".*";
- (** LONGINT *)
- PROCEDURE EMulALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulALALLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY {UNSAFE} [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGINT ), EMulALALLoop );
- RETURN RESULT
- END ".*";
- (** REAL *)
- PROCEDURE EMulARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulARARLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF REAL): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( REAL ),
- EMulARARLoop );
- RETURN RESULT
- END ".*";
- (** LONGREAL *)
- PROCEDURE EMulAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulAXAXLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY {UNSAFE} [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGREAL ), EMulAXAXLoop );
- RETURN RESULT
- END ".*";
- (** COMPLEX *)
- PROCEDURE EMulAZAZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulAZAZLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF COMPLEX): ARRAY {UNSAFE} [?] OF COMPLEX;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( COMPLEX ), EMulAZAZLoop );
- RETURN RESULT
- END ".*";
- (** LONGCOMPLEX *)
- PROCEDURE EMulALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- SYSTEM.PUT( dadr, lvalRe*rvalRe - lvalIm*rvalIm ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalRe*rvalIm + lvalIm*rvalRe );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EMulALZALZLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF LONGCOMPLEX): ARRAY {UNSAFE} [?] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGCOMPLEX ), EMulALZALZLoop );
- RETURN RESULT
- END ".*";
- (*** element-wise multiply and add array x array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EMulIncASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval,dval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.GET(dadr,dval); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulIncASASLoop;
- OPERATOR ".*+"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( SHORTINT ), EMulIncASASLoop );
- END ".*+";
- (** INTEGER *)
- PROCEDURE EMulIncAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval,dval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );SYSTEM.GET(dadr,dval); dval := dval + lval * rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EMulIncAIAILoop;
- OPERATOR ".*+"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( INTEGER ), EMulIncAIAILoop );
- END ".*+";
- (** LONGINT *)
- PROCEDURE EMulIncALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval,dval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.GET(dadr,dval); SYSTEM.PUT( dadr, dval+ lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulIncALALLoop;
- OPERATOR ".*+"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY {UNSAFE} [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGINT ), EMulIncALALLoop );
- END ".*+";
- (** REAL *)
- PROCEDURE EMulIncARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval,dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.GET(dadr,dval); SYSTEM.PUT( dadr, dval+ lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulIncARARLoop;
- OPERATOR ".*+"*(CONST left,right: ARRAY [?] OF REAL): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( REAL ),
- EMulIncARARLoop );
- END ".*+";
- (** LONGREAL *)
- PROCEDURE EMulIncAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval,dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.GET(dadr,dval); SYSTEM.PUT( dadr,dval+ lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulIncAXAXLoop;
- OPERATOR ".*+"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY {UNSAFE} [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGREAL ), EMulIncAXAXLoop );
- END ".*+";
- (*** multiply array x scalar -> array and scalar + array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE MulASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulASSSLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MulASSSLoop );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SHORTINT ), MulASSSLoop );
- RETURN RESULT
- END "*";
- (** INTEGER *)
- PROCEDURE MulAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulAISILoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( INTEGER ), MulAISILoop );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( INTEGER ), MulAISILoop );
- RETURN RESULT
- END "*";
- (** LONGINT *)
- PROCEDURE MulALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulALSLLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGINT ), MulALSLLoop );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGINT ), MulALSLLoop );
- RETURN RESULT
- END "*";
- (** SIZE *)
- PROCEDURE MulAYSYLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulAYSYLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF SIZE; right: SIZE ): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( SIZE ), MulAYSYLoop );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: SIZE; CONST right: ARRAY [ ? ] OF SIZE): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SIZE ), MulAYSYLoop );
- RETURN RESULT
- END "*";
- (** REAL *)
- PROCEDURE MulARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulARSRLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( REAL ),
- loopMulARSR );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( REAL ),
- loopMulARSR );
- RETURN RESULT
- END "*";
- (** LONGREAL *)
- PROCEDURE MulAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- IF debug THEN
- KernelLog.String( "MulAXSXLoop, ladr,radr,dadr,linc,dinc,len= " ); KernelLog.Int( ladr, 10 ); KernelLog.Int( radr, 10 );
- KernelLog.Int( dadr, 10 ); KernelLog.Int( linc, 10 ); KernelLog.Int( dinc, 10 );
- KernelLog.Int( len, 10 ); KernelLog.Ln;
- END;
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulAXSXLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMulAXSX );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGREAL ), loopMulAXSX );
- RETURN RESULT
- END "*";
- (** COMPLEX *)
- PROCEDURE MulAZSZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulAZSZLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF COMPLEX; right: COMPLEX ): ARRAY {UNSAFE} [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( COMPLEX ),
- loopMulAZSZ );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: COMPLEX; CONST right: ARRAY [ ? ] OF COMPLEX): ARRAY {UNSAFE} [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( COMPLEX ),
- loopMulAZSZ );
- RETURN RESULT
- END "*";
- (** LONGCOMPLEX *)
- PROCEDURE MulALZSLZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.PUT( dadr, lvalRe * rvalRe - lvalIm*rvalIm ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalRe * rvalIm + lvalIm*rvalRe );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulALZSLZLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF LONGCOMPLEX; right: LONGCOMPLEX ): ARRAY {UNSAFE} [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( LONGCOMPLEX ),
- loopMulALZSLZ );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: LONGCOMPLEX; CONST right: ARRAY [ ? ] OF LONGCOMPLEX): ARRAY {UNSAFE} [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( LONGCOMPLEX ),
- loopMulALZSLZ );
- RETURN RESULT
- END "*";
- (*** multiply and add array * scalar -> array and scalar * array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE IncMulASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( dadr, dval ); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END IncMulASSSLoop;
- OPERATOR "INCMUL"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( SHORTINT ), IncMulASSSLoop );
- END "INCMUL";
- OPERATOR "INCMUL"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SHORTINT ), IncMulASSSLoop );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( SHORTINT ), IncMulASSSLoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SHORTINT ), IncMulASSSLoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** INTEGER *)
- PROCEDURE IncMulAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( dadr, dval ); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END IncMulAISILoop;
- OPERATOR "INCMUL"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( INTEGER ), IncMulAISILoop );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( INTEGER ), IncMulAISILoop );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( INTEGER ), IncMulAISILoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( INTEGER ), IncMulAISILoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** LONGINT *)
- PROCEDURE IncMulALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( dadr, dval ); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END IncMulALSLLoop;
- OPERATOR "INCMUL"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGINT ), IncMulALSLLoop );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGINT ), IncMulALSLLoop );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGINT ), IncMulALSLLoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGINT ), IncMulALSLLoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** REAL *)
- PROCEDURE IncMulARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( dadr, dval ); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END IncMulARSRLoop;
- OPERATOR "INCMUL"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( REAL ),
- loopIncMulARSR );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( REAL ),
- loopIncMulARSR );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( REAL ),
- loopIncMulARSR );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( REAL ),
- loopIncMulARSR );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** LONGREAL *)
- PROCEDURE IncMulAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: LONGREAL;
- BEGIN
- IF debug THEN
- KernelLog.String( "IncMulAXSXLoop, ladr,radr,dadr,linc,dinc,len= " ); KernelLog.Int( ladr, 10 ); KernelLog.Int( radr, 10 );
- KernelLog.Int( dadr, 10 ); KernelLog.Int( linc, 10 ); KernelLog.Int( dinc, 10 );
- KernelLog.Int( len, 10 ); KernelLog.Ln;
- END;
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( dadr, dval ); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END IncMulAXSXLoop;
- OPERATOR "INCMUL"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopIncMulAXSX );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGREAL ), loopIncMulAXSX );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopIncMulAXSX );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGREAL ), loopIncMulAXSX );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (*** element-wise division array / array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EDivideASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideASASLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( REAL ),
- EDivideASASLoop );
- RETURN RESULT
- END "./";
- (** INTEGER *)
- PROCEDURE EDivideAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideAIAILoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( REAL ),
- EDivideAIAILoop );
- RETURN RESULT
- END "./";
- (** LONGINT *)
- PROCEDURE EDivideALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideALALLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( REAL ),
- EDivideALALLoop );
- RETURN RESULT
- END "./";
- (** REAL *)
- PROCEDURE EDivideARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideARARLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF REAL): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( REAL ),
- EDivideARARLoop );
- RETURN RESULT
- END "./";
- (** LONGREAL *)
- PROCEDURE EDivideAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideAXAXLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY {UNSAFE} [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGREAL ), EDivideAXAXLoop );
- RETURN RESULT
- END "./";
- (** COMPLEX *)
- PROCEDURE EDivideAZAZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX; dval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideAZAZLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF COMPLEX): ARRAY {UNSAFE} [?] OF COMPLEX;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( COMPLEX ), EDivideAZAZLoop );
- RETURN RESULT
- END "./";
- (** LONGCOMPLEX *)
- PROCEDURE EDivideALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL; dvalRe, dvalIm: LONGREAL; v: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- IF rvalIm # 0.0D0 THEN
- v := 1.0D0/(rvalRe*rvalRe + rvalIm*rvalIm);
- dvalRe := v*(lvalRe*rvalRe+lvalIm*rvalIm);
- dvalIm := v*(lvalIm*rvalRe-lvalRe*rvalIm);
- ELSE
- dvalRe := lvalRe/rvalRe;
- dvalIm := lvalIm/rvalRe;
- END;
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideALZALZLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF LONGCOMPLEX): ARRAY {UNSAFE} [?] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGCOMPLEX ), EDivideALZALZLoop );
- RETURN RESULT
- END "./";
- (*** division array / scalar -> array and scalar / array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE DivideASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideASSSLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( REAL ),
- DivideASSSLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSSASLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSSASLoop;
- OPERATOR "/"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( REAL ),
- DivideSSASLoop );
- RETURN RESULT
- END "/";
- (** INTEGER *)
- PROCEDURE DivideAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideAISILoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( REAL ),
- DivideAISILoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSIAILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSIAILoop;
- OPERATOR "/"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( REAL ),
- DivideSIAILoop );
- RETURN RESULT
- END "/";
- (** LONGINT *)
- PROCEDURE DivideALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideALSLLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( REAL ),
- DivideALSLLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSLALLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSLALLoop;
- OPERATOR "/"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( REAL ),
- DivideSLALLoop );
- RETURN RESULT
- END "/";
- (** REAL *)
- PROCEDURE DivideARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideARSRLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( REAL ),
- DivideARSRLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSRARLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSRARLoop;
- OPERATOR "/"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ), SIZEOF( REAL ),
- DivideSRARLoop );
- RETURN RESULT
- END "/";
- (** LONGREAL *)
- PROCEDURE DivideAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL; dval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideAXSXLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGREAL ), DivideAXSXLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSXAXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL; dval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSXAXLoop;
- OPERATOR "/"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGREAL ), DivideSXAXLoop );
- RETURN RESULT
- END "/";
- (** COMPLEX *)
- PROCEDURE DivideAZSZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX; dval: COMPLEX;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideAZSZLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF COMPLEX; right: COMPLEX ): ARRAY {UNSAFE} [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( COMPLEX ), DivideAZSZLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSZAZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX; dval: COMPLEX;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSZAZLoop;
- OPERATOR "/"*(left: COMPLEX; CONST right: ARRAY [ ? ] OF COMPLEX): ARRAY {UNSAFE} [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( COMPLEX ), DivideSZAZLoop );
- RETURN RESULT
- END "/";
- (** LONGCOMPLEX *)
- PROCEDURE DivideALZSLZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL; dvalRe, dvalIm: LONGREAL; v: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- IF rvalIm # 0.0D0 THEN
- v := 1.0D0/(rvalRe*rvalRe + rvalIm*rvalIm);
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- dvalRe := v*(lvalRe*rvalRe+lvalIm*rvalIm);
- dvalIm := v*(lvalIm*rvalRe-lvalRe*rvalIm);
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- ELSE
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- dvalRe := lvalRe / rvalRe; dvalIm := lvalIm / rvalRe;
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END;
- END DivideALZSLZLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF LONGCOMPLEX; right: LONGCOMPLEX ): ARRAY {UNSAFE} [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGCOMPLEX ), DivideALZSLZLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSLZALZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL; dvalRe, dvalIm: LONGREAL; v: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- v := 1.0D0/(lvalRe*lvalRe + lvalIm*lvalIm);
- dvalRe := v*(rvalRe*lvalRe+rvalIm*lvalIm);
- dvalIm := v*(rvalIm*lvalRe-rvalRe*lvalIm);
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSLZALZLoop;
- OPERATOR "/"*(left: LONGCOMPLEX; CONST right: ARRAY [ ? ] OF LONGCOMPLEX): ARRAY {UNSAFE} [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGCOMPLEX ), DivideSLZALZLoop );
- RETURN RESULT
- END "/";
- (*** element-wise DIV array DIV array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EDivASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval DIV rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivASASLoop;
- OPERATOR "DIV"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( SHORTINT ), EDivASASLoop );
- RETURN RESULT
- END "DIV";
- (** INTEGER *)
- PROCEDURE EDivAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval DIV rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivAIAILoop;
- OPERATOR "DIV"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( INTEGER ), EDivAIAILoop );
- RETURN RESULT
- END "DIV";
- (** LONGINT *)
- PROCEDURE EDivALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval DIV rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivALALLoop;
- OPERATOR "DIV"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY {UNSAFE} [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGINT ), EDivALALLoop );
- RETURN RESULT
- END "DIV";
- (** SIZE *)
- PROCEDURE EDivAYAYLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SIZE; dval: SIZE;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval DIV rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivAYAYLoop;
- OPERATOR "DIV"*(CONST left,right: ARRAY [?] OF SIZE): ARRAY {UNSAFE} [?] OF SIZE;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( SIZE ), EDivAYAYLoop );
- RETURN RESULT
- END "DIV";
- (*** division array DIV scalar -> array and scalar DIV array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE DivASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval DIV rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivASSSLoop;
- OPERATOR "DIV"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( SHORTINT ), DivASSSLoop );
- RETURN RESULT
- END "DIV";
- PROCEDURE DivSSASLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval DIV lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivSSASLoop;
- OPERATOR "DIV"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SHORTINT ), DivSSASLoop );
- RETURN RESULT
- END "DIV";
- (** INTEGER *)
- PROCEDURE DivAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval DIV rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivAISILoop;
- OPERATOR "DIV"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( INTEGER ), DivAISILoop );
- RETURN RESULT
- END "DIV";
- PROCEDURE DivSIAILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval DIV lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivSIAILoop;
- OPERATOR "DIV"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( INTEGER ), DivSIAILoop );
- RETURN RESULT
- END "DIV";
- (** LONGINT *)
- PROCEDURE DivALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval DIV rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivALSLLoop;
- OPERATOR "DIV"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGINT ), DivALSLLoop );
- RETURN RESULT
- END "DIV";
- PROCEDURE DivSLALLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval DIV lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivSLALLoop;
- OPERATOR "DIV"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGINT ), DivSLALLoop );
- RETURN RESULT
- END "DIV";
- (** SIZE *)
- PROCEDURE DivAYSYLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SIZE; dval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval DIV rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivAYSYLoop;
- OPERATOR "DIV"*(CONST left: ARRAY [ ? ] OF SIZE; right: SIZE ): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( SIZE ), DivAYSYLoop );
- RETURN RESULT
- END "DIV";
- PROCEDURE DivSYAYLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SIZE; dval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval DIV lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivSYAYLoop;
- OPERATOR "DIV"*(left: SIZE; CONST right: ARRAY [ ? ] OF SIZE): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SIZE ), DivSYAYLoop );
- RETURN RESULT
- END "DIV";
- (*** element-wise modulus array MOD array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EModASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval MOD rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EModASASLoop;
- OPERATOR "MOD"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( SHORTINT ), EModASASLoop );
- RETURN RESULT
- END "MOD";
- (** INTEGER *)
- PROCEDURE EModAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval MOD rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EModAIAILoop;
- OPERATOR "MOD"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( INTEGER ), EModAIAILoop );
- RETURN RESULT
- END "MOD";
- (** LONGINT *)
- PROCEDURE EModALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval MOD rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EModALALLoop;
- OPERATOR "MOD"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY {UNSAFE} [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( LONGINT ), EModALALLoop );
- RETURN RESULT
- END "MOD";
- (** SIZE *)
- PROCEDURE EModAYAYLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SIZE; dval: SIZE;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval MOD rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EModAYAYLoop;
- OPERATOR "MOD"*(CONST left,right: ARRAY [?] OF SIZE): ARRAY {UNSAFE} [?] OF SIZE;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( SIZE ), EModAYAYLoop );
- RETURN RESULT
- END "MOD";
- (*** modulus array MOD scalar -> array and scalar MOD array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE ModASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval MOD rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModASSSLoop;
- OPERATOR "MOD"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( SHORTINT ), ModASSSLoop );
- RETURN RESULT
- END "MOD";
- PROCEDURE ModSSASLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval MOD lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModSSASLoop;
- OPERATOR "MOD"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SHORTINT ), ModSSASLoop );
- RETURN RESULT
- END "MOD";
- (** INTEGER *)
- PROCEDURE ModAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval MOD rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModAISILoop;
- OPERATOR "MOD"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( INTEGER ), ModAISILoop );
- RETURN RESULT
- END "MOD";
- PROCEDURE ModSIAILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval MOD lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModSIAILoop;
- OPERATOR "MOD"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( INTEGER ), ModSIAILoop );
- RETURN RESULT
- END "MOD";
- (** LONGINT *)
- PROCEDURE ModALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval MOD rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModALSLLoop;
- OPERATOR "MOD"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( LONGINT ), ModALSLLoop );
- RETURN RESULT
- END "MOD";
- PROCEDURE ModSLALLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval MOD lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModSLALLoop;
- OPERATOR "MOD"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( LONGINT ), ModSLALLoop );
- RETURN RESULT
- END "MOD";
-
-
- (** SIZE *)
- PROCEDURE ModAYSYLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SIZE; dval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval MOD rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModAYSYLoop;
- OPERATOR "MOD"*(CONST left: ARRAY [ ? ] OF SIZE; right: SIZE ): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( SIZE ), ModAYSYLoop );
- RETURN RESULT
- END "MOD";
- PROCEDURE ModSYAYLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SIZE; dval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval MOD lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModSYAYLoop;
- OPERATOR "MOD"*(left: SIZE; CONST right: ARRAY [ ? ] OF SIZE): ARRAY {UNSAFE} [ ? ] OF SIZE;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( SIZE ), ModSYAYLoop );
- RETURN RESULT
- END "MOD";
- (*** scalar product <array,array> -> scalar ********************************************************************)
- (** SHORTINT *)
- PROCEDURE SPASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + rval * lval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPASASLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): LONGINT;
- VAR dest: LONGINT;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), left, right, SPASASLoop );
- RETURN dest;
- END "+*";
- (** INTEGER *)
- PROCEDURE SPAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + rval * lval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPAIAILoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF INTEGER ): LONGINT;
- VAR dest: LONGINT;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), left, right, SPAIAILoop );
- RETURN dest;
- END "+*";
- (** LONGINT *)
- PROCEDURE SPALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + rval * lval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPALALLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF LONGINT ): LONGINT;
- VAR dest: LONGINT;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), left, right, SPALALLoop );
- RETURN dest;
- END "+*";
- (** REAL *)
- PROCEDURE SPARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval: REAL; dval: REAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + rval * lval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPARARLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF REAL ): REAL;
- VAR dest: REAL;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), left, right, loopSPARAR );
- RETURN dest;
- END "+*";
- PROCEDURE SPAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: LONGREAL;
- BEGIN
- IF debug THEN
- KernelLog.String( "SPAXAX, ladr,radr,dadr,linc,rinc,len= " ); KernelLog.Int( ladr, 10 ); KernelLog.Int( radr, 10 );
- KernelLog.Int( dadr, 10 ); KernelLog.Int( linc, 10 ); KernelLog.Int( rinc, 10 );
- KernelLog.Int( len, 10 ); KernelLog.Ln;
- END;
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); INC( ladr, linc ); SYSTEM.GET( radr, rval ); INC( radr, rinc );
- dval := dval + rval * lval; DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPAXAXLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): LONGREAL;
- VAR dest: LONGREAL;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), left, right, loopSPAXAX );
- RETURN dest;
- END "+*";
- (** COMPLEX *)
- PROCEDURE SPAZAZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval: COMPLEX; dval: COMPLEX;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- RE(dval) := RE(dval) + RE(lval) * RE(rval) + IM(lval) * IM(rval);
- IM(dval) := IM(dval) - RE(lval) * IM(rval) + IM(lval) * RE(rval);
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPAZAZLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF COMPLEX ): COMPLEX;
- VAR dest: COMPLEX;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), left, right, loopSPAZAZ );
- RETURN dest;
- END "+*";
- (** COMPLEX *)
- PROCEDURE SPALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL; dvalRe, dvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dvalRe ); SYSTEM.GET( dadr+SIZEOF(LONGREAL), dvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- dvalRe := dvalRe + lvalRe * rvalRe + lvalIm * rvalIm;
- dvalIm := dvalIm - lvalRe * rvalIm + lvalIm * rvalRe;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- END SPALZALZLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF LONGCOMPLEX ): LONGCOMPLEX;
- VAR dest: LONGCOMPLEX;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ),left,right, loopSPALZALZ );
- RETURN dest;
- END "+*";
- (*** element-wise equal: array x array -> array of boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE EEqlABABLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlABABLoop;
- OPERATOR ".="*(CONST left,right : ARRAY [?] OF BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EEqlABABLoop );
- RETURN RESULT
- END ".=";
- (** SHORTINT *)
- PROCEDURE EEqlASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlASASLoop;
- OPERATOR ".="*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EEqlASASLoop );
- RETURN RESULT
- END ".=";
- (** INTEGER *)
- PROCEDURE EEqlAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlAIAILoop;
- OPERATOR ".="*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EEqlAIAILoop );
- RETURN RESULT
- END ".=";
- (** LONGINT *)
- PROCEDURE EEqlALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlALALLoop;
- OPERATOR ".="*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EEqlALALLoop );
- RETURN RESULT
- END ".=";
- (** REAL *)
- PROCEDURE EEqlARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlARARLoop;
- OPERATOR ".="*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EEqlARARLoop );
- RETURN RESULT
- END ".=";
- (** LONGREAL *)
- PROCEDURE EEqlAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlAXAXLoop;
- OPERATOR ".="*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EEqlAXAXLoop );
- RETURN RESULT
- END ".=";
- (*** elementwise equal array x scalar -> array of boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE EEqlABSBLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlABSBLoop;
- OPERATOR ".="*(CONST left : ARRAY [?] OF BOOLEAN; right: BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlABSBLoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: BOOLEAN; CONST right : ARRAY {UNSAFE} [?] OF BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlABSBLoop );
- RETURN RESULT
- END ".=";
- (** SHORTINT *)
- PROCEDURE EEqlASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlASSSLoop;
- OPERATOR ".="*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlASSSLoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlASSSLoop );
- RETURN RESULT
- END ".=";
- (** INTEGER *)
- PROCEDURE EEqlAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlAISILoop;
- OPERATOR ".="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlAISILoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlAISILoop );
- RETURN RESULT
- END ".=";
- (** LONGINT *)
- PROCEDURE EEqlALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlALSLLoop;
- OPERATOR ".="*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlALSLLoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlALSLLoop );
- RETURN RESULT
- END ".=";
- (** REAL *)
- PROCEDURE EEqlARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlARSRLoop;
- OPERATOR ".="*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlARSRLoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlARSRLoop );
- RETURN RESULT
- END ".=";
- (** LONGREAL *)
- PROCEDURE EEqlAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlAXSXLoop;
- OPERATOR ".="*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlAXSXLoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlAXSXLoop );
- RETURN RESULT
- END ".=";
- (*** elementwise nequal: array x array -> array of boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE ENeqABABLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqABABLoop;
- OPERATOR ".#"*(CONST left,right : ARRAY [?] OF BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ENeqABABLoop );
- RETURN RESULT
- END ".#";
- (** SHORTINT *)
- PROCEDURE ENeqASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqASASLoop;
- OPERATOR ".#"*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ENeqASASLoop );
- RETURN RESULT
- END ".#";
- (** INTEGER*)
- PROCEDURE ENeqAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqAIAILoop;
- OPERATOR ".#"*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ENeqAIAILoop );
- RETURN RESULT
- END ".#";
- (** LONGINT*)
- PROCEDURE ENeqALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqALALLoop;
- OPERATOR ".#"*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ENeqALALLoop );
- RETURN RESULT
- END ".#";
- (** REAL *)
- PROCEDURE ENeqARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqARARLoop;
- OPERATOR ".#"*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ENeqARARLoop );
- RETURN RESULT
- END ".#";
- (** LONGREAL *)
- PROCEDURE ENeqAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqAXAXLoop;
- OPERATOR ".#"*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ENeqAXAXLoop );
- RETURN RESULT
- END ".#";
- (*** elementwise nequal array x scalar -> array of boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE ENeqABSBLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqABSBLoop;
- OPERATOR ".#"*(CONST left : ARRAY [?] OF BOOLEAN; right: BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqABSBLoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: BOOLEAN; CONST right : ARRAY {UNSAFE} [?] OF BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqABSBLoop );
- RETURN RESULT
- END ".#";
- (** SHORTINT *)
- PROCEDURE ENeqASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqASSSLoop;
- OPERATOR ".#"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqASSSLoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqASSSLoop );
- RETURN RESULT
- END ".#";
- (** INTEGER *)
- PROCEDURE ENeqAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqAISILoop;
- OPERATOR ".#"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqAISILoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqAISILoop );
- RETURN RESULT
- END ".#";
- (** LONGINT *)
- PROCEDURE ENeqALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqALSLLoop;
- OPERATOR ".#"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqALSLLoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqALSLLoop );
- RETURN RESULT
- END ".#";
- (** REAL *)
- PROCEDURE ENeqARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqARSRLoop;
- OPERATOR ".#"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqARSRLoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqARSRLoop );
- RETURN RESULT
- END ".#";
- (** LONGREAL *)
- PROCEDURE ENeqAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqAXSXLoop;
- OPERATOR ".#"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqAXSXLoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqAXSXLoop );
- RETURN RESULT
- END ".#";
- (*** elementwise greater than: array x array -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EGtrASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval > rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGtrASASLoop;
- OPERATOR ".>"*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EGtrASASLoop );
- RETURN RESULT
- END ".>";
- (** INTEGER *)
- PROCEDURE EGtrAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval > rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGtrAIAILoop;
- OPERATOR ".>"*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EGtrAIAILoop );
- RETURN RESULT
- END ".>";
- (** LONGINT *)
- PROCEDURE EGtrALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval > rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGtrALALLoop;
- OPERATOR ".>"*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EGtrALALLoop );
- RETURN RESULT
- END ".>";
- (** REAL *)
- PROCEDURE EGtrARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval > rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGtrARARLoop;
- OPERATOR ".>"*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EGtrARARLoop );
- RETURN RESULT
- END ".>";
- (** LONGREAL *)
- PROCEDURE EGtrAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval > rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGtrAXAXLoop;
- OPERATOR ".>"*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EGtrAXAXLoop );
- RETURN RESULT
- END ".>";
- (*** elementwise greater array x scalar -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EGtrASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval > rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGtrASSSLoop;
- OPERATOR ".>"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrASSSLoop );
- RETURN RESULT
- END ".>";
- OPERATOR ".<"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGtrASSSLoop );
- RETURN RESULT
- END ".<";
- (** INTEGER *)
- PROCEDURE EGtrAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval > rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGtrAISILoop;
- OPERATOR ".>"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrAISILoop );
- RETURN RESULT
- END ".>";
- OPERATOR ".<"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGtrAISILoop );
- RETURN RESULT
- END ".<";
- (** LONGINT *)
- PROCEDURE EGtrALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval > rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGtrALSLLoop;
- OPERATOR ".>"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrALSLLoop );
- RETURN RESULT
- END ".>";
- OPERATOR ".<"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGtrALSLLoop );
- RETURN RESULT
- END ".<";
- (** REAL *)
- PROCEDURE EGtrARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval > rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGtrARSRLoop;
- OPERATOR ".>"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrARSRLoop );
- RETURN RESULT
- END ".>";
- OPERATOR ".<"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGtrARSRLoop );
- RETURN RESULT
- END ".<";
- (** LONGREAL *)
- PROCEDURE EGtrAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval > rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGtrAXSXLoop;
- OPERATOR ".>"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrAXSXLoop );
- RETURN RESULT
- END ".>";
- OPERATOR ".<"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGtrAXSXLoop );
- RETURN RESULT
- END ".<";
- (*** elementwise greater or equal: array x array -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EGeqASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval >= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGeqASASLoop;
- OPERATOR ".>="*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EGeqASASLoop );
- RETURN RESULT
- END ".>=";
- (** INTEGER *)
- PROCEDURE EGeqAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval >= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGeqAIAILoop;
- OPERATOR ".>="*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EGeqAIAILoop );
- RETURN RESULT
- END ".>=";
- (** LONGINT *)
- PROCEDURE EGeqALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval >= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGeqALALLoop;
- OPERATOR ".>="*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EGeqALALLoop );
- RETURN RESULT
- END ".>=";
- (** REAL *)
- PROCEDURE EGeqARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval >= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGeqARARLoop;
- OPERATOR ".>="*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EGeqARARLoop );
- RETURN RESULT
- END ".>=";
- (** LONGREAL *)
- PROCEDURE EGeqAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval >= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGeqAXAXLoop;
- OPERATOR ".>="*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), EGeqAXAXLoop );
- RETURN RESULT
- END ".>=";
- (*** elementwise geq array x scalar -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EGeqASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval >= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGeqASSSLoop;
- OPERATOR ".>="*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqASSSLoop );
- RETURN RESULT
- END ".>=";
- OPERATOR ".<="*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGeqASSSLoop );
- RETURN RESULT
- END ".<=";
- (** INTEGER *)
- PROCEDURE EGeqAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval >= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGeqAISILoop;
- OPERATOR ".>="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqAISILoop );
- RETURN RESULT
- END ".>=";
- OPERATOR ".<="*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGeqAISILoop );
- RETURN RESULT
- END ".<=";
- (** LONGINT *)
- PROCEDURE EGeqALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval >= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGeqALSLLoop;
- OPERATOR ".>="*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqALSLLoop );
- RETURN RESULT
- END ".>=";
- OPERATOR ".<="*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGeqALSLLoop );
- RETURN RESULT
- END ".<=";
- (** REAL *)
- PROCEDURE EGeqARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval >= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGeqARSRLoop;
- OPERATOR ".>="*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqARSRLoop );
- RETURN RESULT
- END ".>=";
- OPERATOR ".<="*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGeqARSRLoop );
- RETURN RESULT
- END ".<=";
- (** LONGREAL *)
- PROCEDURE EGeqAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval >= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGeqAXSXLoop;
- OPERATOR ".>="*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqAXSXLoop );
- RETURN RESULT
- END ".>=";
- OPERATOR ".<="*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGeqAXSXLoop );
- RETURN RESULT
- END ".<=";
- (*** elementwise less than: array x array -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE ELssASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval < rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELssASASLoop;
- OPERATOR ".<"*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ELssASASLoop );
- RETURN RESULT
- END ".<";
- (** INTEGER *)
- PROCEDURE ELssAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval < rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELssAIAILoop;
- OPERATOR ".<"*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ELssAIAILoop );
- RETURN RESULT
- END ".<";
- (** LONGINT*)
- PROCEDURE ELssALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval < rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELssALALLoop;
- OPERATOR ".<"*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ELssALALLoop );
- RETURN RESULT
- END ".<";
- (** REAL *)
- PROCEDURE ELssARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval < rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELssARARLoop;
- OPERATOR ".<"*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ELssARARLoop );
- RETURN RESULT
- END ".<";
- (** LONGREAL *)
- PROCEDURE ELssAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval < rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELssAXAXLoop;
- OPERATOR ".<"*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ELssAXAXLoop );
- RETURN RESULT
- END ".<";
- (*** elementwise less array x scalar -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE ELssASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval < rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELssASSSLoop;
- OPERATOR ".<"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssASSSLoop );
- RETURN RESULT
- END ".<";
- OPERATOR ".>"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELssASSSLoop );
- RETURN RESULT
- END ".>";
- (** INTEGER *)
- PROCEDURE ELssAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval < rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELssAISILoop;
- OPERATOR ".<"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssAISILoop );
- RETURN RESULT
- END ".<";
- OPERATOR ".>"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELssAISILoop );
- RETURN RESULT
- END ".>";
- (** LONGINT *)
- PROCEDURE ELssALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval < rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELssALSLLoop;
- OPERATOR ".<"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssALSLLoop );
- RETURN RESULT
- END ".<";
- OPERATOR ".>"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELssALSLLoop );
- RETURN RESULT
- END ".>";
- (** REAL *)
- PROCEDURE ELssARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval < rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELssARSRLoop;
- OPERATOR ".<"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssARSRLoop );
- RETURN RESULT
- END ".<";
- OPERATOR ".>"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELssARSRLoop );
- RETURN RESULT
- END ".>";
- (** LONGREAL *)
- PROCEDURE ELssAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval < rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELssAXSXLoop;
- OPERATOR ".<"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssAXSXLoop );
- RETURN RESULT
- END ".<";
- OPERATOR ".>"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELssAXSXLoop );
- RETURN RESULT
- END ".>";
- (*** elementwise less or equal: array x array -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE ELeqASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval <= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELeqASASLoop;
- OPERATOR ".<="*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ELeqASASLoop );
- RETURN RESULT
- END ".<=";
- (** INTEGER *)
- PROCEDURE ELeqAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval <= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELeqAIAILoop;
- OPERATOR ".<="*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ELeqAIAILoop );
- RETURN RESULT
- END ".<=";
- (** LONGINT *)
- PROCEDURE ELeqALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval <= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELeqALALLoop;
- OPERATOR ".<="*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ELeqALALLoop );
- RETURN RESULT
- END ".<=";
- (** REAL *)
- PROCEDURE ELeqARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval <= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELeqARARLoop;
- OPERATOR ".<="*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ELeqARARLoop );
- RETURN RESULT
- END ".<=";
- (** LONGREAL*)
- PROCEDURE ELeqAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval <= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELeqAXAXLoop;
- OPERATOR ".<="*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ELeqAXAXLoop );
- RETURN RESULT
- END ".<=";
- (*** elementwise leq array x scalar -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE ELeqASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval <= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELeqASSSLoop;
- OPERATOR ".<="*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqASSSLoop );
- RETURN RESULT
- END ".<=";
- OPERATOR ".>="*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELeqASSSLoop );
- RETURN RESULT
- END ".>=";
- (** INTEGER *)
- PROCEDURE ELeqAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval <= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELeqAISILoop;
- OPERATOR ".<="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqAISILoop );
- RETURN RESULT
- END ".<=";
- OPERATOR ".>="*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELeqAISILoop );
- RETURN RESULT
- END ".>=";
- (** LONGINT *)
- PROCEDURE ELeqALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval <= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELeqALSLLoop;
- OPERATOR ".<="*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqALSLLoop );
- RETURN RESULT
- END ".<=";
- OPERATOR ".>="*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELeqALSLLoop );
- RETURN RESULT
- END ".>=";
- (** REAL *)
- PROCEDURE ELeqARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval <= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELeqARSRLoop;
- OPERATOR ".<="*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqARSRLoop );
- RETURN RESULT
- END ".<=";
- OPERATOR ".>="*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELeqARSRLoop );
- RETURN RESULT
- END ".>=";
- (** LONGREAL *)
- PROCEDURE ELeqAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval <= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELeqAXSXLoop;
- OPERATOR ".<="*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqAXSXLoop );
- RETURN RESULT
- END ".<=";
- OPERATOR ".>="*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELeqAXSXLoop );
- RETURN RESULT
- END ".>=";
- (*** elementwise or, elementwise and ********************************************************************)
- (** array x array *)
- PROCEDURE ElOrABABLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, (lval OR rval) );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ElOrABABLoop;
- OPERATOR "OR"*(CONST left,right : ARRAY [?] OF BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ElOrABABLoop );
- RETURN RESULT
- END "OR";
- PROCEDURE ElAndABABLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len:SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval & rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ElAndABABLoop;
- OPERATOR "&"*(CONST left,right : ARRAY [?] OF BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right,
- SIZEOF( BOOLEAN ), ElAndABABLoop );
- RETURN RESULT
- END "&";
- (** array x boolean *)
- PROCEDURE ElOrABSBLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval OR rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ElOrABSBLoop;
- OPERATOR "OR"*(CONST left : ARRAY [?] OF BOOLEAN; right: BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ElOrABSBLoop );
- RETURN RESULT
- END "OR";
- OPERATOR "OR"*(left: BOOLEAN; CONST right : ARRAY {UNSAFE} [?] OF BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ElOrABSBLoop );
- RETURN RESULT
- END "OR";
- PROCEDURE ElAndABSBLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval & rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ElAndABSBLoop;
- OPERATOR "&"*(CONST left : ARRAY [?] OF BOOLEAN; right: BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ElAndABSBLoop );
- RETURN RESULT
- END "&";
- OPERATOR "&"*(left: BOOLEAN; CONST right : ARRAY {UNSAFE} [?] OF BOOLEAN):ARRAY {UNSAFE} [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( RESULT , right, ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ElAndABSBLoop );
- RETURN RESULT
- END "&";
- (*** less than, greater or equal: array x array -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE LssASASLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssASASLoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LssASASLoop , FALSE);
- END "<";
- PROCEDURE GeqASASLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqASASLoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GeqASASLoop , FALSE);
- END ">=";
- (** INTEGER *)
- PROCEDURE LssAIAILoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssAIAILoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LssAIAILoop , FALSE);
- END "<";
- PROCEDURE GeqAIAILoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqAIAILoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GeqAIAILoop , FALSE);
- END ">=";
- (** LONGINT *)
- PROCEDURE LssALALLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssALALLoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LssALALLoop , FALSE);
- END "<";
- PROCEDURE GeqALALLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqALALLoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GeqALALLoop , FALSE);
- END ">=";
- (** SIZE *)
- PROCEDURE LssAZAZLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssAZAZLoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LssAZAZLoop , FALSE);
- END "<";
- PROCEDURE GeqAZAZLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SIZE;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqAZAZLoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GeqAZAZLoop , FALSE);
- END ">=";
- (** REAL *)
- PROCEDURE LssARARLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssARARLoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LssARARLoop , FALSE);
- END "<";
- PROCEDURE GeqARARLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqARARLoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GeqARARLoop , FALSE);
- END ">=";
- (** LONGREAL *)
- PROCEDURE LssAXAXLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssAXAXLoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LssAXAXLoop , FALSE);
- END "<";
- PROCEDURE GeqAXAXLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqAXAXLoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GeqAXAXLoop , FALSE);
- END ">=";
-
- (*** less than, greater or equal: array x array -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE GtrASASLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrASASLoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GtrASASLoop , FALSE);
- END ">";
- PROCEDURE LeqASASLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqASASLoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LeqASASLoop , FALSE);
- END "<=";
- (** INTEGER *)
- PROCEDURE GtrAIAILoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrAIAILoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GtrAIAILoop , FALSE);
- END ">";
- PROCEDURE LeqAIAILoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqAIAILoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LeqAIAILoop ,FALSE);
- END "<=";
- (** LONGINT *)
- PROCEDURE GtrALALLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrALALLoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GtrALALLoop , FALSE);
- END ">";
- PROCEDURE LeqALALLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqALALLoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LeqALALLoop , FALSE);
- END "<=";
- (** SIZE *)
- PROCEDURE GtrAZAZLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SIZE;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrAZAZLoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GtrAZAZLoop , FALSE);
- END ">";
- PROCEDURE LeqAZAZLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SIZE;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqAZAZLoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LeqAZAZLoop , FALSE);
- END "<=";
- (** SIZE *)
- PROCEDURE GtrARARLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrARARLoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GtrARARLoop , FALSE);
- END ">";
- PROCEDURE LeqARARLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqARARLoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LeqARARLoop , FALSE);
- END "<=";
- (** LONGREAL *)
- PROCEDURE GtrAXAXLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrAXAXLoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, GtrAXAXLoop , FALSE);
- END ">";
- PROCEDURE LeqAXAXLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqAXAXLoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, LeqAXAXLoop , FALSE);
- END "<=";
- (*** equals: array x array -> boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE EqlABABLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlABABLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, EqlABABLoop, FALSE);
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( left, right, EqlABABLoop, FALSE);
- END "#";
- (** SHORTINT *)
- PROCEDURE EqlASASLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlASASLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, EqlASASLoop , FALSE);
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( left, right, EqlASASLoop, FALSE );
- END "#";
- (** INTEGER *)
- PROCEDURE EqlAIAILoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAIAILoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, EqlAIAILoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( left, right, EqlAIAILoop, FALSE );
- END "#";
- (** LONGINT *)
- PROCEDURE EqlALALLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlALALLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, EqlALALLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( left, right, EqlALALLoop, FALSE );
- END "#";
- (** SIZE *)
- PROCEDURE EqlAZAZLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SIZE;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAZAZLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, EqlAZAZLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( left, right, EqlAZAZLoop, FALSE );
- END "#";
- (** REAL *)
- PROCEDURE EqlARARLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlARARLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, EqlARARLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( left, right, EqlARARLoop, FALSE );
- END "#";
- (** LONGREAL *)
- PROCEDURE EqlAXAXLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAXAXLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, EqlAXAXLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( left, right, EqlAXAXLoop, FALSE );
- END "#";
- (** COMPLEX *)
- PROCEDURE EqlACACLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlACACLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF COMPLEX ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, EqlACACLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF COMPLEX ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( left, right, EqlACACLoop, FALSE );
- END "#";
- (** LONGCOMPLEX *)
- PROCEDURE EqlALZALZLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- IF (rvalRe # lvalRe) OR (rvalIm # lvalIm) THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlALZALZLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF LONGCOMPLEX ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( left, right, EqlALZALZLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF LONGCOMPLEX ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( left, right, EqlALZALZLoop, FALSE );
- END "#";
- (*** equals: array x scalar -> boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE EqlABSBLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: BOOLEAN;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlABSBLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF BOOLEAN;
- right: BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), EqlABSBLoop );
- END "=";
- OPERATOR "="*( left: BOOLEAN;
- CONST right: ARRAY [ ? ] OF BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), EqlABSBLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF BOOLEAN;
- right: BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ~(left = right);
- END "#";
- OPERATOR "#"*( left: BOOLEAN;
- CONST right: ARRAY [ ? ] OF BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- (** SHORTINT *)
- PROCEDURE EqlASSSLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlASSSLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF SHORTINT;right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), EqlASSSLoop );
- END "=";
- OPERATOR "="*( left: SHORTINT;CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), EqlASSSLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ~( left= right );
- END "#";
- OPERATOR "#"*( left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ~( left= right );
- END "#";
- (** INTEGER *)
- PROCEDURE EqlAISILoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAISILoop;
- OPERATOR "="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), EqlAISILoop );
- END "=";
- OPERATOR "="*( left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), EqlAISILoop );
- END "=";
- OPERATOR "#"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- OPERATOR "#"*( left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- (** LONGINT *)
- PROCEDURE EqlALSLLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlALSLLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF LONGINT;
- right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), EqlALSLLoop );
- END "=";
- OPERATOR "="*( left: LONGINT;
- CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), EqlALSLLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF LONGINT;
- right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ~(left = right);
- END "#";
- OPERATOR "#"*( left: LONGINT;
- CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ~(left = right);
- END "#";
- (** SIZE *)
- PROCEDURE EqlAZSZLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAZSZLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF SIZE;
- right: SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), EqlAZSZLoop );
- END "=";
- OPERATOR "="*( left: SIZE;
- CONST right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), EqlALSLLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF SIZE;
- right: SIZE ): BOOLEAN;
- BEGIN
- RETURN ~(left = right);
- END "#";
- OPERATOR "#"*( left: SIZE;
- CONST right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ~(left = right);
- END "#";
- (** REAL *)
- PROCEDURE EqlARSRLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlARSRLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF REAL;
- right: REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), EqlARSRLoop );
- END "=";
- OPERATOR "="*( left: REAL;
- CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), EqlARSRLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF REAL;
- right: REAL ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- OPERATOR "#"*( left: REAL;
- CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- (** LONGREAL *)
- PROCEDURE EqlAXSXLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAXSXLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF LONGREAL;
- right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), EqlAXSXLoop );
- END "=";
- OPERATOR "="*( left: LONGREAL;
- CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), EqlAXSXLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF LONGREAL;
- right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- OPERATOR "#"*( left: LONGREAL;CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ~( left= right );
- END "#";
- (*** gtr : array x scalar -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE GtrASSSLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrASSSLoop;
- OPERATOR ">"*( CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GtrASSSLoop );
- END ">";
- OPERATOR "<"*( left: SHORTINT;CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GtrASSSLoop );
- END "<";
- (** INTEGER *)
- PROCEDURE GtrAISILoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrAISILoop;
- OPERATOR ">"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GtrAISILoop );
- END ">";
- OPERATOR "<"*( left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GtrAISILoop );
- END "<";
- (** LONGINT *)
- PROCEDURE GtrALSLLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrALSLLoop;
- OPERATOR ">"*( CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GtrALSLLoop );
- END ">";
- OPERATOR "<"*( left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GtrALSLLoop );
- END "<";
- (** SIZE *)
- PROCEDURE GtrAZSZLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrAZSZLoop;
- OPERATOR ">"*( CONST left: ARRAY [ ? ] OF SIZE; right: SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GtrAZSZLoop );
- END ">";
- OPERATOR "<"*( left: SIZE; CONST right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GtrAZSZLoop );
- END "<";
- (** REAL *)
- PROCEDURE GtrARSRLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrARSRLoop;
- OPERATOR ">"*( CONST left: ARRAY [ ? ] OF REAL;
- right: REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GtrARSRLoop );
- END ">";
- OPERATOR "<"*( left: REAL;
- CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GtrARSRLoop );
- END "<";
- (** LONGREAL *)
- PROCEDURE GtrAXSXLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrAXSXLoop;
- OPERATOR ">"*( CONST left: ARRAY [ ? ] OF LONGREAL;
- right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GtrAXSXLoop );
- END ">";
- OPERATOR "<"*( left: LONGREAL;
- CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GtrAXSXLoop );
- END "<";
- (*** geq : array x scalar -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE GeqASSSLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqASSSLoop;
- OPERATOR ">="*( CONST left: ARRAY [ ? ] OF SHORTINT;
- right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GeqASSSLoop );
- END ">=";
- OPERATOR "<="*( left: SHORTINT;
- CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GeqASSSLoop );
- END "<=";
- (** INTEGER *)
- PROCEDURE GeqAISILoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqAISILoop;
- OPERATOR ">="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GeqAISILoop );
- END ">=";
- OPERATOR "<="*( left: INTEGER;
- CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GeqAISILoop );
- END "<=";
- (** LONGINT *)
- PROCEDURE GeqALSLLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqALSLLoop;
- OPERATOR ">="*( CONST left: ARRAY [ ? ] OF LONGINT;
- right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GeqALSLLoop );
- END ">=";
- OPERATOR "<="*( left: LONGINT;
- CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GeqALSLLoop );
- END "<=";
- (** SIZE *)
- PROCEDURE GeqAZSZLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqAZSZLoop;
- OPERATOR ">="*( CONST left: ARRAY [ ? ] OF SIZE;
- right: SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GeqAZSZLoop );
- END ">=";
- OPERATOR "<="*( left:SIZE;
- CONST right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GeqAZSZLoop );
- END "<=";
- (** REAL *)
- PROCEDURE GeqARSRLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqARSRLoop;
- OPERATOR ">="*( CONST left: ARRAY [ ? ] OF REAL;
- right: REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GeqARSRLoop );
- END ">=";
- OPERATOR "<="*( left: REAL; CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GeqARSRLoop );
- END "<=";
- (** LONGREAL *)
- PROCEDURE GeqAXSXLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqAXSXLoop;
- OPERATOR ">="*( CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), GeqAXSXLoop );
- END ">=";
- OPERATOR "<="*( left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), GeqAXSXLoop );
- END "<=";
- (*** leq : array x scalar -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE LeqASSSLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqASSSLoop;
- OPERATOR "<="*( CONST left: ARRAY [ ? ] OF SHORTINT;right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LeqASSSLoop );
- END "<=";
- OPERATOR ">="*( left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LeqASSSLoop );
- END ">=";
- (** INTEGER *)
- PROCEDURE LeqAISILoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqAISILoop;
- OPERATOR "<="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LeqAISILoop );
- END "<=";
- OPERATOR ">="*( left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LeqAISILoop );
- END ">=";
- (** LONGINT *)
- PROCEDURE LeqALSLLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqALSLLoop;
- OPERATOR "<="*( CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LeqALSLLoop );
- END "<=";
- OPERATOR ">="*( left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LeqALSLLoop );
- END ">=";
- (** SIZE *)
- PROCEDURE LeqAZSZLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqAZSZLoop;
- OPERATOR "<="*( CONST left: ARRAY [ ? ] OF SIZE; right: SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LeqAZSZLoop );
- END "<=";
- OPERATOR ">="*( left: SIZE; CONST right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LeqAZSZLoop );
- END ">=";
- (** REAL *)
- PROCEDURE LeqARSRLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqARSRLoop;
- OPERATOR "<="*( CONST left: ARRAY [ ? ] OF REAL; right: REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LeqARSRLoop );
- END "<=";
- OPERATOR ">="*( left: REAL; CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LeqARSRLoop );
- END ">=";
- (** LONGREAL *)
- PROCEDURE LeqAXSXLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqAXSXLoop;
- OPERATOR "<="*( CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LeqAXSXLoop );
- END "<=";
- OPERATOR ">="*( left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LeqAXSXLoop );
- END ">=";
- (*** lss: array x scalar -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE LssASSSLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssASSSLoop;
- OPERATOR "<"*( CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LssASSSLoop );
- END "<";
- OPERATOR ">"*( left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LssASSSLoop );
- END ">";
- (** INTEGER *)
- PROCEDURE LssAISILoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssAISILoop;
- OPERATOR "<"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LssAISILoop );
- END "<";
- OPERATOR ">"*( left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LssAISILoop );
- END ">";
- (** LONGINT *)
- PROCEDURE LssALSLLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssALSLLoop;
- OPERATOR "<"*( CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LssALSLLoop );
- END "<";
- OPERATOR ">"*( left: LONGINT;CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LssALSLLoop );
- END ">";
- (** SIZE *)
- PROCEDURE LssAZSZLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SIZE;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssAZSZLoop;
- OPERATOR "<"*( CONST left: ARRAY [ ? ] OF SIZE; right: SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LssAZSZLoop );
- END "<";
- OPERATOR ">"*( left: SIZE;CONST right: ARRAY [ ? ] OF SIZE ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LssAZSZLoop );
- END ">";
- (** REAL *)
- PROCEDURE LssARSRLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssARSRLoop;
- OPERATOR "<"*( CONST left: ARRAY [ ? ] OF REAL;
- right: REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LssARSRLoop );
- END "<";
- OPERATOR ">"*( left: REAL;
- CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LssARSRLoop );
- END ">";
- (** LONGREAL *)
- PROCEDURE LssAXSXLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssAXSXLoop;
- OPERATOR "<"*( CONST left: ARRAY [ ? ] OF LONGREAL;
- right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( left, ADDRESSOF( right ), LssAXSXLoop );
- END "<";
- OPERATOR ">"*( left: LONGREAL;
- CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( right , ADDRESSOF( left ), LssAXSXLoop );
- END ">";
-
- (**** binary max/min operators array x scalar-> array ********************************************************************)
-
- PROCEDURE MaxAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval>val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MaxAXSXLoop;
-
- OPERATOR "MAX"*(CONST left: ARRAY [?] OF LONGREAL; right: LONGREAL): ARRAY {UNSAFE} [?] OF LONGREAL;
- TYPE Type = LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( Type ), MaxAXSXLoop );
- RETURN RESULT
- END "MAX";
- PROCEDURE MaxARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: REAL;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval>val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MaxARSRLoop;
-
- OPERATOR "MAX"*(CONST left: ARRAY [?] OF REAL; right: REAL): ARRAY {UNSAFE} [?] OF REAL;
- TYPE Type = REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( Type ), MaxARSRLoop );
- RETURN RESULT
- END "MAX";
-
-
- PROCEDURE MaxALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: LONGINT;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval>val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MaxALSLLoop;
-
- OPERATOR "MAX"*(CONST left: ARRAY [?] OF LONGINT; right: LONGINT): ARRAY {UNSAFE} [?] OF LONGINT;
- TYPE Type = LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( Type ), MaxALSLLoop );
- RETURN RESULT
- END "MAX";
-
- PROCEDURE MaxAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: INTEGER;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval>val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MaxAISILoop;
-
- OPERATOR "MAX"*(CONST left: ARRAY [?] OF INTEGER; right: INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- TYPE Type = INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( Type ), MaxAISILoop );
- RETURN RESULT
- END "MAX";
- PROCEDURE MaxASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval>val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MaxASSSLoop;
-
- OPERATOR "MAX"*(CONST left: ARRAY [?] OF SHORTINT; right: SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- TYPE Type = SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( Type ), MaxASSSLoop );
- RETURN RESULT
- END "MAX";
-
- PROCEDURE MinAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval<val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MinAXSXLoop;
-
- OPERATOR "MIN"*(CONST left: ARRAY [?] OF LONGREAL; right: LONGREAL): ARRAY {UNSAFE} [?] OF LONGREAL;
- TYPE Type = LONGREAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( Type ), MinAXSXLoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: REAL;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval<val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MinARSRLoop;
-
- OPERATOR "MIN"*(CONST left: ARRAY [?] OF REAL; right: REAL): ARRAY {UNSAFE} [?] OF REAL;
- TYPE Type = REAL;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( Type ), MinARSRLoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: LONGINT;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval<val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MinALSLLoop;
-
- OPERATOR "MIN"*(CONST left: ARRAY [?] OF LONGINT; right: LONGINT): ARRAY {UNSAFE} [?] OF LONGINT;
- TYPE Type = LONGINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( Type ), MinALSLLoop );
- RETURN RESULT
- END "MIN";
- PROCEDURE MinAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: INTEGER;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval<val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MinAISILoop;
-
- OPERATOR "MIN"*(CONST left: ARRAY [?] OF INTEGER; right: INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- TYPE Type = INTEGER;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( Type ), MinAISILoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval<val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MinASSSLoop;
-
- OPERATOR "MIN"*(CONST left: ARRAY [?] OF SHORTINT; right: SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- TYPE Type = SHORTINT;
- BEGIN
- ApplyBinaryASAOp( RESULT , left, ADDRESSOF( right ), SIZEOF( Type ), MinASSSLoop );
- RETURN RESULT
- END "MIN";
- (**** binary max/min operators array x array -> array ********************************************************************)
- PROCEDURE MaxAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval>rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MaxAXAXLoop;
- OPERATOR "MAX"*(CONST left, right: ARRAY [?] OF LONGREAL): ARRAY {UNSAFE} [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( LONGREAL ), MaxAXAXLoop );
- RETURN RESULT
- END "MAX";
-
- PROCEDURE MaxARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL ;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval>rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MaxARARLoop;
- OPERATOR "MAX"*(CONST left, right: ARRAY [?] OF REAL): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( REAL ), MaxARARLoop );
- RETURN RESULT
- END "MAX";
- PROCEDURE MaxALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval>rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MaxALALLoop;
- OPERATOR "MAX"*(CONST left, right: ARRAY [?] OF LONGINT): ARRAY {UNSAFE} [?] OF LONGINT ;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( LONGINT ), MaxALALLoop );
- RETURN RESULT
- END "MAX";
-
- PROCEDURE MaxAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval>rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MaxAIAILoop;
- OPERATOR "MAX"*(CONST left, right: ARRAY [?] OF INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( INTEGER ), MaxAIAILoop );
- RETURN RESULT
- END "MAX";
-
- PROCEDURE MaxASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval>rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MaxASASLoop;
- OPERATOR "MAX"*(CONST left, right: ARRAY [?] OF SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( SHORTINT ), MaxASASLoop );
- RETURN RESULT
- END "MAX";
- PROCEDURE MinAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval<rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MinAXAXLoop;
-
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF LONGREAL): ARRAY {UNSAFE} [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( LONGREAL ), MinAXAXLoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL ;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval<rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MinARARLoop;
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF REAL): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( REAL ), MinARARLoop );
- RETURN RESULT
- END "MIN";
-
- (*PROCEDURE MinALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval<rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MinALALLoop;
- *)
- TYPE
- LongintPtr = POINTER {UNSAFE,UNTRACED} TO RECORD val: LONGINT END;
-
- PROCEDURE MinALALLoop( ladr, radr, dadr: LongintPtr; linc, rinc, dinc, len: SIZE);
- BEGIN
- WHILE (len > 0) DO
- IF ladr.val < ladr.val THEN dadr.val := ladr.val ELSE dadr.val := radr.val END;
- ladr := ladr + linc;
- radr := radr + rinc;
- dadr := dadr + dinc;
- DEC(len);
- END;
- END MinALALLoop;
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF LONGINT): ARRAY {UNSAFE} [?] OF LONGINT ;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( LONGINT ), MinALALLoop );
- RETURN RESULT
- END "MIN";
- TYPE SizePtr = POINTER {UNSAFE,UNTRACED} TO RECORD val: SIZE END;
-
- PROCEDURE MinAYAYLoop( ladr, radr, dadr: SizePtr; linc, rinc, dinc, len: SIZE);
- BEGIN
- WHILE (len > 0) DO
- IF ladr.val < ladr.val THEN dadr.val := ladr.val ELSE dadr.val := radr.val END;
- ladr := ladr + linc;
- radr := radr + rinc;
- dadr := dadr + dinc;
- DEC(len);
- END;
- END MinAYAYLoop;
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF SIZE): ARRAY {UNSAFE} [?] OF SIZE ;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( SIZE ), MinAYAYLoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval<rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MinAIAILoop;
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( INTEGER ), MinAIAILoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval<rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MinASASLoop;
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( RESULT, left, right, SIZEOF( SHORTINT ), MinASASLoop );
- RETURN RESULT
- END "MIN";
- (**** unary operators array -> scalar ********************************************************************)
- (*** min: array -> scalar ****************************************)
- (** SHORTINT *)
- PROCEDURE MinASLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinASLoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF SHORTINT ): SHORTINT;
- TYPE Type = SHORTINT;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left , MinASLoop ); RETURN val;
- END "MIN";
- (** INTEGER *)
- PROCEDURE MinAILoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinAILoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF INTEGER ): INTEGER;
- TYPE Type = INTEGER;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left , MinAILoop ); RETURN val;
- END "MIN";
- (** LONGINT *)
- PROCEDURE MinALLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinALLoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF LONGINT ): LONGINT;
- TYPE Type = LONGINT;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left , MinALLoop ); RETURN val;
- END "MIN";
- (** SIZE *)
- PROCEDURE MinAZLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: SIZE;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinAZLoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF SIZE ): SIZE;
- TYPE Type = SIZE;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left , MinAZLoop ); RETURN val;
- END "MIN";
- (** REAL *)
- PROCEDURE MinARLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: REAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinARLoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF REAL ): REAL;
- TYPE Type = REAL;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left, MinARLoop ); RETURN val;
- END "MIN";
- (** LONGREAL *)
- PROCEDURE MinAXLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinAXLoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF LONGREAL ): LONGREAL;
- TYPE Type = LONGREAL;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left , MinAXLoop ); RETURN val;
- END "MIN";
- (*** max: array -> scalar ********************************************************************)
- (** SHORTINT *)
- PROCEDURE MaxASLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MaxASLoop;
- OPERATOR "MAX"*( CONST left: ARRAY [ ? ] OF SHORTINT ): SHORTINT;
- TYPE Type = SHORTINT;
- VAR val: Type;
- BEGIN
- val := MIN( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left , MaxASLoop ); RETURN val;
- END "MAX";
- (** INTEGER *)
- PROCEDURE MaxAILoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MaxAILoop;
- OPERATOR "MAX"*( CONST left: ARRAY [ ? ] OF INTEGER ): INTEGER;
- TYPE Type = INTEGER;
- VAR val: Type;
- BEGIN
- val := MIN( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left , MaxAILoop ); RETURN val;
- END "MAX";
- (** LONGINT *)
- PROCEDURE MaxALLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MaxALLoop;
- OPERATOR "MAX"*( CONST left: ARRAY [ ? ] OF LONGINT ): LONGINT;
- TYPE Type = LONGINT;
- VAR val: Type;
- BEGIN
- val := MIN( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left , MaxALLoop ); RETURN val;
- END "MAX";
- (** REAL *)
- PROCEDURE MaxARLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: REAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MaxARLoop;
- OPERATOR "MAX"*( CONST left: ARRAY [ ? ] OF REAL ): REAL;
- TYPE Type = REAL;
- VAR val: Type;
- BEGIN
- val := MIN( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left , MaxARLoop ); RETURN val;
- END "MAX";
- (** LONGREAL *)
- PROCEDURE MaxAXLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MaxAXLoop;
- OPERATOR "MAX"*( CONST left: ARRAY [ ? ] OF LONGREAL ): LONGREAL;
- TYPE Type = LONGREAL;
- VAR val: Type;
- BEGIN
- val := MIN( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), left , MaxAXLoop ); RETURN val;
- END "MAX";
- (*** LEN: array -> array **)
- OPERATOR "LEN"*(CONST left: ARRAY [?]): ARRAY [*] OF SIZE;
- VAR src: ADDRESS; dim,i: SIZE;
- BEGIN
- src := SYSTEM.VAL(ADDRESS,left);
- dim := GetDim( src );
- IF (DIM(RESULT)#1) OR (LEN(RESULT,0) # dim) THEN NEW(RESULT,dim) END;
- FOR i := 0 TO dim-1 DO RESULT[i] := LenType(GetLen(src,i)) END;
- RETURN RESULT
- END "LEN";
- (*** SUM: array -> scalar ********************************************************************)
- (** SHORTINT *)
- PROCEDURE SumASLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumASLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF SHORTINT ): SHORTINT;
- TYPE Type = SHORTINT;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), left , SumASLoop );
- RETURN val;
- END "SUM";
- (** INTEGER *)
- PROCEDURE SumAILoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumAILoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF INTEGER ): INTEGER;
- TYPE Type = INTEGER;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), left, SumAILoop );
- RETURN val;
- END "SUM";
- (** LONGINT *)
- PROCEDURE SumALLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumALLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF LONGINT ): LONGINT;
- TYPE Type = LONGINT;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), left , SumALLoop );
- RETURN val;
- END "SUM";
- (** SIZE *)
- PROCEDURE SumAYLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: SIZE;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumAYLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF SIZE ): SIZE;
- TYPE Type = SIZE;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), left, SumAYLoop );
- RETURN val;
- END "SUM";
- (** REAL *)
- PROCEDURE SumARLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: REAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumARLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF REAL ): REAL;
- TYPE Type = REAL;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), left, SumARLoop );
- RETURN val;
- END "SUM";
- (** LONGREAL *)
- PROCEDURE SumAXLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumAXLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF LONGREAL ): LONGREAL;
- TYPE Type = LONGREAL;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), left, SumAXLoop );
- RETURN val;
- END "SUM";
- (** COMPLEX *)
- PROCEDURE SumAZLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: COMPLEX;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumAZLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF COMPLEX ): COMPLEX;
- TYPE Type = COMPLEX;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), left, SumAZLoop );
- RETURN val;
- END "SUM";
- (** LONGCOMPLEX *)
- PROCEDURE SumALZLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lvalRe, lvalIm, dvalRe, dvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dvalRe ); SYSTEM.GET( dadr+SIZEOF(LONGREAL), dvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- dvalRe := dvalRe + lvalRe; dvalIm := dvalIm + lvalIm;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- END SumALZLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF LONGCOMPLEX ): LONGCOMPLEX;
- TYPE Type = LONGCOMPLEX;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), left, SumALZLoop );
- RETURN val;
- END "SUM";
- (*** monadic ABS array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE AbsLoopS( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS( lval ) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopS;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF SHORTINT): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( SHORTINT ), AbsLoopS );
- RETURN RESULT
- END "ABS";
- (** INTEGER *)
- PROCEDURE AbsLoopI( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS( lval ) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopI;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF INTEGER): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( INTEGER ), AbsLoopI );
- RETURN RESULT
- END "ABS";
- (** LONGINT *)
- PROCEDURE AbsLoopL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS( lval ) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopL;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF LONGINT): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGINT ), AbsLoopL );
- RETURN RESULT
- END "ABS";
- (** REAL *)
- PROCEDURE AbsLoopR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS( lval ) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopR;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF REAL): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( REAL ), AbsLoopR );
- RETURN RESULT
- END "ABS";
- (** LONGREAL *)
- PROCEDURE AbsLoopX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS( lval ) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopX;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF LONGREAL): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGREAL ), AbsLoopX );
- RETURN RESULT
- END "ABS";
- (** COMPLEX *)
- PROCEDURE AbsLoopZ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS(lval) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopZ;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF COMPLEX): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( REAL ), AbsLoopZ );
- RETURN RESULT
- END "ABS";
- (** LONGCOMPLEX *)
- PROCEDURE AbsLoopLZ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.PUT( dadr, MathL.sqrt(lvalRe*lvalRe + lvalIm*lvalIm) );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopLZ;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF LONGCOMPLEX): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp(RESULT, src,SIZEOF( LONGREAL ), AbsLoopLZ );
- RETURN RESULT
- END "ABS";
- (*** assign number to array (initialisation) ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE AssignSBABLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: BOOLEAN;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSBABLoop;
- OPERATOR ":="*(VAR dest: ARRAY {UNSAFE} [?] OF BOOLEAN; right: BOOLEAN);
- BEGIN
- ApplyUnarySAOp( dest, ADDRESSOF( right ), AssignSBABLoop );
- END ":=";
- (** SHORTINT*)
- PROCEDURE AssignSSASLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: SHORTINT;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSSASLoop;
- OPERATOR ":="*(VAR dest: ARRAY {UNSAFE} [?] OF SHORTINT; right: SHORTINT);
- BEGIN
- ApplyUnarySAOp( dest, ADDRESSOF( right ), AssignSSASLoop );
- END ":=";
- (**INTEGER *)
- PROCEDURE AssignSIAILoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: INTEGER;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSIAILoop;
- OPERATOR ":="*(VAR dest: ARRAY {UNSAFE} [?] OF INTEGER; right: INTEGER);
- BEGIN
- ApplyUnarySAOp( dest, ADDRESSOF( right ), AssignSIAILoop );
- END ":=";
- (** LONGINT *)
- PROCEDURE AssignSLALLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: LONGINT;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSLALLoop;
- OPERATOR ":="*(VAR dest: ARRAY {UNSAFE} [?] OF LONGINT; right: LONGINT);
- BEGIN
- ApplyUnarySAOp(dest, ADDRESSOF( right ), AssignSLALLoop );
- END ":=";
- (** HUGEINT *)
- PROCEDURE AssignSHAHLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR dval: POINTER{UNSAFE,UNTRACED} TO RECORD val: HUGEINT END; lval: HUGEINT;
- BEGIN
- dval := dadr;
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO
- dval.val := lval;
- dval := dval + dinc;
- DEC( len );
- END;
- END AssignSHAHLoop;
- OPERATOR ":="*(VAR dest: ARRAY {UNSAFE} [?] OF HUGEINT; right: HUGEINT);
- BEGIN
- ApplyUnarySAOp(dest, ADDRESSOF( right ), AssignSHAHLoop );
- END ":=";
- (** REAL *)
- PROCEDURE AssignSRARLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: REAL;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSRARLoop;
- OPERATOR ":="*(VAR dest: ARRAY {UNSAFE} [?] OF REAL; right: REAL);
- BEGIN
- ApplyUnarySAOp( dest, ADDRESSOF( right ), AssignSRARLoop );
- END ":=";
- (** LONGREAL *)
- PROCEDURE AssignSXAXLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: LONGREAL;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSXAXLoop;
- OPERATOR ":="*(VAR dest: ARRAY {UNSAFE} [?] OF LONGREAL; right: LONGREAL);
- BEGIN
- ApplyUnarySAOp( dest, ADDRESSOF( right ), AssignSXAXLoop );
- END ":=";
- (** COMPLEX *)
- PROCEDURE AssignSZAZLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: COMPLEX;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSZAZLoop;
- OPERATOR ":="*(VAR dest: ARRAY {UNSAFE} [?] OF COMPLEX; right: COMPLEX);
- BEGIN
- ApplyUnarySAOp( dest, ADDRESSOF( right ), AssignSZAZLoop );
- END ":=";
- (** LONGCOMPLEX *)
- PROCEDURE AssignSLZALZLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lvalRe, lvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalIm ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSLZALZLoop;
- OPERATOR ":="*(VAR dest: ARRAY {UNSAFE} [?] OF LONGCOMPLEX; right: LONGCOMPLEX);
- BEGIN
- ApplyUnarySAOp( dest, ADDRESSOF( right ), AssignSLZALZLoop );
- END ":=";
- (*** matrix multipliation ********************************************************************)
- PROCEDURE AllocateMatrix( dest: ADDRESS;
- rows, cols, elementsize: SIZE ): ANY;
- VAR p: ANY;
- BEGIN
- (*
- KernelLog.String( "ALLOCATE MATRIX WAS CALLED" ); KernelLog.Ln;
- *)
- SYSTEM.NEW( p, rows * cols * elementsize + ArrayAlignment); PutLen( dest, 1, cols );
- PutLen( dest, 0, rows ); PutInc( dest, 1, elementsize );
- PutInc( dest, 0, elementsize * cols ); PutAdr( dest, Align(p) );
- PutPtr( dest, p); RETURN p;
- END AllocateMatrix;
- PROCEDURE AllocateVector(CONST dest: UnsafeArrayT; l0, elementsize: SIZE );
- VAR p: ANY;
- BEGIN
- SYSTEM.NEW( p, l0 * elementsize + ArrayAlignment); PutLen( dest, 0, l0 );
- PutInc( dest, 0, elementsize ); PutAdr( dest, Align(p) );
- PutPtr( dest, p );
- END AllocateVector;
- PROCEDURE ApplyMatMulLoop( dest, left, right: ADDRESS; Size: SIZE;
- loop: BinaryAASLoop;
- fast: FastMatMul ); (* Size= element-size *)
- VAR ladr, radr, dadr: ADDRESS; dadri, radri, rowsL, colsL, rowsR, colsR, incL, incR, incD, strideR, strideL, strideD, colsRi: SIZE;
- p: ANY; overlap: BOOLEAN; destOld: UnsafeArray; destNew: UnsafeArrayT;
- BEGIN
- (*
- <- 1 ->
- xxx xxxx -> xxxx
- ^ xxx xxxx xxxx
- 0 xxx xxxx xxxx
- v xxx xxxx
- xxx xxxx
- Len(..,1): #columns ; Inc(..,1): inc in rows
- Len(..,0): #rows ; Inc(..,0): inc between rows
- *)
- (* apply multiplication D = L * R *)
- rowsL := GetLen( left, 0 ); (* # left rows = # dest rows*)
- colsL := GetLen( left, 1 ); (* # left columns *)
- rowsR := GetLen( right, 0 ); (* # right rows =!= left columns *)
- colsR := GetLen( right, 1 ); (* # right columns = # dest columns*)
- (* check geometric restriction *)
- IF colsL # rowsR THEN Halt( GeometryMismatch, left, right, 0 ); END;
- IF GetAdr( dest ) = 0 THEN p := AllocateMatrix( dest, rowsL, colsR, Size );
- ELSIF (GetLen( dest, 0 ) # rowsL) OR (GetLen( dest, 1 ) # colsR) THEN
- IF RangeFlag IN GetFlags( dest ) THEN
- Halt( GeometryMismatch, left, right, dest )
- ELSE p := AllocateMatrix( dest, rowsL, colsR, Size );
- END;
- END;
- overlap := Overlap( left, dest ) OR Overlap( right, dest );
- IF overlap THEN
- destOld := dest; destNew := NIL;
- IF AllocateSameT( destNew, destOld, Size ) THEN END;
- CopyContent( destNew, destOld, Size ); (* for INCMUL ! *)
- dest := destNew;
- END;
- IF (GetLen( dest, 0 ) # rowsL) OR (GetLen( dest, 1 ) # colsR) THEN
- HALT( 9999 )
- END;
- ladr := GetAdr( left ); radr := GetAdr( right ); dadr := GetAdr( dest );
- incL := GetIncr( left, 1 ); strideL := GetIncr( left, 0 ); (* increment and stride of left matrix *)
- incR := GetIncr( right, 1 ); strideR := GetIncr( right, 0 ); (* increment and stride of right matrix *)
- incD := GetIncr( dest, 1 ); strideD := GetIncr( dest, 0 ); (* increment and stride of dest matrix *)
- (*
- KernelLog.String("incD="); KernelLog.Int(incD,10); KernelLog.Ln;
- KernelLog.String("strideD="); KernelLog.Int(strideD,10); KernelLog.Ln;
- KernelLog.String("Len(dest,0) [rows]="); KernelLog.Int(GetLen(dest,0),10); KernelLog.Ln;
- KernelLog.String("Len(dest,1) [cols]="); KernelLog.Int(GetLen(dest,1),10); KernelLog.Ln;
- *)
- IF rowsL = 0 THEN RETURN
- ELSIF colsL=0 THEN RETURN
- ELSIF colsR=0 THEN RETURN
- ELSIF (fast = NIL ) OR
- ~(fast( ladr, radr, dadr, incL, strideL, incR, strideR, incD, strideD, rowsL, colsL, rowsR, colsR )) THEN
- WHILE (rowsL > 0) DO (* outer loop: traverse rows of left matrix *)
- radri := radr; dadri := dadr; colsRi := colsR;
- WHILE (colsRi > 0) DO (* inner loop: traverse columns of right matrix *)
- loop( ladr, radri, dadri, incL, strideR, colsL ); INC( radri, incR );
- INC( dadri, incD ); DEC( colsRi );
- END;
- INC( ladr, strideL ); INC( dadr, strideD ); DEC( rowsL );
- END;
- END;
- IF overlap THEN CopyContent( destOld, dest, Size );
- END;
- END ApplyMatMulLoop;
- PROCEDURE ApplyMatVecMulLoop( dest, left, right: ADDRESS;
- Size: SIZE; loop: BinaryAASLoop;
- fast: FastMatMul ); (* Size= element-size *)
- VAR ladr, radr, dadr: ADDRESS; li1, li0, ri0, di0, l1, l2: SIZE;
- overlap: BOOLEAN; destOld, destNew: UnsafeArrayT;
- BEGIN
- (*
- <- 0 ->
- xxx T(xxx) -> T(xxxxx)
- xxx
- 1 xxx
- xxx
- xxx
- Len(..,0): #columns ; Inc(..,0): inc in rows
- Len(..,1): #rows ; Inc(..,1): inc between rows
- *)
- (* check geometric restriction *)
- IF GetLen( left, 1 ) # GetLen( right, 0 ) THEN
- Halt( GeometryMismatch, left, right,0 );
- END;
- l1 := GetLen( left, 0 ); (* number of destination's rows *)
- l2 := GetLen( left, 1 ); (* inner loop len *)
- IF GetAdr( dest ) = 0 THEN AllocateVector( dest, l1, Size );
- ELSIF (GetLen( dest, 0 ) # l1) THEN
- IF RangeFlag IN GetFlags( dest ) THEN
- Halt( GeometryMismatch, left, right, dest );
- ELSE AllocateVector( dest, l1, Size );
- END;
- END;
- overlap := Overlap( left, dest ) OR Overlap( right, dest );
- IF overlap THEN
- destOld := dest; destNew := NIL;
- IF AllocateSameT( destNew, destOld, Size ) THEN END;
- CopyContent( destNew, destOld, Size ); (* for INCMUL ! *)
- dest := destNew;
- END;
- (*
- IF GetAdr( dest ) = -1 THEN p := AllocateVector( dest, l1, Size ); ELSE
- IF (GetLen( dest, 0 ) # l1) THEN HALT( 102 ) END;
- END;
- *)
- ladr := GetAdr( left ); radr := GetAdr( right ); dadr := GetAdr( dest );
- li0 := GetIncr( left, 1 ); li1 := GetIncr( left, 0 ); ri0 := GetIncr( right, 0 );
- di0 := GetIncr( dest, 0 );
- IF l1=0 THEN RETURN
- ELSIF l2=0 THEN RETURN
- ELSIF (fast = NIL ) OR
- ~(fast( ladr, radr, dadr, li0, li1, ri0, ri0, di0, di0, l1, l2, l2, 1 )) THEN
- WHILE (l1 > 0) DO (* inner loop: traverse columns of right matrix *)
- loop( ladr, radr, dadr, li0, ri0, l2 ); INC( ladr, li1 ); INC( dadr, di0 );
- DEC( l1 );
- END;
- END;
- IF overlap THEN CopyContent( destOld, dest, Size );
- END;
- END ApplyMatVecMulLoop;
- PROCEDURE ApplyVecMatMulLoop( dest, left, right: ADDRESS;
- Size: SIZE; loop: BinaryAASLoop;
- fast: FastMatMul ); (* Size= element-size *)
- VAR ladr, radr, dadr: ADDRESS; li0, ri1, ri0, di0, l0, l2: SIZE; p: ANY;
- overlap: BOOLEAN; destOld, destNew: UnsafeArrayT;
- BEGIN
- (*
- <- 0 ->
- xxx xxxx -> xxxx
- xxxx
- 1 xxxx
- Len(..,0): #columns ; Inc(..,0): inc in rows
- Len(..,1): #rows ; Inc(..,1): inc between rows
- *)
- (* check geometric restriction *)
- IF GetLen( left, 0 ) # GetLen( right, 0 ) THEN HALT( GeometryMismatch ); END;
- l0 := GetLen( right, 1 ); (* number of destination's column *)
- l2 := GetLen( right, 0 ); (* inner loop len *)
- IF GetAdr( dest ) = 0 THEN AllocateVector( dest, l0, Size );
- ELSIF (GetLen( dest, 0 ) # l0) THEN
- IF RangeFlag IN GetFlags( dest ) THEN HALT( GeometryMismatch )
- ELSE AllocateVector( dest, l0, Size );
- END;
- END;
- overlap := Overlap( left, dest ) OR Overlap( right, dest );
- IF overlap THEN
- destOld := dest; destNew := NIL;
- IF AllocateSameT( destNew, destOld, Size ) THEN END;
- CopyContent( destNew, destOld, Size ); (* for INCMUL ! *)
- dest := destNew;
- END;
- (*
- IF GetAdr( dest ) = -1 THEN p := AllocateVector( dest, l0, Size ); ELSE
- IF (GetLen( dest, 0 ) # l0) THEN HALT( 102 ) END;
- END;
- *)
- ladr := GetAdr( left ); radr := GetAdr( right ); dadr := GetAdr( dest );
- li0 := GetIncr( left, 0 ); ri0 := GetIncr( right, 1 ); ri1 := GetIncr( right, 0 );
- di0 := GetIncr( dest, 0 );
- IF l2=0 THEN RETURN
- ELSIF l0=0 THEN RETURN
- ELSIF (fast = NIL ) OR ~fast( ladr, radr, dadr, li0, li0, ri0, ri1, di0, di0, 1, l2, l2, l0 ) THEN
- WHILE (l0 > 0) DO (* inner loop: traverse columns of right matrix *)
- loop( ladr, radr, dadr, li0, ri1, l2 ); INC( radr, ri0 ); INC( dadr, di0 );
- DEC( l0 );
- END;
- END;
- IF overlap THEN CopyContent( destOld, dest, Size );
- END;
- END ApplyVecMatMulLoop;
- (** SHORTINT *)
- PROCEDURE MatMulASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: SHORTINT;
- BEGIN
- dval := 0;
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- (* KernelLog.String("mul with: "); KernelLog.Int(lval,10); KernelLog.Int(rval,10); KernelLog.Ln; *)
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulASASLoop;
- OPERATOR "*"*(CONST left, right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * , * ] OF SHORTINT;
- BEGIN
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( SHORTINT ), MatMulASASLoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF SHORTINT; CONST right: ARRAY [ * ] OF SHORTINT): ARRAY [ * ] OF SHORTINT;
- BEGIN
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( SHORTINT ), MatMulASASLoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*( CONST left: ARRAY [ * ] OF SHORTINT; CONST right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- BEGIN
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( SHORTINT ), MatMulASASLoop, NIL );
- RETURN RESULT
- END "*";
- (** INTEGER *)
- PROCEDURE MatMulAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: INTEGER;
- BEGIN
- dval := 0;
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulAIAILoop;
- OPERATOR "*"*( CONST left, right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * , * ] OF INTEGER;
- BEGIN
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( INTEGER ), MatMulAIAILoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF INTEGER;
- CONST right: ARRAY [ * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- BEGIN
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( INTEGER ), MatMulAIAILoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left: ARRAY [ * ] OF INTEGER;
- CONST right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- BEGIN
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( INTEGER ), MatMulAIAILoop, NIL );
- RETURN RESULT
- END "*";
- (** LONGINT *)
- PROCEDURE MatMulALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: LONGINT;
- BEGIN
- dval := 0;
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulALALLoop;
- OPERATOR "*"*(CONST left, right: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * , * ] OF LONGINT;
- BEGIN
- (*
- KernelLog.String("MatMulALAL");
- KernelLog.Int(SYSTEM.VAL(LONGINT,dest),10);
- KernelLog.Int(SYSTEM.VAL(LONGINT,left),10);
- KernelLog.Int(SYSTEM.VAL(LONGINT,right),10);
- KernelLog.Ln;
- *)
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGINT ), MatMulALALLoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF LONGINT; CONST right: ARRAY [ * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- BEGIN
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGINT ), MatMulALALLoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left: ARRAY [ * ] OF LONGINT;
- CONST right: ARRAY [ * , * ] OF LONGINT): ARRAY [ * ] OF LONGINT;
- BEGIN
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGINT ), MatMulALALLoop, NIL );
- RETURN RESULT
- END "*";
- (** REAL *)
- PROCEDURE MatMulARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: REAL;
- BEGIN
- dval := 0;
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulARARLoop;
- (*
- Optimized for small matrices (Alexey Morozov)
- use of CONST for left, right makes execution slower, it seems that a new descriptor is created in this case
- *)
- OPERATOR "*"*(CONST left, right: ARRAY [ * , * ] OF REAL ): ARRAY [ * , * ] OF REAL;
- VAR flags: SET; dadr, ladr, radr: ADDRESS;
- BEGIN
- dadr := GetAdr(ADDRESSOF(RESULT));
- ladr := GetAdr(ADDRESSOF(left));
- radr := GetAdr(ADDRESSOF(right));
- (* account possible inplace left := left*right, right := left*right, left := left*left, right := right*right *)
- IF (ladr # dadr) & (radr # dadr) THEN
- flags := SmallArrayMask * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(left)+MathFlagsOffset)) * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(right)+MathFlagsOffset));
- CASE SYSTEM.VAL(LONGINT,flags) OF
- Mat2x2:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Mat2x2 THEN
- IF dadr = 0 THEN NEW(RESULT,2,2); dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulR2x2 # NIL THEN matMulR2x2(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1];
- END;
- |Mat3x3:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Mat3x3 THEN
- IF dadr = 0 THEN NEW(RESULT,3,3);dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulR3x3 # NIL THEN matMulR3x3(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0] + left[0,2]*right[2,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1] + left[0,2]*right[2,1];
- RESULT[0,2] := left[0,0]*right[0,2] + left[0,1]*right[1,2] + left[0,2]*right[2,2];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0] + left[1,2]*right[2,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1] + left[1,2]*right[2,1];
- RESULT[1,2] := left[1,0]*right[0,2] + left[1,1]*right[1,2] + left[1,2]*right[2,2];
- RESULT[2,0] := left[2,0]*right[0,0] + left[2,1]*right[1,0] + left[2,2]*right[2,0];
- RESULT[2,1] := left[2,0]*right[0,1] + left[2,1]*right[1,1] + left[2,2]*right[2,1];
- RESULT[2,2] := left[2,0]*right[0,2] + left[2,1]*right[1,2] + left[2,2]*right[2,2];
- END;
- |Mat4x4:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Mat4x4 THEN
- IF dadr = 0 THEN NEW(RESULT,4,4); dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulR4x4 # NIL THEN matMulR4x4(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0] + left[0,2]*right[2,0] + left[0,3]*right[3,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1] + left[0,2]*right[2,1] + left[0,3]*right[3,1];
- RESULT[0,2] := left[0,0]*right[0,2] + left[0,1]*right[1,2] + left[0,2]*right[2,2] + left[0,3]*right[3,2];
- RESULT[0,3] := left[0,0]*right[0,3] + left[0,1]*right[1,3] + left[0,2]*right[2,3] + left[0,3]*right[3,3];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0] + left[1,2]*right[2,0] + left[1,3]*right[3,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1] + left[1,2]*right[2,1] + left[1,3]*right[3,1];
- RESULT[1,2] := left[1,0]*right[0,2] + left[1,1]*right[1,2] + left[1,2]*right[2,2] + left[1,3]*right[3,2];
- RESULT[1,3] := left[1,0]*right[0,3] + left[1,1]*right[1,3] + left[1,2]*right[2,3] + left[1,3]*right[3,3];
- RESULT[2,0] := left[2,0]*right[0,0] + left[2,1]*right[1,0] + left[2,2]*right[2,0] + left[2,3]*right[3,0];
- RESULT[2,1] := left[2,0]*right[0,1] + left[2,1]*right[1,1] + left[2,2]*right[2,1] + left[2,3]*right[3,1];
- RESULT[2,2] := left[2,0]*right[0,2] + left[2,1]*right[1,2] + left[2,2]*right[2,2] + left[2,3]*right[3,2];
- RESULT[2,3] := left[2,0]*right[0,3] + left[2,1]*right[1,3] + left[2,2]*right[2,3] + left[2,3]*right[3,3];
- RESULT[3,0] := left[3,0]*right[0,0] + left[3,1]*right[1,0] + left[3,2]*right[2,0] + left[3,3]*right[3,0];
- RESULT[3,1] := left[3,0]*right[0,1] + left[3,1]*right[1,1] + left[3,2]*right[2,1] + left[3,3]*right[3,1];
- RESULT[3,2] := left[3,0]*right[0,2] + left[3,1]*right[1,2] + left[3,2]*right[2,2] + left[3,3]*right[3,2];
- RESULT[3,3] := left[3,0]*right[0,3] + left[3,1]*right[1,3] + left[3,2]*right[2,3] + left[3,3]*right[3,3];
- END;
- ELSE
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right, SIZEOF( REAL ),
- loopMatMulARAR, matMulR );
- END;
- ELSE
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right, SIZEOF( REAL ),
- loopMatMulARAR, matMulR );
- END;
- RETURN RESULT
- END "*";
- (*
- Optimized for small arrays (Alexey Morozov)
- use of CONST for left, right makes execution slower, it seems that a new descriptor is created in this case
- *)
- OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF REAL; CONST right: ARRAY [ * ] OF REAL ): ARRAY [ * ] OF REAL;
- VAR
- flags: SET; dadr, ladr, radr: ADDRESS;
- v0, v1, v2: REAL;
- BEGIN
- dadr := GetAdr(ADDRESSOF(RESULT));
- ladr := GetAdr(ADDRESSOF(left));
- radr := GetAdr(ADDRESSOF(right));
- flags := SmallArrayMask * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(left)+MathFlagsOffset)) * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(right)+MathFlagsOffset));
- CASE SYSTEM.VAL(LONGINT,flags) OF
- MatVec2x2:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Vec2 THEN
- IF dadr = 0 THEN NEW(RESULT,2);dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulR2x2 # NIL THEN matVecMulR2x2(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0];
- RESULT[0] := left[0,0]*v0 + left[0,1]*right[1];
- RESULT[1] := left[1,0]*v0 + left[1,1]*right[1];
- END;
- |MatVec3x3:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Vec3 THEN
- IF dadr = 0 THEN NEW(RESULT,3);dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulR3x3 # NIL THEN matVecMulR3x3(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0]; v1 := right[1];
- RESULT[0] := left[0,0]*v0 + left[0,1]*v1 + left[0,2]*right[2];
- RESULT[1] := left[1,0]*v0 + left[1,1]*v1 + left[1,2]*right[2];
- RESULT[2] := left[2,0]*v0 + left[2,1]*v1 + left[2,2]*right[2];
- END;
- |MatVec4x4:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Vec4 THEN
- IF dadr = 0 THEN NEW(RESULT,4);dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulR4x4 # NIL THEN matVecMulR4x4(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0]; v1 := right[1]; v2 := right[2];
- RESULT[0] := left[0,0]*v0 + left[0,1]*v1 + left[0,2]*v2 + left[0,3]*right[3];
- RESULT[1] := left[1,0]*v0 + left[1,1]*v1 + left[1,2]*v2 + left[1,3]*right[3];
- RESULT[2] := left[2,0]*v0 + left[2,1]*v1 + left[2,2]*v2 + left[2,3]*right[3];
- RESULT[3] := left[3,0]*v0 + left[3,1]*v1 + left[3,2]*v2 + left[3,3]*right[3];
- END;
- ELSE
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( REAL ), loopMatMulARAR, matMulR );
- END;
- RETURN RESULT
- END "*";
- OPERATOR "*"*( CONST left: ARRAY [ * ] OF REAL;
- CONST right: ARRAY [ * , * ] OF REAL ): ARRAY [ * ] OF REAL;
- BEGIN
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( REAL ), loopMatMulARAR, matMulR );
- RETURN RESULT
- END "*";
- (** LONGREAL *)
- PROCEDURE MatMulAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: LONGREAL;
- BEGIN
- dval := 0;
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulAXAXLoop;
- (*
- Optimized for small matrices (Alexey Morozov)
- use of CONST for left, right makes execution slower, it seems that a new descriptor is created in this case
- *)
- OPERATOR "*"*( CONST left, right: ARRAY [ * , * ] OF LONGREAL): ARRAY [ * , * ] OF LONGREAL;
- VAR
- flags: SET; dadr, ladr, radr: ADDRESS;
- BEGIN
- dadr := GetAdr(ADDRESSOF(RESULT));
- ladr := GetAdr(ADDRESSOF(left));
- radr := GetAdr(ADDRESSOF(right));
- IF (ladr # dadr) & (radr # dadr) THEN
- flags := SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(left)+MathFlagsOffset)) * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(right)+MathFlagsOffset));
- CASE SYSTEM.VAL(LONGINT,flags) OF
- Mat2x2:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Mat2x2 THEN
- IF dadr = 0 THEN NEW(RESULT,2,2);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulLR2x2 # NIL THEN matMulLR2x2(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1];
- END;
- |Mat3x3:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Mat3x3 THEN
- IF dadr = 0 THEN NEW(RESULT,3,3);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulLR3x3 # NIL THEN matMulLR3x3(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0] + left[0,2]*right[2,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1] + left[0,2]*right[2,1];
- RESULT[0,2] := left[0,0]*right[0,2] + left[0,1]*right[1,2] + left[0,2]*right[2,2];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0] + left[1,2]*right[2,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1] + left[1,2]*right[2,1];
- RESULT[1,2] := left[1,0]*right[0,2] + left[1,1]*right[1,2] + left[1,2]*right[2,2];
- RESULT[2,0] := left[2,0]*right[0,0] + left[2,1]*right[1,0] + left[2,2]*right[2,0];
- RESULT[2,1] := left[2,0]*right[0,1] + left[2,1]*right[1,1] + left[2,2]*right[2,1];
- RESULT[2,2] := left[2,0]*right[0,2] + left[2,1]*right[1,2] + left[2,2]*right[2,2];
- END;
- |Mat4x4:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Mat4x4 THEN
- IF dadr = 0 THEN NEW(RESULT,4,4);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulLR4x4 # NIL THEN matMulLR4x4(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0] + left[0,2]*right[2,0] + left[0,3]*right[3,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1] + left[0,2]*right[2,1] + left[0,3]*right[3,1];
- RESULT[0,2] := left[0,0]*right[0,2] + left[0,1]*right[1,2] + left[0,2]*right[2,2] + left[0,3]*right[3,2];
- RESULT[0,3] := left[0,0]*right[0,3] + left[0,1]*right[1,3] + left[0,2]*right[2,3] + left[0,3]*right[3,3];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0] + left[1,2]*right[2,0] + left[1,3]*right[3,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1] + left[1,2]*right[2,1] + left[1,3]*right[3,1];
- RESULT[1,2] := left[1,0]*right[0,2] + left[1,1]*right[1,2] + left[1,2]*right[2,2] + left[1,3]*right[3,2];
- RESULT[1,3] := left[1,0]*right[0,3] + left[1,1]*right[1,3] + left[1,2]*right[2,3] + left[1,3]*right[3,3];
- RESULT[2,0] := left[2,0]*right[0,0] + left[2,1]*right[1,0] + left[2,2]*right[2,0] + left[2,3]*right[3,0];
- RESULT[2,1] := left[2,0]*right[0,1] + left[2,1]*right[1,1] + left[2,2]*right[2,1] + left[2,3]*right[3,1];
- RESULT[2,2] := left[2,0]*right[0,2] + left[2,1]*right[1,2] + left[2,2]*right[2,2] + left[2,3]*right[3,2];
- RESULT[2,3] := left[2,0]*right[0,3] + left[2,1]*right[1,3] + left[2,2]*right[2,3] + left[2,3]*right[3,3];
- RESULT[3,0] := left[3,0]*right[0,0] + left[3,1]*right[1,0] + left[3,2]*right[2,0] + left[3,3]*right[3,0];
- RESULT[3,1] := left[3,0]*right[0,1] + left[3,1]*right[1,1] + left[3,2]*right[2,1] + left[3,3]*right[3,1];
- RESULT[3,2] := left[3,0]*right[0,2] + left[3,1]*right[1,2] + left[3,2]*right[2,2] + left[3,3]*right[3,2];
- RESULT[3,3] := left[3,0]*right[0,3] + left[3,1]*right[1,3] + left[3,2]*right[2,3] + left[3,3]*right[3,3];
- END;
- ELSE
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right, SIZEOF( LONGREAL ),
- loopMatMulAXAX, matMulX );
- END;
- ELSE
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right, SIZEOF( LONGREAL ),
- loopMatMulAXAX, matMulX );
- END;
- RETURN RESULT
- END "*";
- (*
- Optimized for small arrays (Alexey Morozov)
- use of CONST for left, right makes execution slower, it seems that a new descriptor is created in this case
- *)
- OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF LONGREAL;
- CONST right: ARRAY [ * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- VAR
- flags: SET; dadr, ladr, radr: ADDRESS;
- v0, v1, v2: LONGREAL;
- BEGIN
- dadr := GetAdr(ADDRESSOF(RESULT));
- ladr := GetAdr(ADDRESSOF(left));
- radr := GetAdr(ADDRESSOF(right));
- flags := SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(left)+MathFlagsOffset)) * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(right)+MathFlagsOffset));
- CASE SYSTEM.VAL(LONGINT,flags) OF
- MatVec2x2:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Vec2 THEN
- IF dadr = 0 THEN NEW(RESULT,2);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulLR2x2 # NIL THEN matVecMulLR2x2(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0];
- RESULT[0] := left[0,0]*v0 + left[0,1]*right[1];
- RESULT[1] := left[1,0]*v0 + left[1,1]*right[1];
- END;
- |MatVec3x3:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Vec3 THEN
- IF dadr = 0 THEN NEW(RESULT,3);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulLR3x3 # NIL THEN matVecMulLR3x3(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0]; v1 := right[1];
- RESULT[0] := left[0,0]*v0 + left[0,1]*v1 + left[0,2]*right[2];
- RESULT[1] := left[1,0]*v0 + left[1,1]*v1 + left[1,2]*right[2];
- RESULT[2] := left[2,0]*v0 + left[2,1]*v1 + left[2,2]*right[2];
- END;
- |MatVec4x4:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Vec4 THEN
- IF dadr = 0 THEN NEW(RESULT,4);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulLR4x4 # NIL THEN matVecMulLR4x4(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0]; v1 := right[1]; v2 := right[2];
- RESULT[0] := left[0,0]*v0 + left[0,1]*v1 + left[0,2]*v2 + left[0,3]*right[3];
- RESULT[1] := left[1,0]*v0 + left[1,1]*v1 + left[1,2]*v2 + left[1,3]*right[3];
- RESULT[2] := left[2,0]*v0 + left[2,1]*v1 + left[2,2]*v2 + left[2,3]*right[3];
- RESULT[3] := left[3,0]*v0 + left[3,1]*v1 + left[3,2]*v2 + left[3,3]*right[3];
- END;
- ELSE
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGREAL ), loopMatMulAXAX, matMulX );
- END;
- RETURN RESULT
- END "*";
- OPERATOR "*"*( CONST left: ARRAY [ * ] OF LONGREAL;
- CONST right: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- BEGIN
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGREAL ), loopMatMulAXAX, matMulX );
- RETURN RESULT
- END "*";
- (** SHORTINT *)
- PROCEDURE MatMulIncASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- (* KernelLog.String("mul with: "); KernelLog.Int(lval,10); KernelLog.Int(rval,10); KernelLog.Ln; *)
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulIncASASLoop;
- OPERATOR "INCMUL"*(CONST left, right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * , * ] OF SHORTINT;
- BEGIN
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(CONST left: ARRAY [ * , * ] OF SHORTINT;
- CONST right: ARRAY [ * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- BEGIN
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*( CONST left: ARRAY [ * ] OF SHORTINT;
- CONST right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- BEGIN
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left, right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * , * ] OF SHORTINT;
- BEGIN
- RESULT := -RESULT;
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ * , * ] OF SHORTINT;
- CONST right: ARRAY [ * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- BEGIN
- RESULT := -RESULT;
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * ] OF SHORTINT;
- CONST right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- BEGIN
- RESULT := -RESULT;
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** INTEGER *)
- PROCEDURE MatMulIncAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulIncAIAILoop;
- OPERATOR "INCMUL"*(CONST left, right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * , * ] OF INTEGER;
- BEGIN
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(CONST left: ARRAY [ * , * ] OF INTEGER; CONST right: ARRAY [ * ] OF INTEGER): ARRAY [ * ] OF INTEGER;
- BEGIN
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*( CONST left: ARRAY [ * ] OF INTEGER; CONST right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- BEGIN
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left, right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * , * ] OF INTEGER;
- BEGIN
- RESULT := -RESULT;
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * , * ] OF INTEGER; CONST right: ARRAY [ * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- BEGIN
- RESULT := -RESULT;
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * ] OF INTEGER; CONST right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- BEGIN
- RESULT := -RESULT;
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** LONGINT *)
- PROCEDURE MatMulIncALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulIncALALLoop;
- OPERATOR "INCMUL"*(CONST left, right: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * , * ] OF LONGINT;
- BEGIN
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(CONST left: ARRAY [ * , * ] OF LONGINT; CONST right: ARRAY [ * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- BEGIN
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*( CONST left: ARRAY [ * ] OF LONGINT; CONST right: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- BEGIN
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*( CONST left, right: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * , * ] OF LONGINT;
- BEGIN
- RESULT := -RESULT;
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ * , * ] OF LONGINT; CONST right: ARRAY [ * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- BEGIN
- RESULT := -RESULT;
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ * ] OF LONGINT; CONST right: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- BEGIN
- RESULT := -RESULT;
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** REAL *)
- PROCEDURE MatMulIncARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: REAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulIncARARLoop;
- OPERATOR "INCMUL"*(CONST left, right: ARRAY [ * , * ] OF REAL ): ARRAY [ * , * ] OF REAL;
- BEGIN
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right, SIZEOF( REAL ),
- loopMatMulIncARAR, matMulIncR );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(CONST left: ARRAY [ * , * ] OF REAL;CONST right: ARRAY [ * ] OF REAL ): ARRAY [ * ] OF REAL;
- BEGIN
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( REAL ), loopMatMulIncARAR, matMulIncR );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*( CONST left: ARRAY [ * ] OF REAL; CONST right: ARRAY [ * , * ] OF REAL ): ARRAY [ * ] OF REAL;
- BEGIN
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( REAL ), loopMatMulIncARAR, matMulIncR );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left, right: ARRAY [ * , * ] OF REAL ): ARRAY [ * , * ] OF REAL;
- BEGIN
- RESULT := -RESULT;
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right, SIZEOF( REAL ),
- loopMatMulIncARAR, matMulIncR );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * , * ] OF REAL; CONST right: ARRAY [ * ] OF REAL ): ARRAY [ * ] OF REAL;
- BEGIN
- RESULT := -RESULT;
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( REAL ), loopMatMulIncARAR, matMulIncR );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ * ] OF REAL; CONST right: ARRAY [ * , * ] OF REAL ): ARRAY [ * ] OF REAL;
- BEGIN
- RESULT := -RESULT;
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( REAL ), loopMatMulIncARAR, matMulIncR );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** LONGREAL *)
- PROCEDURE MatMulIncAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulIncAXAXLoop;
- OPERATOR "INCMUL"*(CONST left, right: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * , * ] OF LONGREAL;
- BEGIN
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(CONST left: ARRAY [ * , * ] OF LONGREAL; CONST right: ARRAY [ * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- BEGIN
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*( CONST left: ARRAY [ * ] OF LONGREAL; CONST right: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- BEGIN
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left, right: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * , * ] OF LONGREAL;
- BEGIN
- RESULT := -RESULT;
- ApplyMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * , * ] OF LONGREAL; CONST right: ARRAY [ * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- BEGIN
- RESULT := -RESULT;
- ApplyMatVecMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * ] OF LONGREAL; CONST right: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- BEGIN
- RESULT := -RESULT;
- ApplyVecMatMulLoop( ADDRESS OF RESULT, ADDRESS OF left, ADDRESS OF right,
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (*** Cross product ********************************************************************)
- OPERATOR "*"*(CONST left, right: ARRAY [ * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- VAR vl1, vl2, vl3, vr1, vr2, vr3: SHORTINT;
- BEGIN
- IF (LEN( left,0 ) # 3) OR (LEN( right,0 ) # 3) THEN
- Halt( GeometryMismatch, ADDRESSOF( left ), ADDRESSOF( right ), 0 )
- END;
- IF LEN( RESULT,0 ) # 3 THEN NEW( RESULT, 3 ) END; (* will trap if not allowed *)
- vl1 := left[0]; vl2 := left[1]; vl3 := left[2]; vr1 := right[0]; vr2 := right[1];
- vr3 := right[2]; RESULT[0] := vl2 * vr3 - vl3 * vr2;
- RESULT[1] := vl3 * vr1 - vl1 * vr3; RESULT[2] := vl1 * vr2 - vl2 * vr1;
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- VAR vl1, vl2, vl3, vr1, vr2, vr3: INTEGER;
- BEGIN
- IF (LEN( left,0 ) # 3) OR (LEN( right,0 ) # 3) THEN
- Halt( GeometryMismatch, ADDRESSOF( left ), ADDRESSOF( right ), 0 )
- END;
- IF LEN( RESULT,0 ) # 3 THEN NEW( RESULT, 3 ) END; (* will trap if not allowed *)
- vl1 := left[0]; vl2 := left[1]; vl3 := left[2]; vr1 := right[0]; vr2 := right[1];
- vr3 := right[2]; RESULT[0] := vl2 * vr3 - vl3 * vr2;
- RESULT[1] := vl3 * vr1 - vl1 * vr3; RESULT[2] := vl1 * vr2 - vl2 * vr1;
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- VAR vl1, vl2, vl3, vr1, vr2, vr3: LONGINT;
- BEGIN
- IF (LEN( left,0 ) # 3) OR (LEN( right,0 ) # 3) THEN
- Halt( GeometryMismatch, ADDRESSOF( left ), ADDRESSOF( right ), 0 )
- END;
- IF LEN( RESULT,0 ) # 3 THEN NEW( RESULT, 3 ) END; (* will trap if not allowed *)
- vl1 := left[0]; vl2 := left[1]; vl3 := left[2]; vr1 := right[0]; vr2 := right[1];
- vr3 := right[2]; RESULT[0] := vl2 * vr3 - vl3 * vr2;
- RESULT[1] := vl3 * vr1 - vl1 * vr3; RESULT[2] := vl1 * vr2 - vl2 * vr1;
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ * ] OF REAL ): ARRAY [ * ] OF REAL;
- VAR vl1, vl2, vl3, vr1, vr2, vr3: REAL;
- BEGIN
- IF (LEN( left,0 ) # 3) OR (LEN( right,0 ) # 3) THEN
- Halt( GeometryMismatch, ADDRESSOF( left ), ADDRESSOF( right ), 0 )
- END;
- IF LEN( RESULT,0 ) # 3 THEN NEW( RESULT, 3 ) END; (* will trap if not allowed *)
- vl1 := left[0]; vl2 := left[1]; vl3 := left[2]; vr1 := right[0]; vr2 := right[1];
- vr3 := right[2]; RESULT[0] := vl2 * vr3 - vl3 * vr2;
- RESULT[1] := vl3 * vr1 - vl1 * vr3; RESULT[2] := vl1 * vr2 - vl2 * vr1;
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- VAR vl1, vl2, vl3, vr1, vr2, vr3: LONGREAL;
- BEGIN
- IF (LEN( left,0 ) # 3) OR (LEN( right,0 ) # 3) THEN
- Halt( GeometryMismatch, ADDRESSOF( left ), ADDRESSOF( right ), 0 )
- END;
- IF LEN( RESULT,0 ) # 3 THEN NEW( RESULT, 3 ) END; (* will trap if not allowed *)
- vl1 := left[0]; vl2 := left[1]; vl3 := left[2]; vr1 := right[0]; vr2 := right[1];
- vr3 := right[2]; RESULT[0] := vl2 * vr3 - vl3 * vr2;
- RESULT[1] := vl3 * vr1 - vl1 * vr3; RESULT[2] := vl1 * vr2 - vl2 * vr1;
- RETURN RESULT
- END "*";
-
- OPERATOR "*"*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY {UNSAFE} [ ? ] OF LONGREAL;
- VAR tensor: Tensor;
- BEGIN
- IF (DIM(left) = 2) & (DIM(right)=2) THEN
- EnsureArrayDesc(2, SYSTEM.VAL(Tensor, RESULT));
- ELSIF (DIM(left) = 2) & (DIM(right)=1) THEN
- EnsureArrayDesc(1, SYSTEM.VAL(Tensor, RESULT));
- ELSE HALT(200);
- END;
- ApplyMatMulLoop(SYSTEM.VAL(Tensor, RESULT), SYSTEM.VAL(Tensor, left), SYSTEM.VAL(Tensor, right), SIZEOF( LONGREAL ),
- loopMatMulAXAX, matMulX );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY {UNSAFE} [ ? ] OF REAL;
- BEGIN
- IF (DIM(left) = 2) & (DIM(right)=2) THEN
- EnsureArrayDesc(2, SYSTEM.VAL(Tensor, RESULT));
- ELSIF (DIM(left) = 2) & (DIM(right)=1) THEN
- EnsureArrayDesc(1, SYSTEM.VAL(Tensor, RESULT));
- ELSE HALT(200);
- END;
- ApplyMatMulLoop(SYSTEM.VAL(Tensor, RESULT), SYSTEM.VAL(Tensor, left), SYSTEM.VAL(Tensor, right), SIZEOF( REAL ),
- loopMatMulARAR, matMulR );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY {UNSAFE} [ ? ] OF LONGINT;
- BEGIN
- IF (DIM(left) = 2) & (DIM(right)=2) THEN
- EnsureArrayDesc(2, SYSTEM.VAL(Tensor, RESULT));
- ELSIF (DIM(left) = 2) & (DIM(right)=1) THEN
- EnsureArrayDesc(1, SYSTEM.VAL(Tensor, RESULT));
- ELSE HALT(200);
- END;
- ApplyMatMulLoop(SYSTEM.VAL(Tensor, RESULT), SYSTEM.VAL(Tensor, left), SYSTEM.VAL(Tensor, right), SIZEOF( LONGINT ),
- MatMulALALLoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY {UNSAFE} [ ? ] OF INTEGER;
- BEGIN
- IF (DIM(left) = 2) & (DIM(right)=2) THEN
- EnsureArrayDesc(2, SYSTEM.VAL(Tensor, RESULT));
- ELSIF (DIM(left) = 2) & (DIM(right)=1) THEN
- EnsureArrayDesc(1, SYSTEM.VAL(Tensor, RESULT));
- ELSE HALT(200);
- END;
- ApplyMatMulLoop(SYSTEM.VAL(Tensor, RESULT), SYSTEM.VAL(Tensor, left), SYSTEM.VAL(Tensor, right), SIZEOF( INTEGER ),
- MatMulAIAILoop,NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY {UNSAFE} [ ? ] OF SHORTINT;
- BEGIN
- IF (DIM(left) = 2) & (DIM(right)=2) THEN
- EnsureArrayDesc(2, SYSTEM.VAL(Tensor, RESULT));
- ELSIF (DIM(left) = 2) & (DIM(right)=1) THEN
- EnsureArrayDesc(1, SYSTEM.VAL(Tensor, RESULT));
- ELSE HALT(200);
- END;
- ApplyMatMulLoop(SYSTEM.VAL(Tensor, RESULT), SYSTEM.VAL(Tensor, left), SYSTEM.VAL(Tensor, right), SIZEOF( SHORTINT ),
- MatMulASASLoop, NIL );
- RETURN RESULT
- END "*";
- (** Transpose ********************************************************************)
- PROCEDURE Overlap( src1, src2: ADDRESS ): BOOLEAN;
- VAR from1, from2, to1, to2: ADDRESS; dim: SIZE;
- BEGIN
- from1 := GetAdr( src1 ); from2 := GetAdr( src2 ); to1 := from1; to2 := from2;
- dim := GetDim( src1 ) - 1;
- WHILE (dim > 0) DO
- to1 := to1 + (GetLen( src1, dim ) - 1) * GetIncr( src1, dim ); DEC( dim );
- END;
- dim := GetDim( src2 ) - 1;
- WHILE (dim > 0) DO
- to2 := to2 + (GetLen( src2, dim ) - 1) * GetIncr( src2, dim ); DEC( dim );
- END;
- IF from1 < from2 THEN RETURN to1 >= from2;
- ELSIF from2 < from1 THEN RETURN to2 >= from1;
- ELSE RETURN TRUE;
- END;
- END Overlap;
- (*
- PROCEDURE Overlap( src1, src2, dim: ADDRESS ): BOOLEAN;
- VAR from1, from2, to1, to2: ADDRESS;
- BEGIN
- from1 := GetAdr( src1 ); from2 := GetAdr( src2 ); to1 := from1; to2 := from2;
- DEC( dim );
- WHILE (dim > 0) DO
- to1 := to1 + (GetLen( src1, dim ) - 1) * GetIncr( src1, dim );
- to2 := to2 + (GetLen( src2, dim ) - 1) * GetIncr( src2, dim ); DEC( dim );
- END;
- IF from1 < from2 THEN RETURN to1 >= from2;
- ELSIF from2 < from1 THEN RETURN to2 >= from1;
- ELSE RETURN TRUE;
- END;
- END Overlap;
- *)
- PROCEDURE AllocateTransposed( VAR dest: UnsafeArrayT; CONST src: UnsafeArrayT; elementsize: SIZE ): BOOLEAN;
- VAR Size: SIZE;
- (* allocate a structure in dest compatible with src, if necessary. returns if allocation has taken place *)
- PROCEDURE TransposedShape( l, r: ADDRESS ): BOOLEAN;
- VAR dim,max: SIZE;
- BEGIN
- dim := GetDim( l );
- IF dim # GetDim( r ) THEN RETURN FALSE END;
- max := dim-1;
- WHILE (dim > 0) DO
- DEC( dim );
- IF GetLen( l, max-dim ) # GetLen( r, dim ) THEN RETURN FALSE END;
- END;
- RETURN TRUE;
- END TransposedShape;
- PROCEDURE NewData;
- VAR max,dim, len, size: SIZE; data: ANY;
- BEGIN
- dim := GetDim( src ); size := elementsize;
- PutDim( dest, dim );
- PutSize( dest, elementsize );
- max := dim-1;
- WHILE (dim > 0) DO
- DEC( dim );
- len := GetLen( src, max-dim ); PutLen( dest, dim, len );
- PutInc( dest, dim, size ); size := size * len;
- END;
- SYSTEM.NEW( data, size + ArrayAlignment);
- PutAdr( dest, Align(data) );
- PutPtr( dest, data );
- END NewData;
- BEGIN
- IF dest # 0 THEN Size := GetSize( dest ); ASSERT( Size = elementsize ); END;
- IF debug THEN KernelLog.String( "Allocate same " ); Report( "allocation source", src ); Report( "allocation des", dest ); END;
- IF dest = 0 THEN (* NIL pointer, guaranteed to be tensor *)
- dest := GetArrayDesc( GetDim( src ) );
- PutFlags(dest, {TensorFlag});
- NewData();
- RETURN TRUE;
- ELSIF GetDim( dest ) # GetDim( src ) THEN (* different dimension *)
- (* check if re-allocation of descriptor is allowed *)
- IF ~(TensorFlag IN GetFlags( dest )) &
- ~(TemporaryFlag IN GetFlags( dest )) THEN (* no, not allowed*)
- HALT( 100 );
- END;
- dest := GetArrayDesc( GetDim( src ) );
- PutFlags(dest, {TensorFlag});
- NewData();
- RETURN TRUE;
- ELSIF (GetAdr( dest ) = 0) OR ~TransposedShape( dest, src ) THEN
- (* check if re-allocation of array data is allowed *)
- IF RangeFlag IN GetFlags( dest ) THEN (* no! not allowed *)
- HALT( 100 );
- END;
- NewData();
- END;
- RETURN FALSE;
- END AllocateTransposed;
- PROCEDURE Transpose*(dest: UnsafeArray (* untraced! *); CONST left: UnsafeArrayT; Size: SIZE );
- VAR len0, len1, linc0, linc1, dinc0, dinc1: SIZE; ladr, dadr: ADDRESS; p: ANY;
- PROCEDURE CopyLoop( src, dest: ADDRESS; srcinc, destinc, len: SIZE );
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.MOVE( src, dest, Size ); INC( src, srcinc ); INC( dest, destinc );
- DEC( len );
- END;
- END CopyLoop;
- BEGIN
- IF TemporaryFlag IN GetFlags( dest ) THEN (* destination is on the stack: can optimize transposition *)
- PutAdr( dest, GetAdr( left ) ); PutPtr( dest, GetPtr( left ) );
- PutLen( dest, 1, GetLen( left, 0 ) ); PutLen( dest, 0, GetLen( left, 1 ) );
- PutInc( dest, 1, GetIncr( left, 0 ) ); PutInc( dest, 0, GetIncr( left, 1 ) );
- ELSE
- len0 := GetLen( left, 0 ); len1 := GetLen( left, 1 );
- IF AllocateTransposed(dest,left,Size) THEN Halt(AllocationForbidden,dest,0,0); END;
- IF Overlap( left, dest ) THEN (* copy data first, then transpose *)
- SYSTEM.NEW( p, len0 * len1 * Size + ArrayAlignment); dinc0 := Size; dinc1 := len0 * Size;
- dadr := Align(p); linc0 := GetIncr( left, 0 );
- linc1 := GetIncr( left, 1 ); ladr := GetAdr( left );
- WHILE (len0 > 0) DO
- CopyLoop( ladr, dadr, linc1, dinc1, len1 ); INC( ladr, linc0 );
- INC( dadr, dinc0 ); DEC( len0 );
- END;
- len0 := GetLen( left, 0 ); linc0 := Size; linc1 := len0 * Size;
- ladr := p;
- ELSE
- linc0 := GetIncr( left, 0 ); linc1 := GetIncr( left, 1 ); ladr := GetAdr( left );
- END;
- dinc0 := GetIncr( dest, 0 ); dinc1 := GetIncr( dest, 1 );
- dadr := GetAdr( dest );
- IF (Size = 4) & (transpose4 # NIL ) THEN
- transpose4( ladr, dadr, linc0, linc1, dinc0, dinc1, len0, len1 );
- ELSIF (Size = 8) & (transpose8 # NIL ) THEN
- transpose8( ladr, dadr, linc0, linc1, dinc0, dinc1, len0, len1 );
- ELSE
- WHILE (len0 > 0) DO
- CopyLoop( ladr, dadr, linc1, dinc0, len1 ); INC( ladr, linc0 );
- INC( dadr, dinc1 ); DEC( len0 );
- END;
- END;
- END;
- END Transpose;
- OPERATOR "`"*(CONST left: ARRAY [ * , * ] OF SHORTINT): ARRAY [ * , * ] OF SHORTINT;
- BEGIN
- Transpose( ADDRESSOF( RESULT ), ADDRESSOF( left ), SIZEOF( SHORTINT ) );
- RETURN RESULT
- END "`";
- OPERATOR "`"*( CONST left: ARRAY [ * , * ] OF INTEGER ):ARRAY [ * , * ] OF INTEGER ;
- BEGIN
- Transpose( ADDRESSOF( RESULT ), ADDRESSOF( left ), SIZEOF( INTEGER ) );
- RETURN RESULT
- END "`";
- OPERATOR "`"*( CONST left: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * , * ] OF LONGINT;
- BEGIN
- Transpose( ADDRESSOF( RESULT ), ADDRESSOF( left ), SIZEOF( LONGINT ) );
- RETURN RESULT
- END "`";
- OPERATOR "`"*( CONST left: ARRAY [ * , * ] OF REAL ): ARRAY [ * , * ] OF REAL;
- BEGIN
- Transpose( ADDRESSOF( RESULT ), ADDRESSOF( left ), SIZEOF( REAL ) );
- RETURN RESULT
- END "`";
- OPERATOR "`"*( CONST left: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * , * ] OF LONGREAL;
- BEGIN
- Transpose( ADDRESSOF( RESULT ), ADDRESSOF( left ), SIZEOF( LONGREAL ) );
- RETURN RESULT
- END "`";
- PROCEDURE CheckTensorGeometry( left, right, dest: ADDRESS; ldim, rdim: SIZE ): BOOLEAN;
- VAR i: SIZE;
- BEGIN
- FOR i := 0 TO rdim - 1 DO
- IF GetLen( right, i ) # GetLen( dest, i ) THEN RETURN FALSE END;
- END;
- FOR i := 0 TO ldim - 1 DO
- IF GetLen( left, i ) # GetLen( dest, rdim + i ) THEN RETURN FALSE END;
- END;
- RETURN TRUE;
- END CheckTensorGeometry;
- (*
- PROCEDURE Zero(p: ANY; size: LONGINT);
- VAR adr: LONGINT;
- BEGIN
- adr := SYSTEM.VAL(LONGINT,p);
- WHILE(size>0) DO
- SYSTEM.PUT8(adr,0); DEC(size);INC(adr);
- END;
- END Zero;
- *)
- PROCEDURE DoReshape*( VAR dest: UnsafeArrayT; CONST src: UnsafeArrayT; CONST shape: ARRAY [ * ] OF SIZE );
- VAR i, Size: SIZE;
- oldSize, newSize: SIZE; oldDim, newDim: SIZE;
- squeezingReshape: BOOLEAN;
- new: UnsafeArrayT;
- PROCEDURE CheckAlloc;
- BEGIN
- ASSERT( (dest = NIL) OR (TensorFlag IN GetFlags(dest)) & ~(RangeFlag IN GetFlags(dest)) );
- END CheckAlloc;
-
- PROCEDURE NewDescriptor(): UnsafeArrayT;
- BEGIN
- CheckAlloc;
- RETURN GetArrayDesc(newDim);
- END NewDescriptor;
- (* Added by Alexey
- Returns TRUE if the new shape is the result of squeezing (removing of singleton dimensions)
- *)
- PROCEDURE SqueezingReshape(): BOOLEAN;
- VAR
- i, j, n: SIZE;
- BEGIN
- IF oldDim > newDim THEN
- i := 0; j := 0;
- WHILE (i < oldDim) & (j < newDim) DO
- n := GetLen(src,i);
- IF n = shape[j] THEN INC(j); END;
- INC(i);
- END;
- WHILE (i < oldDim) & (GetLen(src,i) = 1) DO INC(i); END; (* account for a trailing sequence of 1 *)
- ELSE
- squeezingReshape := FALSE;
- END;
- squeezingReshape := (i = oldDim) & (j = newDim);
- RETURN squeezingReshape;
- END SqueezingReshape;
-
- (*returns TRUE if the target is already allocated coninuous memory of correct length*)
- PROCEDURE TargetContinuous(): BOOLEAN;
- VAR
- i, n: SIZE;
- continue: BOOLEAN;
- BEGIN
- i := GetDim(dest)-1; n := GetIncr(dest,i);
- continue := TRUE;
- WHILE (i > 0) & continue DO
- n := n * GetLen(dest,i);
- DEC(i);
- continue := GetIncr(dest,i) = n;
- END;
- (*TRACE(i,continue,Size,GetSize(dest));*)
- (*tod obviously size is not what I expect it to be*)
- IF (i = 0) & (n#0) & continue & (Size=GetSize(dest)) THEN (* destination array is continuous memory of the proper lenght *)
- RETURN TRUE;
- ELSE
- RETURN FALSE;
- END;
- END TargetContinuous;
- (* returns TRUE if reshape preserves contiguity pattern and thus is valid even for subranged arrays *)
- PROCEDURE PreservesContiguity(): BOOLEAN;
- VAR
- i, n: SIZE;
- continue: BOOLEAN;
- BEGIN
- i := oldDim-1; n := GetIncr(src,i);
- continue := TRUE;
- WHILE (i > 0) & continue DO
- n := n * GetLen(src,i);
- DEC(i);
- continue := GetIncr(src,i) = n;
- END;
- IF (i = 0) & continue THEN (* array can be fully linearized and, therefore, can be reshaped to any size *)
- RETURN TRUE;
- ELSE Err("Not yet implemented!");
- END;
- END PreservesContiguity;
- (* Added by Alexey *)
- PROCEDURE NewDescriptorForSameData(CONST src: UnsafeArrayT): UnsafeArrayT;
- VAR len, size, i, j: SIZE; new: UnsafeArrayT;
- BEGIN
- CheckAlloc();
- new:= GetArrayDesc( newDim );
- IF ~squeezingReshape THEN
- size := Size;
- FOR i := newDim - 1 TO 0 BY -1 DO
- len := shape[i]; PutInc( new, i, size ); PutLen( new, i, len );
- size := size * len;
- END;
- ELSE (* squeezing reshape *)
- j := 0; len := shape[j];
- FOR i := 0 TO oldDim-1 DO
- IF GetLen(src,i) = len THEN
- PutInc(new,j,GetIncr(src,i)); PutLen(new,j,len);
- INC(j);
- IF j < newDim THEN len := shape[j]; END;
- END;
- END;
- END;
- IF RangeFlag IN GetFlags(src) THEN (* keep range awareness for case of squeezing reshape and preservation of contiguity *)
- PutFlags(new,GetFlags(new)+{RangeFlag});
- END;
- PutAdr( new, GetAdr(src) );
- PutPtr( new, GetPtr(src) ); PutDim( new, newDim );
- PutSize( new, Size );
-
- RETURN new;
- END NewDescriptorForSameData;
- PROCEDURE NewData(VAR dest: UnsafeArrayT);
- VAR len, size, i: SIZE; data: ANY;
- BEGIN
- size := Size;
- FOR i := newDim - 1 TO 0 BY -1 DO
- len := shape[i]; PutInc( dest, i, size ); PutLen( dest, i, len );
- size := size * len;
- END;
- TRACE(size);
- SYSTEM.NEW( data, size + ArrayAlignment); (* Zero(data,size*Size); *)
- PutAdr( dest, Align(data) );
- PutPtr( dest, data ); PutDim( dest, newDim );
- PutSize( dest, Size );
- END NewData;
- PROCEDURE CopyData(CONST src: UnsafeArrayT; CONST dest: UnsafeArrayT);
- VAR d, s: SIZE; dadr: ADDRESS;
- PROCEDURE Loop( dim: SIZE; sadr: ADDRESS );
- VAR inc, len, i: SIZE;
- BEGIN
- IF dim = d THEN
- inc := GetIncr( src, dim ); len := GetLen( src, dim );
- FOR i := 0 TO len - 1 DO
- SYSTEM.MOVE( sadr, dadr, s ); INC( dadr, s ); INC( sadr, inc );
- END;
- ELSE
- inc := GetIncr( src, dim ); len := GetLen( src, dim ); INC( dim );
- FOR i := 0 TO len - 1 DO Loop( dim, sadr ); INC( sadr, inc ); END;
- END;
- END Loop;
- BEGIN
- s := Size; ASSERT( GetSize( src ) = s ); d := GetDim( src ) - 1;
- WHILE (d >= 0) & (GetIncr( src, d ) = s) DO
- s := s * GetLen( src, d ); DEC( d );
- END;
- IF d = -1 THEN (* special case: both continuous *)
- SYSTEM.MOVE( GetAdr( src ), GetAdr( dest ), s );
- ELSE dadr := GetAdr( dest ); Loop( 0, GetAdr( src ) );
- END;
- END CopyData;
- PROCEDURE CopyDescriptor(CONST src: UnsafeArrayT; CONST dest: UnsafeArrayT);
- BEGIN
- ASSERT( GetDim( src ) = GetDim( dest ) );
- PutPtr(dest, GetPtr(src)); (* GC ! *)
- SYSTEM.MOVE( src, dest, MathLenOffset + GetDim( src ) * 8 );
- END CopyDescriptor;
- PROCEDURE ShapeDiffers( ): BOOLEAN;
- VAR i: SIZE;
- BEGIN
- ASSERT(GetDim(dest) = newDim);
- FOR i := 0 TO newDim - 1 DO
- IF GetLen(dest,i) # shape[i] THEN RETURN TRUE END;
- END;
- RETURN FALSE;
- END ShapeDiffers;
- BEGIN
- (*
- cases
- 1.) descriptor may be replaced = dimension may vary: dest = TENSOR
- 2.) descriptor may be reshaped: dest = ARRAY but no RANGE
- 3.) descriptor may not be reshaped: dest = RANGE
- *)
- (* first check invariants *)
- oldDim := GetDim( src );
- IF oldDim = 0 THEN oldSize := 0
- ELSE
- oldSize := 1;
- FOR i := 0 TO oldDim - 1 DO oldSize := oldSize * GetLen( src, i ); END;
- END;
- newDim := LEN( shape, 0 );
- IF newDim = 0 THEN newSize := 0
- ELSE
- newSize := 1;
- FOR i := 0 TO newDim - 1 DO newSize := newSize * shape[i]; END;
- END;
- IF oldSize # newSize THEN Err( "RESHAPE: Total length mismatch" ); END;
- Size := GetSize( src );
- ASSERT( (Size > 0) & (Size < 128) ); (*! heuristic, remove upper bound *)
- IF dest = src THEN (* added by Alexey *)
- IF ~(RangeFlag IN GetFlags(dest)) OR PreservesContiguity() OR SqueezingReshape() THEN
- dest := NewDescriptorForSameData(src);
- ELSIF ((newDim = oldDim) & ~ShapeDiffers()) THEN
- (* create a copy of the original descriptor *)
- CheckAlloc();
- dest := GetArrayDesc(newDim);
- CopyDescriptor(src,dest);
- ELSE
- Err( "RESHAPE: given RANGE array can not be reshaped!" );
- END;
- ELSIF (dest = 0) THEN (* is tensor for sure *)
- dest := NewDescriptor(); NewData(dest); CopyData(src, dest);
- ELSIF (dest = temporary) THEN
- dest := NewDescriptorForSameData(src);
- ELSIF TargetContinuous() THEN
- dest := NewDescriptor(); CopyData(src, dest);
- (*todo: check if target continous memory of correct size, if so don't allocate memory*)
- ELSIF (newDim # GetDim( dest )) THEN (* must be tensor *)
- IF ~(TensorFlag IN GetFlags( dest )) THEN (* no, not allowed*)
- Err( "RESHAPE: new dimension only allowed for TENSOR" );
- END;
- dest := NewDescriptor(); NewData(dest); CopyData(src, dest);
- ELSIF ShapeDiffers() THEN (* same dim but shape of destination does not match *)
- IF RangeFlag IN GetFlags( dest ) THEN Err( "RESHAPE: new shape not allowed for RANGE" ); END;
- NewData(dest); CopyData(src, dest);
- ELSIF ~SameShape( src, dest ) THEN (* shape for destination matches but that of src is different *)
- new := NewDescriptor(); NewData(new); CopyData(src, new); CopyData(new, dest);
- ELSE (* same shape, just copy *)
- CopyContent( src, dest, Size ); RETURN;
- END;
- END DoReshape;
- (* this is memory safe: the allocation result is written to a pointer in the call chain *)
- PROCEDURE AllocateTensorA*( CONST a: ARRAY OF SIZE; elementSize: SIZE; tag: ADDRESS; VAR dest: UnsafeArray );
- VAR descr, data: ANY; same: BOOLEAN; i: SIZE; dim: SIZE;
- PROCEDURE NewData;
- VAR len, size, i: SIZE;
- BEGIN
- size := elementSize;
- FOR i := dim - 1 TO 0 BY -1 DO
- len := a[i];
- PutInc( dest, i, size ); PutLen( dest, i, len ); size := size * len;
- END;
- IF tag = 0 THEN
- SYSTEM.NEW( data, size + ArrayAlignment); (* Zero(data,size*Size); *)
- dest.adr := Align(data);
- ELSE
- Heaps.NewArr(data, tag, size DIV elementSize,1,FALSE);
- dest.adr := data + ADDRESS(ArrDataArrayOffset);
- END;
- PutPtr(dest, data);
- PutSize( dest, elementSize );
- END NewData;
- PROCEDURE ClearData;
- (*! todo *)
- END ClearData;
- BEGIN
- dim := LEN( a,0 );
- IF (dest = 0) OR (dim # GetDim( dest )) THEN
- IF dest # 0 THEN
- IF (~(TensorFlag IN GetFlags( dest ))) THEN Err( "Array's number of dimension must not be modified (no TENSOR !)" ); END;
- END;
- descr := GetArrayDesc( LEN( a,0 ) );
- dest := descr;
- NewData;
- Heaps.SetPC(data);
- ELSE
- i := 0;
- same := TRUE;
- WHILE (i < dim) & same DO
- IF GetLen( dest, i ) # a[i] THEN same := FALSE; END;
- INC( i );
- END;
- IF ~same THEN
- IF (RangeFlag IN GetFlags( dest )) THEN Err( "Array's shape must not be modified (is RANGE !) " ); END;
- NewData;
- Heaps.SetPC(data);
- ELSE ClearData
- END;
- END;
- END AllocateTensorA;
- PROCEDURE AllocateArrayA*( CONST a: ARRAY OF SIZE; elementSize: SIZE; tag: ADDRESS; dest: UnsafeArray );
- BEGIN
- AllocateTensorA(a,elementSize,tag,dest);
- IF dest.ptr # NIL THEN Heaps.SetPC(dest.ptr) END;
- END AllocateArrayA;
- PROCEDURE DoAllocateTensorX*( VAR dest: UnsafeArrayT; CONST a: ARRAY [ * ] OF SIZE; Size: SIZE; tag: ADDRESS );
- VAR data: ANY; same: BOOLEAN; i: SIZE; dim: SIZE;
- PROCEDURE NewData;
- VAR len, size: SIZE; i: SIZE;
- BEGIN
- size := Size;
- FOR i := dim - 1 TO 0 BY -1 DO
- len := a[i];
- (*
- KernelLog.Int(len,10); KernelLog.Ln;
- *)
- PutInc( dest, i, size ); PutLen( dest, i, len ); size := size * len;
- END;
- IF tag = 0 THEN
- SYSTEM.NEW( data, size + ArrayAlignment); (* Zero(data,size*Size); *)
- PutAdr( dest, Align(data) );
- ELSE
- Heaps.NewArr(data, tag, size DIV Size,1,FALSE);
- PutAdr( dest, data+ ADDRESS(ArrDataArrayOffset) );
- END;
- PutPtr( dest, data ); PutSize( dest, Size );
- END NewData;
- PROCEDURE ClearData;
- (*! todo *)
- END ClearData;
- BEGIN
- dim := LEN( a,0 );
- (*! check range flag! *)
- IF (dest = NIL) OR (dim # GetDim( dest )) THEN
- IF dest # NIL THEN
- IF (~(TensorFlag IN GetFlags( dest ))) THEN Err( "Array's number of dimension must not be modified (no TENSOR !)" ); END;
- END;
- dest := GetArrayDesc( LEN( a,0 ) );
- NewData;
- ELSE
- i := 0;
- WHILE (i < dim) & same DO
- IF GetLen( dest, i ) # a[i] THEN same := FALSE; END;
- INC( i );
- END;
- IF ~same THEN
- IF (RangeFlag IN GetFlags( dest )) THEN Err( "Array's shape must not be modified (is RANGE !) " ); END;
- NewData
- ELSE ClearData
- END;
- END;
- END DoAllocateTensorX;
-
- PROCEDURE AllocateTensorX( VAR dest: ARRAY {UNSAFE} [?] OF SIZE; CONST a: ARRAY [ * ] OF SIZE; Size: SIZE; tag: ADDRESS );
- BEGIN
- DoAllocateTensorX(dest,a,Size,tag);
- END AllocateTensorX;
-
- PROCEDURE LenA*( VAR dest: ARRAY [ * ] OF SIZE; src: ADDRESS );
- VAR dim, i: SIZE;
- BEGIN
- dim := GetDim( src );
- IF LEN( dest, 0 ) # dim THEN NEW( dest, dim ); END;
- FOR i := 0 TO dim - 1 DO dest[i] := GetLen( src, i ); END;
- END LenA;
- PROCEDURE IncrA*( VAR dest: ARRAY [ * ] OF SIZE; src: ADDRESS );
- VAR dim, len: SIZE; i: SIZE;
- BEGIN
- dim := GetDim( src ); len := LEN( dest, 0 );
- IF len # dim THEN NEW( dest, dim ); END;
- FOR i := 0 TO dim - 1 DO dest[i] := GetIncr( src, i ); END;
- END IncrA;
- PROCEDURE Len*(src: ADDRESS; d: SIZE): SIZE;
- VAR dim: SIZE;
- BEGIN
- dim := GetDim(src);
- IF (d<0) OR (d>=dim) THEN HALT(100)
- ELSE
- RETURN GetLen(src,d);
- END;
- END Len;
- PROCEDURE Incr*(src: ADDRESS; d: SIZE): SIZE;
- VAR dim: SIZE;
- BEGIN
- dim := GetDim(src);
- IF (d<0) OR (d>=dim) THEN HALT(100)
- ELSE
- RETURN GetIncr(src,d);
- END;
- END Incr;
- PROCEDURE AllocateTensor( VAR dest: UnsafeArrayT; CONST left, right: UnsafeArrayT;
- Size: SIZE );
- VAR ldim, rdim: SIZE;
- PROCEDURE NewData;
- VAR len, size, i: SIZE; data: ANY;
- BEGIN
- size := 1;
- FOR i := 0 TO ldim - 1 DO
- len := GetLen( left, i ); size := size * len; PutLen( dest, i, len );
- END;
- FOR i := 0 TO rdim - 1 DO
- len := GetLen( right, i ); size := size * len; PutLen( dest, ldim + i, len );
- END;
- SYSTEM.NEW( data, size * Size + ArrayAlignment); (* Zero(data,size*Size); *)
- (*
- KernelLog.String("adr data="); KernelLog.Int(SYSTEM.VAL(LONGINT,data),10); KernelLog.Ln;
- KernelLog.String("adr dest="); KernelLog.Int(dest,10); KernelLog.Ln;
- *)
- size := Size;
- FOR i := ldim + rdim - 1 TO 0 BY -1 DO
- PutInc( dest, i, size ); size := size * GetLen( dest, i );
- END;
- PutAdr( dest, Align(data) );
- PutPtr( dest, data );
- END NewData;
- BEGIN
- ldim := GetDim( left ); rdim := GetDim( right );
- IF dest = 0 THEN (* NIL pointer, guaranteed to be tensor *)
- dest := GetArrayDesc( ldim + rdim );
- NewData();
- ELSIF (ldim + rdim # GetDim( dest )) THEN
- IF ~(TensorFlag IN GetFlags( dest )) &
- ~(TemporaryFlag IN GetFlags( dest )) THEN (* no, not allowed*)
- HALT( 100 );
- END;
- dest := GetArrayDesc( ldim + rdim );
- NewData();
- ELSIF ~CheckTensorGeometry( left, right, dest, ldim, rdim ) THEN (* dimension matches but not geometry *)
- IF RangeFlag IN GetFlags( dest ) THEN (* no! not allowed *)
- HALT( 100 );
- END;
- NewData();
- END;
- END AllocateTensor;
- (* find the largest block with a regular pattern of the form offset+{i*linc: 0<=i<len} for two arrays simultaneously. d is dimension applying to the resulting loop *)
- PROCEDURE FindPatternTensor( left, right: ADDRESS;
- VAR rdim, len, linc, ri: SIZE );
- (* geometric precondition: lengths must coincide *)
- VAR ldim: SIZE;
- BEGIN
- ldim := GetDim( left ) - 1; rdim := GetDim( right ) - 1;
- len := GetLen( left, ldim ); ASSERT( len = GetLen( right, rdim ) );
- WHILE (len = 1) & (ldim > 0) & (rdim > 0) DO
- DEC( ldim ); DEC( rdim ); len := GetLen( left, ldim );
- ASSERT( GetLen( left, ldim ) = GetLen( right, rdim ) );
- END;
- linc := GetIncr( left, ldim ); ri := GetIncr( right, rdim ); DEC( rdim );
- DEC( ldim );
- WHILE (ldim >= 0) & (rdim >= 0) & (GetIncr( left, ldim ) = len * linc) &
- (GetIncr( right, rdim ) = len * ri) DO
- len := len * GetLen( left, ldim );
- ASSERT( GetLen( left, ldim ) = GetLen( right, rdim ) ); DEC( rdim );
- DEC( ldim );
- END;
- INC( ldim ); INC( rdim );
- IF debug THEN
- KernelLog.String( "FindPatternTensor: " ); KernelLog.Int( rdim, 10 ); KernelLog.Int( len, 10 );
- KernelLog.Int( linc, 10 ); KernelLog.Int( ri, 10 ); KernelLog.Ln;
- END;
- END FindPatternTensor;
- PROCEDURE ApplyTensorAAAOp( VAR dest: UnsafeArrayT; CONST left, right: UnsafeArrayT; elementSize: SIZE;
- Loop: BinaryASALoop );
- VAR loopd, looplen, loopri, loopdi, lDim, rDim: SIZE;
- origdest: ADDRESS;
- PROCEDURE Traverse( ladr, radr, dadr: ADDRESS; ldim, rdim: SIZE );
- VAR len: SIZE; linc, rinc, dinc: SIZE;
- BEGIN
- IF (ldim < lDim) THEN
- len := GetLen( left, ldim ); linc := GetIncr( left, ldim );
- dinc := GetIncr( dest, ldim + rdim ); INC( ldim );
- WHILE (len > 0) DO
- Traverse( ladr, radr, dadr, ldim, rdim ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- ELSIF (rdim # loopd) THEN
- len := GetLen( right, rdim ); rinc := GetIncr( right, rdim );
- dinc := GetIncr( dest, ldim + rdim ); INC( rdim );
- WHILE (len > 0) DO
- Traverse( ladr, radr, dadr, ldim, rdim ); INC( radr, rinc );
- INC( dadr, dinc ); DEC( len );
- END;
- ELSE
- (*
- KernelLog.String("MulALSLLoop"); KernelLog.Int(dadr,10); KernelLog.Int(loopdi,10); KernelLog.Int(looplen,10);
- KernelLog.Int(GetAdr(dest),10);
- KernelLog.Int(GetAdr(dest)+clen,10);
- KernelLog.Ln;
- *)
- Loop( radr, ladr, dadr, loopri, loopdi, looplen );
- (* loop over right matrix and destination highest continuous dimension D[x,y,z,..] := L[x,y] ** R[z,..] *)
- END;
- END Traverse;
- BEGIN
- (* check array lengths *)
- origdest := 0; lDim := GetDim( left ); rDim := GetDim( right );
- AllocateTensor( dest, left, right, elementSize );
- (*
- IF (dest = 0) OR (GetPtr( dest ) = 0) THEN
- p := AllocateTensor( left, right, dest, elementSize )
- ELSIF ~CheckTensorGeometry( left, right, dest, lDim, rDim ) THEN
- IF GetPtr( dest ) = -1 THEN HALT( GeometryMismatch )
- ELSE p := AllocateTensor( left, right, dest, elementSize );
- END;
- (*! to be done: treat overlapping memory *)
- END;
- *)
- (* debugging *)
- IF debug THEN Report( "AAA:left", left ); Report( "AAA:right", right ); Report( "AAA:dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPatternTensor( dest, right, loopd, looplen, loopri, loopdi );
- (* run through dimensions *)
- Traverse( GetAdr( left ), GetAdr( right ), GetAdr( dest ), 0, 0 );
- END ApplyTensorAAAOp;
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- BEGIN
- ApplyTensorAAAOp( RESULT, left, right,
- SIZEOF( SHORTINT ), MulASSSLoop );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyTensorAAAOp( RESULT, left, right,
- SIZEOF( INTEGER ), MulAISILoop );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY {UNSAFE} [?] OF LONGINT;
- BEGIN
- ApplyTensorAAAOp( RESULT, left, right,
- SIZEOF( LONGINT ), MulALSLLoop );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF REAL): ARRAY {UNSAFE} [?] OF REAL;
- BEGIN
- ApplyTensorAAAOp( RESULT, left, right, SIZEOF( REAL ),
- loopMulARSR );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY {UNSAFE} [?] OF LONGREAL;
- BEGIN
- ApplyTensorAAAOp( RESULT, left, right,
- SIZEOF( LONGREAL ), loopMulAXSX );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF COMPLEX): ARRAY {UNSAFE} [?] OF COMPLEX;
- BEGIN
- ApplyTensorAAAOp( RESULT, left, right, SIZEOF( COMPLEX ),
- loopMulAZSZ );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF LONGCOMPLEX): ARRAY {UNSAFE} [?] OF LONGCOMPLEX;
- BEGIN
- ApplyTensorAAAOp( RESULT, left, right, SIZEOF( LONGCOMPLEX ),
- loopMulALZSLZ );
- RETURN RESULT
- END "**";
- PROCEDURE InitOptimization;
- VAR p: PROCEDURE;
- BEGIN
- GETPROCEDURE("FoxArrayBaseOptimized","Install",p);
- IF p # NIL THEN
- p;
- ELSE
- KernelLog.String( "Warning: ArrayBase runtime library optimizer not installed." ); KernelLog.Ln;
- END;
- END InitOptimization;
- (* functionality used for index designators of including a questiomark such as A[x,*,?,*,x] *)
- PROCEDURE CopyDescriptor*(VAR dest: UnsafeArrayT; CONST src: UnsafeArrayT; prefixIndices, prefixRanges, suffixIndices, suffixRanges: SIZE);
- VAR srcDim, destDim,i,len,incr: SIZE;
- BEGIN
- IF src = 0 THEN
- HALT(100);
- ELSE
- srcDim := GetDim(src);
- destDim := srcDim - prefixIndices - suffixIndices;
-
- (*
- KernelLog.String("srcDim "); KernelLog.Int(srcDim,1); KernelLog.Ln;
- KernelLog.String("prefixIndices "); KernelLog.Int(prefixIndices,1); KernelLog.Ln;
- KernelLog.String("prefixRanges "); KernelLog.Int(prefixRanges,1); KernelLog.Ln;
- KernelLog.String("suffixIndices "); KernelLog.Int(suffixIndices,1); KernelLog.Ln;
- KernelLog.String("suffixRanges "); KernelLog.Int(suffixRanges,1); KernelLog.Ln;
- KernelLog.String("destDim "); KernelLog.Int(destDim,1); KernelLog.Ln;
- *)
- dest := GetArrayDesc(destDim); (* destination dimension included *)
- (* SYSTEM.MOVE(src,dest,MathLenOffset); *)
- PutAdr(dest,GetAdr(src));
- PutPtr(dest,GetPtr(src));
- PutFlags(dest,GetFlags(src));
- PutSize(dest,GetSize(src));
- FOR i := 0 TO srcDim-suffixIndices-suffixRanges-prefixIndices-prefixRanges-1 DO
- srcDim := i + prefixIndices + prefixRanges;
- destDim := i + prefixRanges;
- len := GetLen(src,srcDim);
- incr := GetIncr(src,srcDim);
- PutLen(dest,destDim,len);
- PutInc(dest,destDim,incr);
- END;
- (*
- Report("copy descriptor src",src);
- Report("copy descriptor dest",dest);
- *)
- END;
- END CopyDescriptor;
- (* when Reshape is called by a compiler, the arguments are - for the compiler - replaced as follows, this makes them compatible
- VAR dest: ARRAY [?] OF basetype
- CONST src: ARRAY [?] OF basetype
- CONST shape: ARRAY [*] OF LONGINT
- *)
- PROCEDURE Reshape*(CONST left: ARRAY [?]; CONST right: ARRAY [*] OF SIZE): ARRAY {UNSAFE} [?];
- BEGIN
- DoReshape(RESULT, left, right);
- RETURN RESULT
- END Reshape;
- (* OLIVIER *)
- (** creates a degenerated range from an integer.
- - makes it possible to convert the result of an integer-valued procedure F() into a range
- without executing the procedure twice as it would happen in "(F() .. F() BY 1)"
- **)
- PROCEDURE RangeFromInteger*(CONST integer: SIZE): RANGE;
- BEGIN RETURN (integer .. integer BY 1)
- END RangeFromInteger;
- (* OLIVIER *)
- (** create an array with the same data but with more dimensions
- - each element in the array 'keptDimensions' corresponds to a dimension in the resulting array
- - if element = TRUE: use a dimension from the source array, i.e. reuse length and increment
- - if element = FALSE: insert a new dimension having length = 1 and increment = 0
- e.g.:
- ExpandDimensions(array, [FALSE, TRUE, FALSE, FALSE, TRUE])
- performs the following type transformation:
- ARRAY [10, 20] OF REAL -> ARRAY [1, 10, 1, 1, 20] OF REAL
- **)
- PROCEDURE ExpandDimensions*(CONST sourceArray: ARRAY [?]; CONST keptDimensions: ARRAY [*] OF BOOLEAN): ARRAY [?];
- VAR
- targetDimensionality, sourceIndex, targetIndex: SIZE;
- sourceADDRESS, targetADDRESS: ADDRESS;
- targetArrayDescriptor: ANY;
- BEGIN
- sourceADDRESS := SYSTEM.VAL(ADDRESS, sourceArray);
- targetDimensionality := LEN(keptDimensions, 0);
- targetArrayDescriptor := GetArrayDesc(targetDimensionality); (* create a new array descriptor *)
- SYSTEM.PUT(ADDRESSOF(RESULT), targetArrayDescriptor);
- targetADDRESS := SYSTEM.VAL(ADDRESS, RESULT);
- PutAdr(targetADDRESS, GetAdr(sourceADDRESS));
- PutPtr(targetADDRESS, GetPtr(sourceADDRESS));
- PutFlags(targetADDRESS, {TensorFlag});
- PutSize(targetADDRESS, GetSize(sourceADDRESS));
- (* set increments and lengths *)
- sourceIndex := 0;
- FOR targetIndex := 0 TO targetDimensionality - 1 DO
- IF keptDimensions[targetIndex] THEN
- (* reuse length and increment from source array *)
- ASSERT(sourceIndex < DIM(sourceArray));
- PutLen(targetADDRESS, targetIndex, GetLen(sourceADDRESS, sourceIndex));
- PutInc(targetADDRESS, targetIndex, GetIncr(sourceADDRESS, sourceIndex));
- INC(sourceIndex)
- ELSE
- (* set length = 1 and increment = 0 *)
- PutLen(targetADDRESS, targetIndex, 1);
- PutInc(targetADDRESS, targetIndex, 0);
- END
- END;
- (* Report("expand dimensions: ", targetADDRESS); *)
- RETURN RESULT
- END ExpandDimensions;
- (* index ranges *)
- (* the length of a range, i.e. the number of indices that it stands for *)
- OPERATOR "LEN"*(CONST range: RANGE): SIZE;
- VAR
- temp, result: SIZE;
- BEGIN
- IF (LAST(range) < FIRST(range)) OR (FIRST(range) < 0) OR (STEP(range) < 1) THEN
- (* invalid range *)
- result := 0
- ELSIF LAST(range) = MAX(LONGINT) THEN
- (* open-ended range *)
- result := MAX(LONGINT)
- ELSE
- temp := 1 + LAST(range) - FIRST(range);
- result := temp DIV STEP(range);
- IF (temp MOD STEP(range)) # 0 THEN
- INC(result)
- END
- END;
- RETURN result
- END "LEN";
-
- OPERATOR "ALL"*(CONST x: ARRAY {UNSAFE} [?] OF SHORTINT; op: PROCEDURE(x: SHORTINT): SHORTINT): ARRAY {UNSAFE} [?] OF SHORTINT;
- BEGIN
- ApplyGenericUnaryAAOpS(RESULT, x, SIZEOF(SHORTINT),GenericLoopS,op);
- RETURN RESULT;
- END "ALL";
- OPERATOR "ALL"*(CONST x: ARRAY {UNSAFE} [?] OF INTEGER; op: PROCEDURE(x: INTEGER): INTEGER): ARRAY {UNSAFE} [?] OF INTEGER;
- BEGIN
- ApplyGenericUnaryAAOpI(RESULT,x,SIZEOF(INTEGER),GenericLoopI,op);
- RETURN RESULT;
- END "ALL";
-
- OPERATOR "ALL"*(CONST x: ARRAY {UNSAFE} [?] OF LONGINT; op: PROCEDURE(x: LONGINT): LONGINT): ARRAY {UNSAFE} [?] OF LONGINT;
- BEGIN
- ApplyGenericUnaryAAOpL(RESULT,x,SIZEOF(LONGINT),GenericLoopL,op);
- RETURN RESULT;
- END "ALL";
-
- OPERATOR "ALL"*(CONST x: ARRAY {UNSAFE} [?] OF HUGEINT; op: PROCEDURE(x: HUGEINT): HUGEINT): ARRAY {UNSAFE} [?] OF HUGEINT; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpH(RESULT,x,SIZEOF(HUGEINT),GenericLoopH,op);
- RETURN RESULT;
- END "ALL";
- OPERATOR "ALL"*(CONST x: ARRAY {UNSAFE} [?] OF REAL; op: PROCEDURE(x: REAL): REAL): ARRAY {UNSAFE} [?] OF REAL; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpR(RESULT,x,SIZEOF(REAL),GenericLoopR,op);
- RETURN RESULT;
- END "ALL";
- OPERATOR "ALL"*(CONST x: ARRAY {UNSAFE} [?] OF LONGREAL; op: PROCEDURE(x: LONGREAL): LONGREAL): ARRAY{UNSAFE} [?] OF LONGREAL; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpX(RESULT,x,SIZEOF(LONGREAL),GenericLoopX,op);
- RETURN RESULT;
- END "ALL";
-
- OPERATOR "ALL"*(CONST x: ARRAY {UNSAFE} [?] OF COMPLEX; op: PROCEDURE(x: COMPLEX): COMPLEX): ARRAY {UNSAFE} [?] OF COMPLEX; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpZ(RESULT,x,SIZEOF(COMPLEX),GenericLoopZ,op);
- RETURN RESULT;
- END "ALL";
- OPERATOR "ALL"*(CONST x: ARRAY {UNSAFE} [?] OF LONGCOMPLEX; op: PROCEDURE(x: LONGCOMPLEX): LONGCOMPLEX): ARRAY {UNSAFE} [?] OF LONGCOMPLEX; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpLZ(RESULT,x,SIZEOF(LONGCOMPLEX),GenericLoopLZ,op);
- RETURN RESULT;
- END "ALL";
- BEGIN
- alloc := 0; NEW(temporary);
- PutFlags(temporary,{TensorFlag});
- PutDim(temporary, 0);
- SetDefaults(); InitOptimization(); (* CreateTypePool; *)
- END FoxArrayBase.
- Compiler.Compile FoxArrayBase.Mod ~
- System.ListModules
- System.FreeDownTo FoxArrayBase ~
|